Лабораторная работа № 5
Численное интегрирование
Выполнил: Спасёнкин А.В.
Проверил: Лобач В.Н.
2.Задание:
Вычислить интегралы
1) и 2)
с помощью функций SdxRect()(два варианта), SdxTrapez(), SdxSimps(), SdxGauss(), изменяя n от 1 до 10. Построить зависимости погрешностей от n и объяснить их.
Программа
// Программа для расчета интегралов
// с помощью функций SdxRect(), SdxTrapez(), SdxSimps(), SdxGauss()
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include "integral.h"
double F1(double x);
double F2(double x);
void main()
{
// описание данных
int n;
double a,b,c,S;
// ввод входных данных
a=0;
b=M_PI;
c=1;
n=10;
// обращение к функции
S=SdxTrapez(F1,a,b,n);
// вывод результата
clrscr();
cout<<"Интеграл sin x 0-M_PI "<<endl ;
cout<<"Интеграл sdxtrapez = "<<S<<endl;
getch();
S=SdxSimps(F1,a,b,n);
cout<<"Интеграл sdxsimps = "<<S<<endl;
getch() ;
S=SdxRect(F1,a,b,n,1);
cout<<"Интеграл sdxrect = "<<S<<endl;
getch() ;
S=SdxGauss(F1,a,b,n);
cout<<"Интеграл sdxgauss = "<<S<<endl;
getch() ;
S=SdxTrapez(F2,a,c,n);
// вывод результата
cout<<"Интеграл e^(-x) 0-1 "<<endl ;
cout<<"Интеграл sdxtrapez = "<<S<<endl;
getch();
S=SdxSimps(F2,a,c,n);
cout<<"Интеграл sdxsimps = "<<S<<endl;
getch() ;
S=SdxRect(F2,a,c,n,1);
cout<<"Интеграл sdxrect = "<<S<<endl;
getch() ;
S=SdxGauss(F2,a,c,n);
cout<<"Интеграл sdxgauss = "<<S<<endl;
getch() ;
}
double F1(double x)
// первая подынтегральная функция
{
return sin(x);
}
double F2(double x)
// вторая подынтегральная функция
{
return exp(-x);
}
Результат:
График зависимости погрешностей от n (метод трапеций)
График зависимости погрешностей от n (метод Гаусса)
График зависимости погрешностей от n (метод прямоугольников)
График зависимости погрешностей от n (метод Симпсона)
Таблица зависимости погрешностей от n.
n |
||||||
SdxTrapez() |
SdxGauss() |
SdxRect() |
SdxSimps() |
|||
1 |
2 |
1.141593 |
0.264242 |
0.176161 |
||
2 |
0.429204 |
0.06418 |
0.344916 |
0.000213 |
||
3 |
0.186201 |
0.001389 |
0.000492 |
0.161676 |
||
4 |
0.103881 |
0.000016 |
0.075727 |
0.000013 |
||
5 |
0.066234 |
0 |
0.061107 |
0.086875 |
||
6 |
0.045903 |
0 |
0.051215 |
0.000002 |
||
7 |
0.033683 |
0 |
0.044077 |
0.059183 |
||
8 |
0.025768 |
0 |
0.038685 |
0 |
||
9 |
0.020349 |
0 |
0.034468 |
0.044834 |
||
10 |
0.016476 |
0 |
0.03108 |
0 |
||
3.Задание:
С помощью функции SdxSimps() вычислить интеграл по 10 точкам. Сравнить его значение с полученным аналитически и объяснить результат. Добиться правильного вычисления интеграла.
Программа:
// Программа для расчета интегралов
// с помощью функций SdxRect(), SdxTrapez(), SdxSimps(), SdxGauss()
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include "integral.h"
double F1(double x);
double F2(double x);
void main()
{
// описание данных
int n;
double a,b,S;
// ввод входных данных
a=0;
b=11*M_PI;
n=100;
// обращение к функции
// S=SdxRect(F1,a,b,n,1);
// S=SdxTrapez(F1,a,b,n);
S=SdxSimps(F1,a,b,n);
// S=SdxGauss(F1,a,b,n);
// вывод результата
clrscr();
cout<<"Интеграл = "<<S<<endl;
getch();
}
double F1(double x)
// первая подынтегральная функция
{
return sin(x);
}
double F2(double x)
// вторая подынтегральная функция
{
return exp(-x);
}
Результат;
Интеграл = -7.820257 –полученное значение при n=10
Интеграл = 2.000161 – полученное значение при n=100
Исходное табличное значение интеграла 2.0
4.Задание:
Проанализировать алгоритм функции SdxEpsilon() и нарисовать его блок-схему. Вычислить с помощью этой функции интеграл с погрешностью 1.10-7.
Программа:
// Программа для расчета интегралов
// с помощью функции SdxEpsilon()
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include "simpson.h"
double F1(double x);
void main()
{
// описание данных
int n,keyDemo;
double a,b,eps,S;
// ввод входных данных
a=0;
b=11*M_PI;
eps=1E-07;
keyDemo=1;
// обращение к функции
clrscr();
S=SdxEpsilon(F1,a,b,eps,keyDemo);
// вывод результата
cout<<endl;
cout<<"Интеграл = "<<S<<endl;
getch();
}
double F1(double x)
// первая подынтегральная функция
{
return sin(x);
}
Результат выполнения программы:
1 8 10.53098424 -5.04128211 -15.57226635
2 16 -5.04128211 2.50138974 7.54267185
3 32 2.50138974 2.01750201 -0.48388773
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.