Дан двумерный массив [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;
C/C++
Интеграл C++ метод Симпсона
Какой "двумерный массив"? Зачем он нужен? Есть функция у=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 даже невзирая на грубый шаг равномерного разбиения участка интегрирования (в приведённом примере он окажется равным единице). А с чётным количеством узловых значений Вы как вообще намереваетесь проинтегрировать функцию по Симпсону?
#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 даже невзирая на грубый шаг равномерного разбиения участка интегрирования (в приведённом примере он окажется равным единице). А с чётным количеством узловых значений Вы как вообще намереваетесь проинтегрировать функцию по Симпсону?
Александр Сокольских
В этом и суть, что надо сделать через массивы. Там вообще этот массив читается как файл из 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
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
Похожие вопросы
- Передача в метод класса указателя на функцию C++
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Задача на C++ (Остатки).
- Сделать перестановку чисел с помощью функции в C++, но у меня получается чепуха
- Задача по c++ на векторы. Часть программы написана. Нужны правки.
- Проблема с указателем в C++