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

Лабораторная №2 Вычисление значений интеграла методами трапеций и Симпсона

.doc
Скачиваний:
27
Добавлен:
25.05.2014
Размер:
41.98 Кб
Скачать

Лабораторная работа №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