Интеграл методом трапеций - 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;
}

Объяснение кода листинга программы

В данном коде реализован алгоритм вычисления интеграла методом трапеций.

  1. Передаются входные параметры функции:
    • f: адрес функции, которую необходимо интегрировать (тип double (*f)(double)).
    • a: нижняя граница интегрирования (тип double).
    • b: верхняя граница интегрирования (тип double).
    • n: количество трапеций, на которые разбивается интервал интегрирования (тип int).
  2. Создаются следующие переменные:
    • result: переменная для хранения результата интегрирования (тип double).
    • left, right: переменные для хранения левой и правой границ текущей трапеции (тип double).
    • delta: шаг сетки, равный (b-a)/n (тип double).
  3. Задается начальное значение result=0.0.
  4. Запускается цикл, выполняющийся до тех пор, пока правая граница текущей трапеции не станет больше b.
    • Внутри цикла к result прибавляется произведение f(left)+f(right))*delta/2.0.
    • После каждой итерации значения left и right инкрементируются на delta.
  5. По завершении цикла возвращается значение result.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы