Вычисление интеграла с помощью метода трапеций на компьютере

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ
КУРСОВАЯ РАБОТА
тема:
«Вычисление определённого интеграла
с помощью метода трапеций
на компьютере»
Выполнил:
студент ф-та
ЭОУС-1-12
Зыков И.
Принял:
Зоткин С. П.
Москва 2001
1. Введение:
Определенный интеграл от функции, имеющей неэлементарную первообразную, можно
вычислить с помощью той или инойприближенной формулы. Для решения этой задачи на
компьютере, можно воспользоваться формулами прямоугольников, трапеций или
формулой Симпсона. В данной работе рассматривается формула трапеций.
Пусть I=? f(x)dx, где f(x) – непрерывная функция, которую мы для наглядности будем
предполагатьположительной. Тогда I представит собой площадь криволинейной
трапеции, ограниченной линиями x=a, x=b, y=0, y=f(x). Выберем какое-нибудь
натуральноечисло n и разложим отрезок [a,b] на n равных отрезков при помощи точек
x0=abr> на n полосок. Примем каждую из этих полосок за обыкновенную прямолинейную
трапецию (рис. 1, где n=4).
рис. 1
Тогда площадь первой слева полоски будет приближенно выражаться числом
((f(x0)+f(x1))/2)*(x1-x0)=((y0+y1)/2)*((b-a)/n),
ибо основания трапеции, за которую мы принимаем полоску, равны f(x0)=y0и f(x1)=y1, а
высота её
x1-x0=(b-a)/n.
Аналогично площади дальнейших полосок выразятся числами
(y1+y2)*((b-a)/2*n), (y2+y3)*((b-a)/2*n),… , (yn-1+yn)*((b-a)/2*n).
Значит, для нашего интеграла получается формула
I?((b-a)/2*n)*[y0+2*(y1+…+yn-1)+yn].
Пологая для краткости y0+yn=Yкр(крайние), y1+y2+…+yn-1=Yпром (промежуточные),
получим
? ydx ? ((b-a)/2* n)*(Yкр+2*Yпром)
Эту формулу можно записать в другом виде
? f(x)dx ? (h/2)*[f(a)+f(b)+2?f(xi)]
(где h – длина одного из n равных отрезков, xi=a+i*h). Эта приближенная формула и
называется формулой трапеций. Онаоказывается тем более точной, чем больше взятое
нами число n. Погрешность одного шагавычисляется по формуле: -(h^3)/12.
Задача. Пусть нужно проинтегрировать функцию f(x) = xі+2xІ-3x-8 на отрезке [0, 6].
На этом отрезке функция непрерывна.
Для выполнения поставленной задачи составлена нижеописанная программа,
приближенновычисляющая определенный интеграл с помощью метода трапеций.
Программа состоит из трех функций main, f и trap. Функция main позволяет ввести
интервалыинтегрирования и задать точность вычисления интеграла, а также вызывает
функцию trap для вычисления интеграла и распечатывает на экране результат. Функция f
принимает аргумент x типа float и возвращает значение интегрируемойфункции в этой
точке. Trap – основная функция программы: она выполняет все вычисления, связанные с
нахождением определенного интеграла. Trap принимает четыре параметра:
пределыинтегрирования типа float (a и b), допустимую относительную ошибку типа float и
указатель на интегрируемуюфункцию. Вычисления выполняются до тех пор, пока
относительная ошибка, вычисляемая по формуле S-Sn , не будет меньше или равна
требуемой. Функция реализована сэкономией вычислений, т. е. учитывается, что S0
постоянная и S1=S1+f(a+(2*i+1)*h), поэтому эти значения вычисляются единожды. Метод
трапеций обладает высокой скоростью вычисления, но меньшейточностью, чем метод
Симпсона, поэтому его применение удобно там, где не требуется очень высокая точность.
Ниже предлагается блок-схема, листинг, спецификации, ручной счет и результат
работы программы на примере поставленной вышезадачи. Блок-схема позволяет
отследить и понять особенности алгоритма программы, спецификации дают
представление о назначениикаждой переменной в основной функции trap, листинг -
исходный код работающей программы скомментариями, а ручной счет предоставляет
возможность проанализировать результаты выполнения программы.
2. Блок-схема программы:
ДА
НЕТ
i=1
S1
=S
1+f
(a+
(2*i
+1)
*h)
i=n/2
3. Листинг:
#include
main()
{
double a,b,er,eps,f(double),s,trap(double,double,double,double(*)(double));
clrscr();
printf("\n Задайте пределы интегрирования и точность: ");
scanf ("%lf%lf%lf",&a,&b,&eps);
s=trap(a,b,eps,f);
printf("\n Интеграл от a=%3.2lf до b=%3.2lf равен %lf",a,b,s);
getch();
}
double f(double x)
{
return x*x*x+2*(x*x)-3*x-8;
}
double trap(double a,double b,double eps,double(*f)(double))
{
double h,s,s0,s1,sn;
int i,n;
s=1; sn=101;
n=4;
s0=(f(a)+f(b))/2;
s1=f((a+b)/2);
while(fabs(s-sn)>eps){
sn=s;
h=(b-a)/n;
for(i=0; i s1+=f(a+(2*i+1)*h);
s=h*(s0+s1);
n*=2;
}
return s;
}
4. Спецификации:
Имя
переменной
Тип
Назначение
n
int
число разбиений отрезка [a, b]
i
int
счетчик циклов
a
double
Нижний предел интегрирования
b
double
Верхний предел интегрирования
h
double
шаг разбиения отрезка
eps
double
допустимая относительная ошибка
f
double(*)ук
азатель на
интегрируе
мую фун -
цию
x
double
аргумент ф-ии f
s
double
текущий результат интегрирования
s0
double
половина суммы значений функции в
точках a и b
s1
double
сумма значений функции в промежуточных
точках
sn
double
предыдущий результат интегрирования
5. Ручной счет:
Xi
Yi
0
-8
0,75
-8,703125
1,5
-4,625
2,25
6,765625
3
28
3,75
61,609375
4,5
110,125
5,25
176,078125
6
262
6. Результат работы программы:
при eps = 0.1 при eps = 0.001