Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
02.05.2014
Размер:
92.16 Кб
Скачать

Цель работы: Ознакомление с методами численного интегрирования, с понятием порядка точности численного метода, а также со способами контроля численных результатов.

Постановка задачи: 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

Вывод: Изучив методы численного интегрирования, мы разработали алгоритм и программу вычисления интеграла двумя методами и нашли погрешности.

Соседние файлы в папке Лабораторная работа №12