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

Блок–схема (метод касательных):

a := 0; b := 1;

N := 23

y1:=f(a); y2:=f(b);

z1:=proizvod(a);

z2:=proizvod(b)

b-a≤2e

Да

Нет

b-a>2e

Да

c=(((b*z2-a*z1)-(y2-y1))/(z2-z1));

y=f(c);

z=proizvod(c)

a=c;

y1=y;

z1=z

Да

z=0;

Нет

z<0;

Да

Нет

z>0

Да

b=c;

y2=y;

z2=z

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

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <conio.h>

#include <iostream.h>

double f(double x)

{return x*x+4*exp(-0.25*x);}

double proizvod (double x)

{return 2*x-exp(-0.25*x);}

double q=0.0000000001;

int N=23;

void kasat()

{

cout<<"********************* METOD KACAT-X ********************"<<endl;

double a=0, b=1,y,z,y1,y2,z1,z2,c,min,e;

y1=f(a); y2=f(b); z1=proizvod(a); z2=proizvod(b);

for(int i=1;i<=N;i++)

{

if ((b-a)<=2*q) {min=(a+b)/2;}

else

{

c=((b*z2-a*z1)-(y2-y1))/(z2-z1); y=f(c); z=proizvod(c);

if (z==0) {min=c;break;}

if (z<0) {a=c; y1=y; z1=z;}

if (z>0) {b=c; y2=y; z2=z;}

}

min=(a+b)/2;

e=(b-a)/2;

}

cout<<"X = "<<min;

cout<<"\t\tY = "<<f(min);

cout<<"\tL = "<<e<<endl;

cout<<endl;

}

void dich()

{

cout<<"******************* METOD DuXOTOMuu ********************"<<endl;

double a=0,b=1,x,y1,y2;

double a1=a,b1=b;

for (int i=1;i<=N/2;i++)

{

x=a1+(b1-a1)/2;

y1=f(x-q);

y2=f(x+q);

if (y1<=y2) b1=x+q;

else a1=x-q;

}

cout<<"X = "<<a1+(b1-a1)/2;

cout<<"\t\tY = "<<f(a1+(b1-a1)/2);

cout<<"\tL = "<<b1-a1<<endl;

cout<<endl;

}

void blok()

{

cout<<"*********** METOD PABHOMEP. blochnogo poiska ***********"<<endl;

double a=0,b=1,xk,yk;

const int n=5;

int m=0;

double xi,yi,ymin=10000;

double xj,xj1,xmin;

int k=(n+1)/2,j;

do {

xk=(a+b)/2;

yk=f(xk);

for(int i=1;i<=N;i++)

{

if(k!=1)

{

xi=a+i*(b-a)/(n+1);

yi=f(xi);

if(ymin>yi)

{

ymin=yi;j=i;

}

}

}

xmin=a+j*(b-a)/(n+1);

xj=a+(j-1)*(b-a)/(n+1);

xj1=a+(j+1)*(b-a)/(n+1);

a=xj;

b=xj1;

m++;

}

while(((n-1)*m+1)<N);

double eps=(b-a)/2;

cout<<"X = "<<xmin<<"\t\tY = "<<ymin<<"\tL = "<<eps<<endl;

cout<<endl;

getch();

}

void main()

{

dich();

kasat();

blok();

}

Сравнение результатов:

x

y

длина отрезка неопределенности

Алгоритм равномерного блочного поиска

0,447188

3,77688

0.000685871

Метод дихотомии

0.447021

3.77688

0.000488281

Метод касательных

0.44712

3.77688

0,0000000593045

Вывод: За одно и то же число экспериментов метод касательных показывает лучшие результаты, чем метод дихотомии и алгоритм равномерного блочного поиска, т.к. длина отрезка неопределенности, получаемая этим методом, меньше. В свою очередь – метод дихотомии показывает лучшие результаты по сравнению с алгоритмом равномерного блочного поиска.

Соседние файлы в папке Лабораторная работа №1