Лабораторная №2 Вычисление значений интеграла методами трапеций и Симпсона
.docЛабораторная работа №2
Задание
Для заданной функции F(x) вычислить значение интеграла от a до b от функции F(x) с точностью d = 0.00001 . Определить N количество интервальчиков на которые был разбит отрезок [a ; b] для достижения заданной точности d.
F( x ) = Ln2( x ) / x [ a ; b ] = [ 1 ; 4 ]
Решение интеграла :
Псевдокод программы :
алгоритм Метод трапеции
начало
скаляры n , i – длинное целые
eps , a , b , S , Pp , Pt , h , exp = 2.718281828 , x = 0 – вещественные
вывод (Введите начальный отрезок : a , b )
ввод ( a ,b )
вывод ( Введите погрешность : eps )
ввод ( eps )
вывод ( Введите количество интервалов : n )
ввод ( n )
Pp = 0
h = ( b – a ) / n
повторить
S = ( ( log( a ) * log( a ) ) / ( a * log( exp ) * log( exp ) + ( log( b ) * log( b ) ) / ( b * log( exp ) * log( exp ) ) ) / 2
для i = 1 ; i < n ; i = i +1
повторить
{
x = a + i * h
S =S + ( ( log( x ) * log( x ) ) / ( x * log( exp ) * log( exp ) ) )
}
Pt = h * S
если ( fabs ( Pt – Pp ) <= eps ) то выход
иначе
{
n = 2 * n
h = h / 2
Pp = Pt
}
до ( Бесконечный цикл )
вывод ( Результаты )
вывод ( Интеграл равен = Pt \n Количество интервалов = n \n Ширина интервала = h)
Запись программы на языке С++ :
//---------------------------------------------------------------------------
# include <stdio.h>
# include <math.h>
# include <conio.h>
//---------------------------------------------------------------------------
void main(){
float eps,a,b,S,Pp,Pt,h,exp=2.718281828,x=0;
long int n,i;
printf("Введите начальный отрезок: a = ");
scanf("%f",&a);
printf(" b = ");
scanf("%f",&b);
printf("Введите погрешность: eps = ");
scanf("%f",&eps);
printf("Введите количество интервалов: n = ");
scanf("%d",&n);
//---------------------------------------------------------------------------
Pp=0;h=(b-a)/n;
do{S=((log(a)*log(a))/(a*log(exp)*log(exp))+(log(b)*log(b))/(b*log(exp)*log(exp)))/2;
printf("0");
for(i=1;i<n;i++)
{x=a+i*h;printf("i=%d\n",i);
S=S+(log(x)*log(x))/(x*log(exp)*log(exp));
}
Pt=h*S;
if(fabs(Pt-Pp) <= eps){printf("3");break;}
else{n=2*n;
h=h/2;
Pp=Pt;}
}while(1);
//---------------------------------------------------------------------------
printf("\n----------<<<<<РЕЗУЛЬТАТ>>>>>----------\n");
printf("Интеграл равен = %f\n",Pt);
printf("Количество интервалов = %d\n",n);
printf("Ширина интервала = %f\n",h);
getch();}
//---------------------------------------------------------------------------
Проверка программы ( тест ) :
Введите начальный отрезок : a = 1
b = 4
Введите погрешность : eps = 0,00001
Введите количество интервалов : n = 2
______________________________
Интеграл равен = 0,888068
Количество интервалов = 128
Ширина интервала = 0,023438
Псевдокод программы :
алгоритм Метод Симпсона
начало
скаляры n , i , c – целые
eps , a , b , S , Pp , Pt , h , exp = 2.718281828 , x = 0 – вещественные
вывод (Введите начальный отрезок : a , b )
ввод ( a ,b )
вывод ( Введите погрешность : eps )
ввод ( eps )
вывод ( Введите количество интервалов : n )
ввод ( n )
Pp = 0
h = ( b – a ) / n
повторить
S = ( log( a ) * log( a ) ) / ( a * log( exp ) * log( exp ) + ( log( b ) * log( b ) ) / ( b * log( exp ) * log( exp ) )
c = 1
для i = 1 ; i < n ; i = i +1
повторить
{
x = a + i * h
S =S + ( c + 3 ) * ( ( log( x ) * log( x ) ) / ( x * log( exp ) * log( exp ) ) )
c = -- c
}
Pt = ( h * S ) / 3
если ( fabs ( Pt – Pp ) <= eps ) то выход
иначе
{
n = 2 * n
h = h / 2
Pp = Pt
}
до ( Бесконечный цикл )
вывод ( Результаты )
вывод ( Интеграл равен = Pt \n Количество интервалов = n \n Ширина интервала = h)
Запись программы на языке С++ :
//---------------------------------------------------------------------------
# include <stdio.h>
# include <math.h>
# include <conio.h>
//---------------------------------------------------------------------------
void main(){
float eps,a,b,S,Pp,Pt,h,exp=2.718281828,x=0;
int n,i,c;
printf("Введите начальный отрезок: a = ");
scanf("%f",&a);
printf(" b = ");
scanf("%f",&b);
printf("Введите погрешность: eps = ");
scanf("%f",&eps);
printf("Введите количество интервалов: n = ");
scanf("%d",&n);
//---------------------------------------------------------------------------
Pp=0;h=(b-a)/n;
do{S=(log(a)*log(a))/(a*log(exp)*log(exp))+(log(b)*log(b))/(b*log(exp)*log(exp));
c=1;
for(i=1;i<n;i++)
{x=a+i*h;
S=S+(c+3)*((log(x)*log(x))/(x*log(exp)*log(exp)));
c= -c;
}
Pt=(h*S)/3;
if(fabs(Pt-Pp) <= eps)break;
else{n=2*n;
h=h/2;
Pp=Pt;}
}while(1);
//---------------------------------------------------------------------------
printf("\n----------<<<<<РЕЗУЛЬТАТ>>>>>----------\n");
printf("Интеграл равен = %f\n",Pt);
printf("Количество интервалов = %d\n",n);
printf("Ширина интервала = %f\n",h);
getch();}
//---------------------------------------------------------------------------
Проверка программы ( тест ) :
Введите начальный отрезок : a = 1
b = 4
Введите погрешность : eps = 0,00001
Введите количество интервалов : n = 2
______________________________
Интеграл равен = 0,88806
Количество интервалов = 64
Ширина интервала = 0,046875