public static double Integrate(this Function f, double a, double b, double delta) { if (Math.Sign(delta) != Math.Sign(b - a)) delta *= -1; double sum = 0; int i = 0; for (double x = a; x < b; x += delta) { if (x + delta > b) { sum += (b - x) * f.Calc(x); break; } sum += delta * f.Calc(x); ++i; } return sum; }
public static double SimpsonIntegrate(this Function f, double a, double b, double delta) { if (Math.Sign(delta) != Math.Sign(b - a)) delta *= -1; int n = (int) ((b - a) / delta); double h = (b - a) / n; double sum = 0; sum = f.Calc(a); for (int i = 1; i <= n; i += 2) { double x = a + h * i; sum += 4 * f.Calc(x); } for (int i = 2; i <= n - 1; i += 2) { double x = a + h * i; sum += 2 * f.Calc(x); } sum += f.Calc(b); /*int i = 0; for (double x = a; x < b; x += delta) { if (x + delta > b) { delta = b - a; } sum += delta * (f.Calc(x) + 4 * f.Calc((2 * x + delta) / 2) + f.Calc(x + delta)); ++i; } sum /= 6;*/ return h * sum / 3; }