Составление программы вычисления определенного интеграла с автоматическим выбором шага интегрирования

Страницы работы

15 страниц (Word-файл)

Содержание работы

Задание:  Составить программу вычисления определенного интеграла с автоматическим выбором шага интегрирования. Расчет интеграла различными методами, а также расчет подынтегральной и первообразной функции оформлять в виде отдельных функций. Допустимую точность вычисления вводить в функции main() с клавиатуры. Функции, рассчитывающие интеграл, кроме значения интеграла должны возвращать и количество обращений к подынтегральной функции. Полученные численным методом значения интегралов необходимо сравнить с их значением, найденным через первообразную функцию.

Номер варианта

Вычисляемый Интеграл

Первообразная функции

Метод  вычисления

19

-x+tg(

Формула Ньютона-Котеса для n=4

Формула Гаусса для n=2


Алгоритмфункции nyut4()

   H0=0.07777778,H[4]={0.3555556,0.1333333,

 0.3555556,0.1555555};

 


да                                                                fabs(INT1-INT2)>=eps;

нет


Алгоритм функцииgauss()

                                                                                   

                                  X[2]={0.2113249,0.7886751},

                 A=0.5;

 


да

 fabs(INT1-INT2)>=eps;

нет

Алгоритмфункции main()

INT_toch=perv_obr(b)-perv_obr(a);


                                                                                        prib_nyut4=nyut4(a,b,fun,prec);

                                                                                     prib_gauss2=gauss(a,b,fun,prec);


нет

                                                                 да

Алгоритм функции perv_obr()

Начало,p=M_PI;,t=                               -x+tan(p/4+x/2);,return t;,Конец


НачалоАлгоритм функции fun()

k_obr++;,return sin(x)/(1-sin(x));

,Конец


Текст программы.

#include<math.h>

#include<iostream.h>

#include<stdio.h>

long int k_obr;//глобальная переменная, для количества обращений

typedef double D;

D perv_obr(D x);

D fun(D x);

D nyut4(D x,D y,D f(D),D eps);

D gauss(D a,D b,D f(D), D eps);

void main()

{D a=-1,b=1.5,prib_nyut4,INT_toch,prec,prib_gauss2,vigr;

FILE *fp;

long int sd,pd;

fp=fopen("rgz1.txt","a");//открываем файл для записи результатов

cout<<"Введите точность";

cin>>prec;//вводим точность вычисления интеграла

printf("Точность =%.9lf",prec);//выводим на экран точность вычисления

fprintf(fp,"Точность=%.9lf",prec);//запись в файл точности вычисления

INT_toch=perv_obr(b)-perv_obr(a);//вычисляем точное значение интеграла

printf("\nТочное значение интеграла %.9lf",INT_toch);/*выводим на экран точное значение интеграла

fprintf(fp,"\ Точное значение интеграла %.9lf",INT_toch);//записываем в файл точное значение интеграла

k_obr=0;/*обнуляем глобальную переменную, для записи в нее количества обращений к подинтегральной функции

prib_nyut4=nyut4(a,b,fun,prec);//вызов функции вычисляющей интеграл по методу Ньютона-Котеса 

sd=k_obr;//записывем количество обращений к подынтегральной функции в переменную sd

printf("\nЗначение интеграла по методу Ньютона-Котеса n=4 %.9lf Количество обращений=%ld",prib_nyut4,k_obr);/*выводим на экран значение интеграла по методу Ньютона Котеса и кол-во обращений к подынтегральной функции

fprintf(fp,"\nЗначение интеграла по методу Ньютона-Котеса n=4 %.9lf Количество обращений=%ld",prib_nyut4,k_obr);/*записываем в файл значение интеграла по методу Ньютона-Котеса и кол-во обращений к подынтегральной функции

k_obr=0;//обнуляем глобальную переменную

prib_gauss2=gauss(a,b,fun,prec);//обращение к функции считающей интеграл по методу Гаусса

pd=k_obr;//записываем количество обращений к подынтегральной функции в переменную pd

printf("\n Значение интеграла по методу Гаусса n=2 %.9lf Количество обращений=%ld",prib_gauss2,k_obr);/*выводим на экран значение интеграла  по методу Гаусса и кол-во обращений к подынтегральной функции

fprintf(fp,"\n Значение интеграла по методу Гаусса n=2 %.9lf Количество обращений=%ld",prib_gauss2,k_obr); );/*записываем в файл значение интеграла  по методу Гаусса и кол-во обращений к подынтегральной функции

if(sd>pd)/*Сравниваем количество обращений функции вычисляющей интеграл по методу Ньютона-Котеса с количеством обращений функции по методу Гаусса(если оно больше, то выигрывает метод Гаусса)

{vigr=double(sd)/pd;//считаем во сколько раз выигрывает метод Гаусса

printf("\Выигрыш Гаусса к Ньютону-Котесуn=%.9lf",vigr);

fprintf(fp,"\nВыигрыш Гаусса к Ньютону-Котесу=%.9lf",vigr);

}

else

{vigr=double(pd)/sd;/*считаем во сколько раз выигрывает метод Ньютона-Котеса

printf("\Выйгрыш Ньютона-Котеса к Гауссу=%.9lf",vigr);

fprintf(fp,"\n Выйгрыш Ньютона-Котеса к Гауссу =%.9lf",vigr);

}

fclose(fp);//закрываем файл, в который записывали результаты работы программы

}

 D perv_obr(D x)

 {D t,p;

 p=M_PI;

 t=-x+tan(p/4+x/2);

 return t;

 }

 D fun(D x)

 {k_obr++;//счетчик считает количество обращений к подынтегральной функции

 return sin(x)/(1-sin(x));

 }

D nyut4(D a,D b,D f(D),D eps)

{D INT1,INT2,s,h,hk,xi;

D H0=0.07777778,H[4]={0.3555556,0.1333333,0.3555556,0.1555555};

int k=1,i,im;

INT2=1;//присваиваем начальное значение INT2

do

{INT1=INT2;

k=k*2;//удваиваем  количество разбиений

hk=(b-a)/k;

im=4*k;

h=hk/4;//шаг интегрирования для n=4

s=(f(a)+f(b))*H0;//присваиваем начальное значение интегральной сумме

for(i=1;i<im;i++)

{xi=a+i*h;//находим точки, в которых будет вычисляться подынтегральная функция

s+=H[(i-1)%4]*f(xi);//составляем  интегральную сумму

}

INT2=hk*s;

}

while(fabs(INT1-INT2)>=eps);//оцениваем погрешность вычисления

return INT2;//возвращаем значение интеграла в функцию main()

}

D gauss(D a,D b,D f(D),D eps)

{D x,INT1,xj,INT2,s,h,X[2]={0.2113249,0.7886751},A=0.5;

int i,j,k=1;

INT2=1;//присваиваем начальное значение INT2

do

{INT1=INT2;

k=k*2; ;//удваиваем  количество разбиений

h=(b-a)/k;//шаг интегрирования

for(s=j=0;j<k;j++)

{ xj=a+j*h;

for(i=0;i<2;i++)

 {

 s+=A*f(xj+X[i]*h);//считаем интегральную сумму

 }

 }

INT2=s*h;

}

while(fabs(INT1-INT2)>=eps); //оцениваем погрешность вычисления

return INT2;//возвращаем значение интеграла в функцию main()

}

Тестовый пример.

Точность =0.100000000

Точное значение интеграла 25.444844857

Значение Ньютона-Котеса n=4 25.445040653 Колличество обращений=510

Значение Гаусса n=2 25.443995184 Колличество обращений=508

Выигрыш Гауса к Ньютону-Котесу=1.003937008

Точность =0.010000000

Точное значение интеграла 25.444844857

Значение Ньютона-Котеса n=4 25.445040653 Колличество обращений=510

Значение Гаусса n=2 25.444789028 Колличество обращений=1020

Выигрыш Ньютона-Котеса к Гаусу=2.000000000

Точность =0.000100000

Точное значение интеграла 25.444844857

Значение Ньютона-Котеса n=4 25.444845039 Колличество обращений=2048

Значение Гаусса n=2 25.444841319 Колличество обращений=2044

Выигрыш Гауса к Ньютону-Котесу=1.0019569

Похожие материалы

Информация о работе