C/C++

Интеграл C++ метод Симпсона

Дан двумерный массив [1, 2, 3, ... , 12][1, 4, 9, ... , 144]. Это график целые значения параболы y = x^2. Как найти интеграл методом Симпсона в этом случае?
Методом трапеций получается следующее
double sum_trap = 0;

for (i = 0; i < count - 1; i++)

{

sum_trap += ((arr[i][1] + arr[i + 1][1]) / 2) * (arr[i + 1][0] - arr[i][0]);

}

cout << "sum_trap = " << sum_trap << endl;
Какой "двумерный массив"? Зачем он нужен? Есть функция у=x², так берите её да интегрируйте как хотите! Задавайте только левый и правый пределы интегрирования и количество равномерных интервалов (или количество равноотстоящих друг от друга узлов), например, как-нибудь так:
#include <iostream>
using namespace std;
double Simpson(double (*f)(double),
double a, double b, double n)
{ double shag = (b - a) / n,
polshaga = shag / 2, i, x, u = f(b - polshaga),
v = 0; for (i = 1; i < n; i++) { x = a + i * shag;
u += f(x - polshaga); v += f(x); } return
(f(a) + f(b) + 4 * u + 2 * v) * shag / 6; }
double y(double x) { return x * x; }
int main() { double a, b, n; cout.precision(16);
while (true) { cout << "a b n: "; cin >> a >> b
>> n; cout << Simpson(y, a, b, n) << endl; } }
Просто запускаете программу, вводите данные (например, a, b, n: 1, 12, 11) и получаете весьма точный ответ 575.6666666666666 даже невзирая на грубый шаг равномерного разбиения участка интегрирования (в приведённом примере он окажется равным единице). А с чётным количеством узловых значений Вы как вообще намереваетесь проинтегрировать функцию по Симпсону?
Дмитрий Томаев
Дмитрий Томаев
66 572
Лучший ответ
Александр Сокольских В этом и суть, что надо сделать через массивы. Там вообще этот массив читается как файл из csv таблицы, мне не нужно таким способом
У меня на гите есть пример реализованного метода симпсона
type function<type>::integralS2(int x1, int x2) const для чётного и
type function<type>::integralS1(int x1, int x2) нечётного разбиения на отрезки.
int x1, int x2 - это точки массива, от чего и до чего интегрируем.
В вашем случем можно сделать x[i] = arr[i][0]; и f[i] = arr[i][1] перед вычислениями интеграла и будет нормас считать

https://github.com/kisskaDevi/math/blob/main/kisskaMath/function.h