Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМП Интегралы.doc
Скачиваний:
3
Добавлен:
07.05.2019
Размер:
478.21 Кб
Скачать

6 Указания по выполнению работы и Требования к отчету

Вычислить приближенное значение интеграла , на интервале (a,b) с заданной точностью Ez и оценить эффективность программы. Для оценки фактической погрешности дана первообразная функция F(x).

Предварительно объявить функциональный тип данных funk с помощью оператора typedef, а в главной программе предусмотреть ввод исходных данных, вызов нашей подпрограммы и печать протокола решения задачи.

Отчет должен содержать:

1. Постановку задачи и заданные формулы f(x) и F(x).

2. Таблицы переменных и схемы алгоритмов (подпрограмм и главной программы).

3. Текст программы с комментариями.

4. Анализ результатов расчета.

4 Контрольные вопросы к защите отчета

1. Формулы и алгоритмы численного интегрирования функций.

2. Физический смысл переменных x, a, b, n, h, S.

3. Теоретические погрешности разных методов.

4. Идея алгоритма двойного просчета.

5. Понятие о погрешностях, - абсолютной, относительной, текущей, фактической, погрешности метода (теоретическая) и округления.

6. Физический смысл переменных S, S0, Iт.зад, тек, факт.

7. Какова будет теоретическая погрешность численного интегрирования функции f(x) = a X +b методом прямоугольников, а f(x) = a X3 + b X2 + c X + d - методом Симпсона? Почему?

8. Глобальные и локальные параметры.

9. Формальные и фактические параметры.

10 Механизмы передачи формальных/фактических параметров;

11. Назначение и синтаксис оператора typedef.

12. Какие параметры (данные) можно передавать через заголовок функции и оператор return, а какие нельзя ?

13. Чем отличаются вызовы функции s =priam(sin,a,b,n); и s =priam(&sin,a,b,n); ?

Приложение a

Листинг 1. Программа численного интегрирования по заданной погрешности

typedef double(*funk)(double x);

double f(double x){ //подъинтегральная функция f

x*x*exp(-2*x);

}//----------------------------------------------

double F(double x){ //первообразная функция F

exp(-2*x)*(x*x+x+0.5)/2;

}//----------------------------------------------

double priam(funk f, double a,double b, long n){

long i,m; double x,h,s,c=0;

m=n/2; h=(b-a)/n;

x=a+c*h; s=0;

for(i=0;i<n;i++){

s=s+f(x);

x=x+h;

}

s*=h; return s;

}//----------------------------------------------

void main(){

clrscr();

double a=0.1,b=3.9,ez=0.00001,et,ef,h,s0,s,It; long n;

//printf("\n Vvedite a,b,ez\n"); scanf("%lf%lf%lf",&a,&b,&ez);

double raz,e0=10,z1;

FILE *fout;

double Simpson(funk f, double a, double b, long n);

if(!(fout=fopen("результаты.txt","w")))

fprintf(stderr, "не могу открыть файл результаты.txt.\n");

s0=0; n=4;

printf("\ns et ef It n raz");

printf("\n----------------------------------------------- ");

do{

s=priam(&f,a,b,n);

//s=Simpson(f,a,b,n);

It=F(b)-F(a);

et=fabs(s-s0); ef=fabs(s-It); raz=e0/et; e0=et;

printf("\n%1.8lf %1.8lf %1.8lf %1.8lf %ld %6.1lf",s,et,ef,It,n,raz);

fprintf(fout,"\n%1.8lf %1.8lf %1.8lf %1.8lf %ld %6.1lf",s,et,ef,It,n,raz);

s0=s;

n*=2;

}while(et>ez);

printf("\nIточ= %12.10lf s = %12.10lf raz= %5.1lf",It,s,raz);

fprintf(fout,"\nIточ= %12.10lf s= %12.10lf raz= %5.1lf",It,s,raz);

getch();

}//----------------------------------------------------------------