Реферат: Вычисление интеграла с помощью метода трапеций на компьютере
МОСКОВСКИЙГОСУДАРСТВЕННЫЙ СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ
КУРСОВАЯРАБОТАтема:
«Вычислениеопределённого интеграла
спомощью метода трапеций
накомпьютере»
Выполнил:
студентф-та
ЭОУС-1-12
ЗыковИ.
Принял:
ЗоткинС. П.
Москва 2001
1. Введение:
Определенный интеграл от функции,имеющей неэлементарную первообразную, можно вычислить с помощью той или инойприближенной формулы. Для решения этой задачи на компьютере, можновоспользоваться формулами прямоугольников, трапеций или формулой Симпсона. В данной работе рассматривается формула трапеций.
Пусть I=òf(x)dx, где f(x) – непрерывная функция, которую мыдля наглядности будем предполагать положительной. Тогда I представит собой площадь криволинейной трапеции,ограниченной линиями x=a, x=b,y=0, y=f(x). Выберем какое-нибудь натуральноечисло n и разложим отрезок [a,b] на n равных отрезков при помощи точек x=a<x1<…<xn=b. Прямые x=xiразбивают интересующую нас криволинейную трапецию на nполосок. Примем каждую из этих полосок за обыкновенную прямолинейнуютрапецию (рис. 1, где n=4).
/>
рис. 1
Тогда площадь первой слева полоскибудет приближенно выражаться числом
((f(x)+f(x1))/2)*(x1-x)=((y+y1)/2)*((b-a)/n),
ибо основания трапеции, за которуюмы принимаем полоску, равны f(x)=yи f(x1)=y1,а высота её
x1-x=(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)*[y+2*(y1+…+yn-1)+yn].
Пологая для краткости y+yn=Yкр (крайние), y1+y2+…+yn-1=Yпром (промежуточные), получим
/> <td/>ò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 |, не будет меньше или равнатребуемой. Функция реализована с экономией вычислений, т. е. учитывается, что Sпостоянная и S1=S1+f(a+(2*i+1)*h), поэтому эти значения вычисляются единожды. Метод трапеций обладает высокой скоростью вычисления, но меньшейточностью, чем метод Симпсона, поэтому его применение удобно там,где не требуется очень высокая точность.
Ниже предлагается блок-схема, листинг, спецификации, ручной счет ирезультат работы программына примере поставленной выше задачи. Блок-схема позволяет отследить и понятьособенности алгоритма программы, спецификации дают представление о назначениикаждой переменной в основной функции trap, листинг - исходный код работающей программы с комментариями, а ручной счет предоставляет возможность проанализировать результатывыполнения программы.
2. Блок-схема программы:
/>
/>
ДА
/> /> /> /> /> /> /> /> /> />НЕТ
/> /> /> /> /> /> /> /> /> />
i=1
S1=S1+f(a+(2*i+1)*h)
/> i=n/2
/>
/>
3. Листинг:
#include<stdio.h>
#include<math.h>
#include<conio.h>
main()
{
doublea,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)
{
returnx*x*x+2*(x*x)-3*x-8;
}
double trap(doublea,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<n/2; 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 аргумент ф-ии fs
double текущий результат интегрированияs0
double половина суммы значений функции в точках a и bs1
double сумма значений функции в промежуточных точкахsn
double предыдущий результат интегрирования5. Ручной счет:
Xi
Yi
-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
/> /> /> /> /> /> /> <td/> /> /> /> /> /> /> /> />6. Результат работыпрограммы:
приeps =0.1 при eps = 0.001
/>/>/>/>/>/>
Введите a, b,eps: Введите a, b, eps:
0 0
6 6
.1 .001
Интеграл=366.024170 Интеграл= 366.000094
/>/> т.е с помощью этойпрограммы можно вычислить интеграл от функции с точностью до 1/10000.