Интеграл методом трапеций - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д