
Блок–схема (метод касательных):
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 |
Вывод: За одно и то же число экспериментов метод касательных показывает лучшие результаты, чем метод дихотомии и алгоритм равномерного блочного поиска, т.к. длина отрезка неопределенности, получаемая этим методом, меньше. В свою очередь – метод дихотомии показывает лучшие результаты по сравнению с алгоритмом равномерного блочного поиска.