Интеграл методом трапеций - C (СИ)
Формулировка задачи:
Программа считает интеграл методом трапеций. Почему то, если задать, например, функцию y = x , и посчитать на отрезке -0,1234 до 0,1234 и наоборот: от 0,1234 до -0,1234 то погрешность разная и интеграл не равен 0. Можно конечно для второго случая поменять значения друг на друга, но надо понять почему так.
#include "function.h"
double Integral (double (*f)(double), double, double, int);
int main(){
double a,b;
int n;
double (*f)(double);
printf ("Vvedite a\n");
scanf ("%lf", &a);
printf ("Vvedite b\n");
scanf ("%lf", &b);
printf ("Vvedite n - koli4estvo razbienii otrezka\n");
scanf ("%d", &n);
f = fun;
printf ("Integral raven %.15lf\n", Integral (f, a, b, n));
return 0;
}
double Integral (double (*f)(double), double a, double b, int n){
double result = 0.0;
double delta;
delta = (b - a) / (double) n;
int i;
result += (f(a) + f(b)) * delta / 2;
for (i = 1; i < n; ++i){
result += f(a + i * delta) * delta;
}
return result;
}#include "function.h"
double fun(double x){
return x;
}Решение задачи: «Интеграл методом трапеций»
textual
Листинг программы
double Integral (double (*f)(double), double a, double b, int n)
{
double result, left, right, delta;
for (result=0.0, left=a, delta=(b-a)/(double)n, right=left+delta; right<=b; left=right; right+=delta)
{
result+=(f(left)+f(right))*delta/2.0;
}
return r;
}
Объяснение кода листинга программы
В данном коде реализован алгоритм вычисления интеграла методом трапеций.
- Передаются входные параметры функции:
- f: адрес функции, которую необходимо интегрировать (тип double (*f)(double)).
- a: нижняя граница интегрирования (тип double).
- b: верхняя граница интегрирования (тип double).
- n: количество трапеций, на которые разбивается интервал интегрирования (тип int).
- Создаются следующие переменные:
- result: переменная для хранения результата интегрирования (тип double).
- left, right: переменные для хранения левой и правой границ текущей трапеции (тип double).
- delta: шаг сетки, равный (b-a)/n (тип double).
- Задается начальное значение result=0.0.
- Запускается цикл, выполняющийся до тех пор, пока правая граница текущей трапеции не станет больше b.
- Внутри цикла к result прибавляется произведение f(left)+f(right))*delta/2.0.
- После каждой итерации значения left и right инкрементируются на delta.
- По завершении цикла возвращается значение result.