Материалы сайта
Это интересно
Лабораторные работы по вычислительной математике
ЛАБОРАТОРНАЯ РАБОТА №12 «Численное интегрирование ». Студента группы ПВ-22 Малютина Максима. Задание. Различными способами вычислить приближенно значение определенного интеграла. Известно, что определенный интеграл функции [pic] типа [pic] численно представляет собой площадь криволинейной трапеции ограниченной кривыми x=0, y=a, y=b и y=[pic] (Рис. 1). Есть два метода вычисления этой площади или определенного интеграла — метод трапеций (Рис. 2) и метод средних прямоугольников (Рис. 3). [pic] Рис. 1. Криволинейная трапеция. [pic] Рис. 2. Метод трапеций. [pic] Рис. 3. Метод средних прямоугольников. По методам трапеций и средних прямоугольников соответственно интеграл равен сумме площадей прямоугольных трапеций, где основание трапеции какая- либо малая величина (точность), и сумма площадей прямоугольников, где основание прямоугольника какая-либо малая величина (точность), а высота определяется по точке пересечения верхнего основания прямоугольника, которое график функции должен пересекать в середине. Соответственно получаем формулы площадей — для метода трапеций: [pic], для метода средних прямоугольников: [pic]. Однако существуют еще несколько методов нахождения приближенного значения определенного интеграла. Остановимся поподробнее на формуле Симпсона и т.н. формуле «трех восьмых». Формула Симпсона: Формула «трех восьмых»: Число разбиений n должно быть кратно трем. Экстраполяция по Ричардсону. Пусть In1 и In2 – два приближеных значения интуграла, найденные по одной и той же формуле при n1 и n2 (n2>n1). Тогда более точное значение этого интеграла можно найти по формуле: ,где m – порядок остаточного члена (для формулы трапеций m=2, для формулы Симпсона m=4) Соответственно этим формулам и составим алгоритм. Листинг программы. program Integral; uses Crt, Dos; function Fx(x:real):real; begin fx:=(1+0.9*x*x)/(1.3+sqrt(0.5*x*x+1)) {В этом месте запишите функцию, для вычисления интеграла.} end; Function Yi(x,h:real;i:LongInt):real; begin Yi:=fx(x+i*h) end; Function CountBar(x1,x2,h:real):real; var xx1,xx2:real; c:longint; i:real; begin writeln('-->Метод средних прямоугольников.'); i:=0; for c:=1 to round(abs(x2-x1)/h) do begin write('Итерация ',c,chr(13)); xx1:=Fx(x1+c*h); xx2:=Fx(x1+c*h+h); i:=i+abs(xx1+xx2)/2*h end; writeln('------------------------------------------------'); CountBar:=i end; Function CountTrap(x1,x2,h:real):real; var xx1,xx2,xx3:real; c:longint; i:real; begin writeln('--> Метод трапеций.'); i:=0; for c:=1 to round(abs(x2-x1)/h) do begin write('Итерация ',c,chr(13)); xx1:=Fx(x1+c*h); xx2:=Fx(x1+c*h+h); if xx2>xx1 then xx3:=xx1 else xx3:=xx2; i:=i+abs(xx2-xx1)*h+abs(xx3)*h end; writeln('------------------------------------------------'); CountTrap:=i end; Function CountSimpson(x1,x2,h:real):real; var i:real; j,n:LongInt; begin n:=round(abs(x2-x1)/h); writeln('-->Метод Симпсона.'); i:=fx(x1); j:=2; while j<=n-1 do begin i:=i+4*yi(x1,h,j)+2*yi(x1,h,j+1); j:=j+2 end; writeln('------------------------------------------------'); CountSimpson:=h/3*(i+4*yi(x1,h,j)+yi(x1,h,j+1)); end; Function CountThree(x1,x2,h:real):real; var s1,s2,s3:real; i,n:LongInt; begin writeln('-->Метод "Трех восьмых".'); n:=round((abs(x2-x1))/h); if n mod 3=0 then begin s1:=fx(x1)+fx(x2); s2:=0;s3:=0; for i:=1 to n do begin if i mod 3=0 then s3:=s3+yi(x1,h,i) else s2:=s2+yi(x1,h,i) end; CountThree:=3*h/8*(s1+3*s2+2*s3); writeln('------------------------------------------------') end else writeln('Неверное число шагов !!! (Должно быть кратно 3) ') end; Function Richardson(i1,i2,m,a:real):double; var b:double; begin b:=a/(exp(m*ln(a))-1); Richardson:=i2+b*(i2-i1) end; var i1,i2,i,x1,x2,h1,h2:real; c:byte; n1,n2,m:word; begin writeln('------------------------------------------------'); writeln('-= Программа вычисления определенного интеграла =-'); writeln('Введите исходные значения: '); write('Начальное значение x (x нижн)=');Readln(x1); write('Конечное значение x (x верхн)=');Readln(x2); repeat write('Вычисление по числу итераций(1) или по шагу(2)? ');readln(c); until (c=1) or (c=2); case c of 1: begin write('Количество итераций (n1)=');Readln(n1); write('Количество итераций (n2)=');Readln(n2); h1:=(abs(x2-x1))/n1; h2:=(abs(x2-x1))/n2; writeln('Шаг вычисления (h1)=',h1); writeln('Шаг вычисления (h2)=',h2) end; 2: begin write('Шаг вычисления (h1)=');Readln(h1); write('Шаг вычисления (h2)=');Readln(h2); writeln('Количество итераций (n1)=',round(abs(x2-x1)/h1)); writeln('Количество итераций (n2)=',round(abs(x2-x1)/h2)) end; end; i1:=CountTrap(x1,x2,h1); writeln('Интеграл=',i1); i2:=CountTrap(x1,x2,h2); writeln('Интеграл=',i2); writeln('Экстраполирование Ричардсона для случая трапеций: '); writeln('Интеграл = ',Richardson(i1,i2,2,n2/n1)); readln; i1:=CountBar(x1,x2,h1); writeln('Интеграл = ',i1); i2:=CountBar(x1,x2,h2); writeln('Интеграл = ',i2); writeln('Экстраполирование Ричардсона для случая прямоугольников '); writeln('Интеграл = ',Richardson(i1,i2,3,n2/n1)); writeln('------------------------------------------------'); i1:=CountSimpson(x1,x2,h1); writeln('Интеграл = ',i1); i2:=CountSimpson(x1,x2,h2); writeln('Интеграл = ',i2); writeln('Экстраполирование Ричардсона для случая Симпсона '); writeln('Интеграл = ',Richardson(i1,i2,3,n2/n1)); i1:=CountThree(x1,x2,h1); writeln('Интеграл = ',i1); i2:=CountThree(x1,x2,h2); writeln('Интеграл = ',i2); writeln('Спасибо за использование программы ;-) '); readln end. Результаты работы программы: ------------------------------------------------ -= Программа вычисления определенного интеграла =- Введите исходные значения: Начальное значение x (x нижн)=0.9 Конечное значение x (x верхн)=2.34 Вычисление по числу итераций(1) или по шагу(2)? 1 Количество итераций (n1)=4 Количество итераций (n2)=5 Шаг вычисления (h1)= 3.60000000000127E-0001 Шаг вычисления (h2)= 2.88000000000011E-0001 --> Метод трапеций. ------------------------------------------------ Интеграл= 3.21492525852918E-0003 --> Метод трапеций. ------------------------------------------------ Интеграл= 4.61840165326066E-0003 Экстраполирование Ричардсона для случая трапеций: Интеграл = 7.73723808599729E-0003 ------------------------------------------------ Интеграл = 2.53128978246764E-0003 Экстраполирование Ричардсона для случая прямоугольников Интеграл = 3.65111028007424E-0003 ------------------------------------------------ -->Метод Симпсона. ------------------------------------------------ Интеграл = 1.07491181758519E-0002 -->Метод Симпсона. ------------------------------------------------ Интеграл = 9.02681082661161E-0003 Экстраполирование Ричардсона для случая Симпсона Интеграл = 6.76804708990304E-0003 ------------------------------------------------ -->Метод "Трех восьмых". Неверное число шагов !!! (Должно быть кратно 3) Интеграл = 0.00000000000000E+0000 ------------------------------------------------ -->Метод "Трех восьмых". Неверное число шагов !!! (Должно быть кратно 3) Интеграл = 0.00000000000000E+0000 ------------------------------------------------ -->Метод Гаусса. Интеграл = 1.40977850823276E-0002 ------------------------------------------------ -->Метод Гаусса. Интеграл = 1.40649829885291E-0002 Спасибо за использование программы ;-) ----------------------- [pic] [pic] [pic]