// cos(x/2) ^ 2 // (1/2)*(x+sin(x)) // // private void integrate() { double a = double.Parse(intervalA.Text); double b = double.Parse(intervalB.Text); double eps = double.Parse(epsilon.Text); if (eps >= 1 || eps < 0) { throw new Exception("Epsilon must me between 0 and 1"); } double exactValue = MyParser.calculate(original.Text, b) - MyParser.calculate(original.Text, a); _dummyCollection.Clear(); foreach (NumericalIntegration method in methods) { KeyValuePair <double, int> res = method.CalculateIntegral(a, b, eps, function.Text); double error = Math.Abs(res.Key - exactValue); _dummyCollection.Add(new IntegrateResult { Method = method.ToString(), Value = res.Key, Intervals = res.Value, Error = string.Format("{0:0.########}", error) }); } _dummyCollection.Add(new IntegrateResult { Method = "Exact value", Value = exactValue }); dataGrid1.ItemsSource = _dummyCollection; }
protected override double Calculate(double a, double b, int n, string integral) { double res = 0; double A = (b - a) / 2; double B = (b + a) / 2; double[] x = GaussLegendre.arr[25].x; double[] w = GaussLegendre.arr[25].w; for (int i = 0; i < GaussLegendre.arr.Length; i++) { if (GaussLegendre.arr[i].n == n) { x = GaussLegendre.arr[i].x; w = GaussLegendre.arr[i].w; } } if (n % 2 == 1) { res = w[0] * MyParser.calculate(integral, B); for (int i = 1; i < x.Length; i++) { res += w[i] * (MyParser.calculate(integral, B + A * x[i]) + MyParser.calculate(integral, B - A * x[i])); } } else { for (int i = 0; i < x.Length; i++) { res += w[i] * (MyParser.calculate(integral, B + A * x[i]) + MyParser.calculate(integral, B - A * x[i])); } } return(A * res); }
protected override double Calculate(double a, double b, int n, string integral) { double res = 0; double h = (b - a) / n; for (int i = 1; i <= n; ++i) { res += MyParser.calculate(integral, (a + i * h)); } res *= h; return(res); }
protected override double Calculate(double a, double b, int n, string integral) { double res = 0; double h = (b - a) / n; bool even = false; for (int i = 1; i < n; ++i) { res += (even ? 2 : 4) * MyParser.calculate(integral, (a + i * h)); even = !even; } res += MyParser.calculate(integral, a) + MyParser.calculate(integral, b); res *= h / 3; return(res); }
//public override KeyValuePair<double, int> CalculateIntegral(double a, double b, double eps, string integral) //{ // int n = 3; // double i1 = Calculate(a, b, n, integral); // double i2 = 0; // int k = 2; // do // { // i2 = 0; // for (int i = 0; i < k; i++) // { // i2 += Calculate(a + i * (b - a) / k, a + (i + 1) * (b - a) / k, n, integral); // } // double tmp = i2; // i2 = i1; // i1 = tmp; // k++; // } while (Math.Abs(i1 - i2) >= eps); // return new KeyValuePair<double, int>(i1, k); //} protected override double Calculate(double a, double b, int n, string integral) { if (n == 8 || n > 9) { n = 9; } double res = 0; double A = (b - a) / 2; double B = (b + a) / 2; double[] x = ChebyshevCoefs.arr[7].x; for (int i = 0; i < ChebyshevCoefs.arr.Length; i++) { if (ChebyshevCoefs.arr[i].n == n) { x = ChebyshevCoefs.arr[i].x; } } for (int i = 0; i < x.Length; i++) { res += MyParser.calculate(integral, A * x[i] + B); } return(2 * res * A / n); }