
Программирование на C / C++ / Лабораторная работа №12 / отчет
.docЦель работы: Ознакомление с методами численного интегрирования, с понятием порядка точности численного метода, а также со способами контроля численных результатов.
Постановка задачи: 1. Выбрать 2 (из 5) метода численного интегрирования (в нашем случае это метод трапеций и правых прямоугольников).
2. Разработать алгоритм и программу вычисления интеграла выбранным методом с заданной точностью (=10-6). Предусмотреть оценку точности по правилу Рунге.
3. В качестве отладочного примера выбрать функцию f(x)=xm, где m=4 и отрезок интегрирования [0,2]. Найти точное значение интеграла и распечатать его с необходимым числом знаков.
Распечатать результаты приближенного счета со всеми значениями, начиная с n=2 и их погрешность (разницу с точным значением) и оценки погрешности по правилу Рунге и по формуле m chk, оценка погрешности K , точное. Результаты представить в виде таблиц.
4. Проинтегрировать
численно функцию
на отрезках [0, 1.5] и [0.001, 1.5], где m
=4.
Листинг программы:
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#include <conio.h>
#define N 65536
void main()
{
double a,b,a1,b1,a2,b2,h,hx,sum,sumx,c,x,xx,U,fa,fb,fa1,fb1,d,fa2,fb2;
double y1[20][6],y2[20][6],u1[20][6],u2[20][6],ux1[20][6],ux2[20][6];
long int i,n,j,v;
const int m=4,
k1=1, //метод правых прямоугольников
k2=2; //метод трапеций
//вычисление постоянной с для функции у
a=0;
b=2;
U=6.4; //точное значение интеграла функции y
clrscr();
c=32; //постоянная для функции у
cout<<"c="<<c<<endl;
fa=pow(a,m);
fb=pow(b,m);
//вычисление приближенных значений для функции у
i=0;
for (n=2;n<=N;n=2*n)
{
sum=0;
h=(b-a)/n;
y1[i][5]=c*(pow(h,k1));//вычисление теоретических погрешностей методом правых прямоугольников
y2[i][5]=c*(pow(h,k2));// вычисление теоретических погрешностей методом трапеций
///////////////////////
for (j=1;j<=n;j++)
{
x=a+double(j)*h;
sum=sum+h*(pow(x,m));
}
y1[i][0]=n;
y1[i][1]=sum;//массив приближенных значений интеграла методом правых прямоугольников
///////////////////////
sum=0;
for (j=1;j<=n-1;j++)
{
x=a+double(j)*h;
sum=sum+h*(pow(x,m));
}
y2[i][0]=n;
y2[i][1]=h*(fa+fb)/2+sum;//массив приближенных значений интеграла
//методом трапеций
i++;
}
v=i;//количество значений интеграла
cout<<"v="<<v<<endl;
getch();
////////////////////////////////////////////////
a1=0;
b1=1.5;
a2=0.001;
b2=1.5;
fa1=(pow(a1,1.0/m))*(sqrt(1+a1*a1));
fb1=(pow(b1,1.0/m))*(sqrt(1+b1*b1));
fa2=(pow(a2,1.0/m))*(sqrt(1+a2*a2));
fb2=fb1;
//вычисление приближенных значений интеграла для функции u
i=0;
for (n=2;n<=N;n=2*n)
{
sum=0;
sumx=0;
h=(b1-a1)/n;
hx=(b2-a2)/n;
for (j=1;j<=n;j++)
{
x=a1+double(j)*h;
sum=sum+h*(pow(x,1.0/m))*(sqrt(1+x*x));//метод правых прямоугольников на промежутке [a1,b1]
xx=a2+double(j)*hx;
sumx=sumx+hx*(pow(xx,1.0/m))*(sqrt(1+xx*xx)); //метод правых прямоугольников на промежутке [a2,b2]
}
u1[i][0]=n;
u1[i][1]=sum;//массив приближенных значений интеграла
//методом правых прямоугольников на [a1,b1]
ux1[i][0]=n;
ux1[i][1]=sumx;// //массив приближенных значений интеграла
//методом правых прямоугольников на [a2,b2]
//////////////////
sum=0;
sumx=0;
for (j=1;j<=n-1;j++)
{
x=a1+double(j)*h;
sum=sum+h*(pow(x,1.0/m))*(sqrt(1+x*x));
xx=a2+double(j)*hx;
sumx=sumx+hx*(pow(xx,1.0/m))*(sqrt(1+xx*xx));
}
u2[i][0]=n;
u2[i][1]=h*(fa1+fb1)/2+sum;// //массив приближенных значений интеграла
//методом трапеций на [a1,b1]
ux2[i][0]=n;
ux2[i][1]=hx*(fa2+fb2)/2+sumx;// //массив приближенных значений интеграла
//методом трапеций на [a2,b2]
i++;
}
v=i;//количество значений интеграла
//вычисление погрешности К
for(i=2;i<v;i++)
{
//метод правых прямоугольников для функции y
y1[i][2]=(y1[i-1][1]-y1[i-2][1])/(y1[i][1]-y1[i-1][1]);
//метод трапеций для функции y
y2[i][2]=(y2[i-1][1]-y2[i-2][1])/(y2[i][1]-y2[i-1][1]);
// метод правых прямоугольников для функции u на [a1,b1]
u1[i][2]=(u1[i-1][1]-u1[i-2][1])/(u1[i][1]-u1[i-1][1]);
// метод трапеций для функции u на [a1,b1]
u2[i][2]=(u2[i-1][1]-u2[i-2][1])/(u2[i][1]-u2[i-1][1]);
// метод правых прямоугольников для функции u на [a2,b2]
ux1[i][2]=(ux1[i-1][1]-ux1[i-2][1])/(ux1[i][1]-ux1[i-1][1]);
// метод трапеций для функции u на [a2,b2]
ux2[i][2]=(ux2[i-1][1]-ux2[i-2][1])/(ux2[i][1]-ux2[i-1][1]);
}
y1[0][2]=0; y1[1][2]=0; y2[0][2]=0; y2[1][2]=0;
u1[0][2]=0; u1[1][2]=0; u2[0][2]=0; u2[1][2]=0;
ux1[0][2]=0; ux1[1][2]=0; ux2[0][2]=0; ux2[1][2]=0;
//вычисление точной погрешности для функции y
for(i=0;i<v;i++)
{
y1[i][3]=U-y1[i][1];//метод правых прямоугольников для функции y
y2[i][3]=U-y2[i][1];//метод трапеций для функции y
}
//вычисление погрешности Рунге
for(i=1;i<v;i++)
{
// метод правых прямоугольников для функции y
y1[i][4]=(y1[i][1]-y1[i-1][1])/(pow(2,k1)-1);
// метод трапеций для функции y
y2[i][4]=(y2[i][1]-y2[i-1][1])/(pow(2,k2)-1);
// метод правых прямоугольников для функции u на [a1,b1]
u1[i][3]=(u1[i][1]-u1[i-1][1])/(pow(2,k1)-1);
// метод трапеций для функции u на [a1,b1]
u2[i][3]=(u2[i][1]-u2[i-1][1])/(pow(2,k2)-1);
// метод правых прямоугольников для функции u на [a2,b2]
ux1[i][3]=(ux1[i][1]-ux1[i-1][1])/(pow(2,k1)-1);
// метод трапеций для функции u на [a2,b2]
ux2[i][3]=(ux2[i][1]-ux2[i-1][1])/(pow(2,k2)-1);
}
y1[0][4]=0; y2[0][4]=0;
u1[0][3]=0; u2[0][3]=0;
ux1[0][3]=0; ux2[0][3]=0;
//вывод на экран таблицы функций у методом правых прямоугольников
cout<<" Значенение погрешностей для функций методом правых прямоугольников"<<endl;
cout<<setw(11)<<setiosflags(ios::left)<<"n"<<
setw(11)<<setiosflags(ios::left)<<"Интеграл"<<
setw(11)<<setiosflags(ios::left)<<"К"<<
setw(11)<<setiosflags(ios::left)<<"Точн"<<
setw(11)<<setiosflags(ios::left)<<"Рунге"<<
setw(11)<<setiosflags(ios::left)<<"Теор"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<6;j++)
cout<<setw(10)<<setiosflags(ios::left)<<y1[i][j]<<" ";
cout<<endl;
}
getch();
cout<<endl;
//вывод на экран таблицы функции у методом трапеций
cout<<" Значенение погрешностей для функций методом трапеций "<<endl;
cout<<setw(10)<<setiosflags(ios::left)<<"n"<<
setw(10)<<setiosflags(ios::left)<<"Интеграл"<<
setw(10)<<setiosflags(ios::left)<<"К"<<
setw(15)<<setiosflags(ios::left)<<"Точн"<<
setw(15)<<setiosflags(ios::left)<<"Рунге"<<
setw(15)<<setiosflags(ios::left)<<"Теор"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<6;j++)
{
if (j<3) d=10; else d=15;
cout<<setw(d)<<setiosflags(ios::left)<<y2[i][j];
}
cout<<endl;
}
getch();
cout<<endl;
//вывод на экран таблицы функции u методом правых прямоугольников на [a1,b1]
cout<<" Значение погрешностей для функции u методом правых прямоугольников на [a1,b1]"<<endl;
cout<<setw(14)<<setiosflags(ios::left)<<"n"<<
setw(14)<<setiosflags(ios::left)<<"Интеграл"<< setw(14)<<setiosflags(ios::left)<<"К"<<
setw(14)<<setiosflags(ios::left)<<"Рунге"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<4;j++)
cout<<setw(13)<<setiosflags(ios::left)<<u1[i][j]<<" ";
cout<<endl;
}
getch();
cout<<endl;
// вывод на экран таблицы функции u методом трапеций на [a1,b1]
cout<<" Значение погрешностей для функции u методом трапеций на [a1,b1]"<<endl;
cout<<setw(14)<<setiosflags(ios::left)<<"n"<<
setw(14)<<setiosflags(ios::left)<<"Интеграл"<<
setw(14)<<setiosflags(ios::left)<<"К"<<
setw(14)<<setiosflags(ios::left)<<"Рунге"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<4;j++)
cout<<setw(13)<<setiosflags(ios::left)<<u2[i][j]<<" ";
cout<<endl;
}
getch();
cout<<endl;
// вывод на экран таблицы функции u методом правых прямоугольников на [a2,b2]
cout<<" Значение погрешностей для функции u методом правых прямоугольников на [a2,b2]"<<endl;
cout<<setw(14)<<setiosflags(ios::left)<<"n"<<
setw(14)<<setiosflags(ios::left)<<"Интеграл «"<<
setw(14)<<setiosflags(ios::left)<<"К"<<
setw(14)<<setiosflags(ios::left)<<"Рунге"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<4;j++)
cout<<setw(13)<<setiosflags(ios::left)<<ux1[i][j]<<" ";
cout<<endl;
}
getch();
cout<<endl;
// вывод на экран таблицы функции u методом трапеций на [a2,b2]
cout<<" Значение погрешностей для функции u методом трапеций на [a2,b2]"<<endl;
cout<<setw(14)<<setiosflags(ios::left)<<"n"<<
setw(14)<<setiosflags(ios::left)<<"Интеграл"<<
setw(14)<<setiosflags(ios::left)<<"К"<<
setw(14)<<setiosflags(ios::left)<<"Рунге"<<endl;
for(i=0;i<v;i++)
{
for(j=0;j<4;j++)
cout<<setw(13)<<setiosflags(ios::left)<<ux2[i][j]<<" ";
cout<<endl;
}
getch();
}
Результаты работы программы:
c=32
v=16
Значения погрешностей для функции y методом правых прямоугольников
n Интеграл К Точн. Рунге Теор.
2 17 0 -10.6 0 32
4 11.0625 0 -4.6625 -5.9375 16
8 8.566406 2.378717 -2.166406 -2.496094 8
16 7.44165 2.219232 -1.04165 -1.124756 4
32 6.910416 2.117248 -0.510416 -0.531235 2
64 6.652604 2.060554 -0.252604 -0.257812 1
128 6.525651 2.030763 -0.125651 -0.126953 0.5
256 6.462663 2.015503 -0.062663 -0.062988 0.25
512 6.431291 2.007782 -0.031291 -0.031372 0.125
1024 6.415635 2.003899 -0.015635 -0.015656 0.0625
2048 6.407815 2.001951 -0.007815 -0.00782 0.03125
4096 6.403907 2.000976 -0.003907 -0.003908 0.015625
8192 6.401953 2.000488 -0.001953 -0.001954 0.007813
16384 6.400977 2.000244 -0.000977 -0.000977 0.003906
32768 6.400488 2.000122 -0.000488 -0.000488 0.001953
65536 6.400244 2.000061 -0.000244 -0.000244 0.000977
Значения погрешностей для функции y методом трапеций
n Интеграл К Точн. Рунге Теор.
2 9 0 -2.6 0 32
4 7.0625 0 -0.6625 -0.645833 8
8 6.566406 3.905512 -0.166406 -0.165365 2
16 6.44165 3.976517 -0.04165 -0.041585 0.5
32 6.410416 3.994138 -0.010416 -0.010412 0.125
64 6.402604 3.998535 -0.002604 -0.002604 0.03125
128 6.400651 3.999634 -0.000651 -0.000651 0.007813
256 6.400163 3.999908 -0.000163 -0.000163 0.001953
512 6.400041 3.999977 -4.069009e-05 -4.069003e-05 0.000488
1024 6.40001 3.999994 -1.017253e-05 -1.017252e-05 0.000122
2048 6.400003 3.999999 -2.543131e-06 -2.543131e-06 3.051758e-05
4096 6.400001 4 -6.357829e-07 -6.357829e-07 7.629395e-06
8192 6.4 4 -1.589457e-07 -1.589457e-07 1.907349e-06
16384 6.4 3.999999 -3.973644e-08 -3.973643e-08 4.768372e-07
32768 6.4 3.999999 -9.934108e-09 -9.934112e-09 1.192093e-07
65536 6.4 4.000011 -2.483544e-09 -2.483521e-09 2.980232e-08
Значения погрешностей для функции u методом правых прямоугольников на [a1,b1]
n Интеграл К Рунге
2 2.368766 0 0
4 2.079109 0 -0.289657
8 1.93544 2.016137 -0.143669
16 1.862068 1.958111 -0.073371
32 1.824253 1.940246 -0.037816
64 1.804751 1.939099 -0.019502
128 1.794721 1.944334 -0.01003
256 1.789581 1.951467 -0.00514
512 1.786957 1.958634 -0.002624
1024 1.785622 1.965135 -0.001335
2048 1.784944 1.970772 -0.000678
4096 1.784601 1.975556 -0.000343
8192 1.784428 1.979572 -0.000173
16384 1.784341 1.982928 -8.737525e-05
32768 1.784297 1.985726 -4.400166e-05
65536 1.784275 1.988059 -2.213297e-05
Значения погрешностей для функции u методом трапеций на [a1,b1]
n Интеграл К Рунге
2 1.620604 0 0
4 1.705028 0 0.028141
8 1.748399 1.946545 0.014457
16 1.768548 2.152536 0.006716
32 1.777492 2.252627 0.002982
64 1.781371 2.306219 0.001293
128 1.783031 2.336326 0.000553
256 1.783736 2.353668 0.000235
512 1.784035 2.363795 9.946037e-05
1024 1.784161 2.369755 4.197075e-05
2048 1.784214 2.373277 1.768473e-05
4096 1.784236 2.375363 7.445062e-06
8192 1.784245 2.376602 3.13265e-06
16384 1.784249 2.377337 1.317714e-06
32768 1.784251 2.377774 5.541798e-07
65536 1.784252 2.378033 2.330412e-07
Значения погрешностей для функции u методом правых прямоугольников на [a2,b2]
n Интеграл К Рунге
2 2.367542 0 0
4 2.078239 0 -0.289303
8 1.934775 2.016563 -0.143464
16 1.861541 1.958979 -0.073234
32 1.823825 1.941705 -0.037716
64 1.804398 1.941471 -0.019427
128 1.794426 1.948128 -0.009972
256 1.789332 1.957384 -0.005095
512 1.786742 1.967434 -0.002589
1024 1.785433 1.977234 -0.00131
2048 1.784773 1.985701 -0.00066
4096 1.784442 1.991907 -0.000331
8192 1.784276 1.995742 -0.000166
16384 1.784193 1.997836 -8.304229e-05
32768 1.784151 1.998914 -4.154371e-05
65536 1.784131 1.999456 -2.07775e-05
Значения погрешностей для функции u методом трапеций на [a2,b2]
n Интеграл К Рунге
2 1.68652 0 0
4 1.737727 0 0.017069
8 1.764519 1.911308 0.008931
16 1.776413 2.252579 0.003965
32 1.781261 2.453556 0.001616
64 1.783116 2.612855 0.000618
128 1.783785 2.773182 0.000223
256 1.784011 2.960874 7.531727e-05
512 1.784082 3.190873 2.360397e-05
1024 1.784102 3.454536 6.832748e-06
2048 1.784108 3.704258 1.844566e-06
4096 1.784109 3.877606 4.75697e-07
8192 1.78411 3.96053 1.201094e-07
16384 1.78411 3.989132 3.010916e-08
32768 1.78411 3.997202 7.53256e-09
65536 1.78411 3.999288 1.883475e-09
Вывод: Изучив методы численного интегрирования, мы разработали алгоритм и программу вычисления интеграла двумя методами и нашли погрешности.