Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Звіт
до лабораторної роботи № 3
з курсу «Чисельні методи в інформатиці»
на тему «Обчислення означених інтегралів»
Мета роботи: вивчити методи наближених обчислень і запрограмувати алгоритми обчислення означених інтегралів.
Короткі теоретичні відомості
Формули прямокутників.
Нехай на відрізку задана неперервна функція . Потрібно обчислити інтеграл
Розіб’ємо відрізок на n рівних частин точками , i=0,1,…n-1, довжина кожної з яких дорівнює . Через позначимо значення функції в точках і складемо суми
або
Кожна з цих сум є інтегральною сумою для на відрізку і тому наближено виражають означений інтеграл:
(1)
(1/)
Ці формули називаються формулами прямокутників.
2. Формула трапецій.
(3)
3. Формула парабол (Сімпсона).
4. Формула трьох восьмих:
Якщо в формулі Ньютона-Котеса взяти n = 3, тобто функцію f(x) замінити інтерполяційним багаточленом третього степеня, побудованим за значення функції f(x) у точках x0=a, x1=a+h, x2=a+2h, x3=b, h=(b-a )/3. то одержимо таку квадратурну формулу:
де
Ця квадратурна формула називається малою квадратурною формулою трьох восьмих. Використовуючи цю формулу, легко записати велику квадратурну формулу трьох восьмих.
Варіант 17
Обчислити інтеграл методом прямокутників, трапецій, парабол, трьох восьмих, Монте-Карло.
Заданий інтеграл обчислити наближено та точно.
1.
2.
3.
Текст програми:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "IntegralUn.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//---------------------------------------------------------------------------
float __fastcall TForm1::func(float arg1, float arg2=0)
{
switch(RadioGroup1->ItemIndex)
{
case 0: return (sin(arg1/17))/(cos(arg1/17));
case 1: return arg2*(sin(arg1/17))/(cos(arg1/17));
case 2: return atan(17*sin(arg1));
}
}
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if ((Key < '0' || Key > '9') && Key != 8 && Key != ',' && Key != '-') Key= 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i, part = StrToFloat(Edit5->Text);
float xa = StrToFloat(Edit1->Text),
xb = StrToFloat(Edit2->Text),
ya = StrToFloat(Edit4->Text),
yb = StrToFloat(Edit3->Text),
S=0;
int k1=0,k2=0;
float xh;
if(RadioGroup1->ItemIndex!=1)
{
//ліві
xh=(xb-xa)/part;
for (i=0;i<part;i++)
S+=func(xa+i*xh)*xh;
LabeledEdit1->Text=FloatToStrF(S,ffFixed,14,6);
//праві
S=0;
for (i=1;i<=part;i++)
S+=func(xa+i*xh)*xh;
LabeledEdit2->Text=FloatToStrF(S,ffFixed,14,6);
//середні
S=0;
for (i=0;i<part;i++)
S+=func(((xa+(i+1)*xh)+(xa+i*xh))/2)*xh;
LabeledEdit3->Text=FloatToStrF(S,ffFixed,14,6);
//трапеції
S=0;
for (i=1;i<part;i++)
S+=func(xa+i*xh);
S+=(func(xa)+func(xb))/2;
S*=(xb-xa)/part;
LabeledEdit4->Text=FloatToStrF(S,ffFixed,14,6);
//парабола
S=0;
xh=(xb-xa)/(2*part);
for (i=1;i<2*part;i++)
{
if (i%2) S+=4*func(xa+i*xh);
else S+=2*func(xa+i*xh);
}
S+=func(xa)+func(xb);
S*=xh/3;
LabeledEdit5->Text=FloatToStrF(S,ffFixed,14,6);
//три-восьмих
S=0;
xh=(xb-xa)/(3*part);
for (i=1;i<3*part;i++)
{
if (i%3) S+=3*func(xa+i*xh);
else S+=2*func(xa+i*xh);
}
S+=func(xa)+func(xb);
S*=3/(float)8*xh;
LabeledEdit6->Text=FloatToStrF(S,ffFixed,14,6);
//Монте-Карло
srand(time(NULL));
rand();
S=0;
part=1000000;
xh=(xb-xa)/(3*part);
for (i=0;i<part;i++)
{
float x = (float)rand()/(float)RAND_MAX*xb+xa,
y = (float)rand()/(float)RAND_MAX*100-50;
if ((func(x)>=0) && (y>=0) && (y<=func(x))) k1++;
if ((func(x)<0) && (y<0) && (y>func(x))) k2++;
}
S=(xb-xa)*100*k1/part-(xb-xa)*100*k2/part;
LabeledEdit7->Text=FloatToStrF(S,ffFixed,14,6);
}
else
{
//Монте-Карло
srand(time(NULL));
rand();
S=0;
part=1000000;
k1=0,k2=0;
xh=(xb-xa)/(3*part);
for (i=0;i<part;i++)
{
float x = (float)rand()/(float)RAND_MAX*xb+xa,
y = (float)rand()/(float)RAND_MAX*yb+ya,
z = (float)rand()/(float)RAND_MAX*100-50;
if ((func(x,y)>=0) && (z>=0) && (z<=func(x,y))) k1++;
if ((func(x,y)<0) && (z<0) && (z>func(x,y))) k2++;
}
S=(xb-xa)*(yb-ya)*100*k1/part-(xb-xa)*(yb-ya)*100*k2/part;
LabeledEdit7->Text=FloatToStrF(S,ffFixed,14,6);
}
}
//---------------------------------------------------------------------------
Результат виконання програми:
Висновок: На цій лабораторній роботі я вивчив методи наближених обчислень і запрограмувати алгоритми обчислення означених інтегралів.