Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №12 / -=LABA_1=-
.CPP#include <iostream.h>
#include <math.h>
#include <conio.h>
passiv();
parabol();
gold();
kasatelniy();
void main ()
{
textbackground(0);
textcolor(10);
int k;
while (1)
{
clrscr();
cout<<" -=***** UNCONDITIONAL ONE-DIMENSIONAL OPTIMIZATION *****=-\n\n\n\n";
cout<<" My task: f(x)=x^3-x+e^(-x) on interval [0;1] E=10^(-5)\n\n\n";
cout<<" 1.Algorithm of passive search of a minimum\n";
cout<<" 2.A method of parabolas\n";
cout<<" 3.A method of gold section\n";
cout<<" 4.A method of tangents\n";
cout<<" 5.EXIT\n\n";
cout<<" Your choice (1,2,3,4,5) ... : ";
if (cin>>k)
switch (k)
{
case 1: passiv(); getch(); break;
case 2: parabol(); getch(); break;
case 3: gold(); getch(); break;
case 4: kasatelniy(); getch(); break;
case 5: cout<<"\n End of the program..."<<endl;
getch (); return;
default: cout<<"\n Such item is not present!!!";
getch (); break;
}
else {cout<<"\n A mistake of input!!!";getch();return;}
}
getch ();
}
passiv ()
{
clrscr();
float a,b,E,N,k,i,d,x,x1,y,y1,min;
int m;
cout<<" -=***** ALGORITHM OF PASSIVE SEARCH OF A MINIMUM *****=-\n\n\n\n";
cout<<" Enter the beginning of an interval a: ";
cin>>a;
cout<<" Enter the end of an interval b: ";
cin>>b;
cout<<" Enter accuracy E: ";
cin>>E;
N=(b-a)/E-1;
m=N;
if (m%2==0)
{
k=N/2;
x=a+(b-a)/(k+1);
x1=x-(a+x)/2;
y=x1*x1*x1-x1+exp(-x1);
min=y;
for (i=1;i<=k;i++)
{
x=a+i*(b-a)/(k+1);
x1=x-(a+x)/2;
y1=x1*x1*x1-x1+exp(-x1);
if (y1<min) min=y1;
y=x*x*x-x+exp(-x);
if (y<min) min=y;
}
}
else
{
x=a+(b-a)/(N+1);
min=x*x*x-x+exp(-x);
for (i=1;i<=N;i++)
{
x=a+i*(b-a)/(N+1);
y=x*x*x-x+exp(-x);
if (y<min) min=y;
}
}
cout<<"\n\n Quantity of steps: "<<N<<endl<<" A point of a minimum of function f(x): "<<min;
}
parabol()
{
clrscr();
float a,b,E,c,ya,yb,yc,x,y,t,xr,yr,N;
cout<<"-=***** A METHOD OF PARABOLAS *****=-\n\n\n\n";
cout<<" Enter the beginning of an interval a: ";
cin>>a;
cout<<" Enter the end of an interval b: ";
cin>>b;
cout<<" Enter accuracy E: ";
cin>>E;
cout<<" Enter a point C (a<C<b): ";
cin>>c;
ya=a*a*a-a+exp(-a);
yb=b*b*b-b+exp(-b);
yc=c*c*c-c+exp(-c);
N=3;
L1:;
t=c+(0.5*((b-c)*(b-c)*(ya-yc)-(c-a)*(c-a)*(yb-yc)))/((b-c)*(ya-yc)+(c-a)*(yb-yc));
if (t==c) x=(a+c)/2;
else x=t;
y=x*x*x-x+exp(-x);
N=N+1;
if (x<c) {
if (y<yc) {b=c; c=x; yb=yc; yc=y;}
if (y>yc) {a=x; ya=y;}
if (y=yc) {a=x; b=c; c=(x+c)/2; ya=y; yb=yc; yc=c*c*c-c+exp(-c); N=N+1;}
}
if (x>c) {
if (y<yc) {a=c; c=x; ya=yc; yc=y;}
if (y>yc) {b=x; yb=y;}
if (y=yc) {a=c; b=x; c=(x+c)/2; ya=yc; yb=y; yc=c*c*c-c+exp(-c); N=N+1;}
}
if ((b-a)<=E) {xr=x; yr=y; cout<<"\n\n Quantity of steps: "<<N<<endl<<" A point of a minimum of function f(x): "<<yr; return 0;}
else goto L1;
}
gold()
{
clrscr();
float a,b,E,la,x,y,x1,y1,x2,y2,N;
cout<<" -=***** A METHOD OF GOLD SECTION *****=-\n\n\n\n";
cout<<" Enter the beginning of an interval a: ";
cin>>a;
cout<<" Enter the end of an interval b: ";
cin>>b;
cout<<" Enter accuracy E: ";
cin>>E;
la=1.618033989;
x1=b-((b-a)/la);
x2=a+(b-a)/la;
y1=x1*x1*x1-x1+1/exp(x1);
y2=x2*x2*x2-x2+1/exp(x2);
N=2;
L1:;
if (y1<=y2) {b=x2;x2=x1;y2=y1;x1=a+b-x2;y1=x1*x1*x1-x1+1/exp(x1);N=N+1;}
else {a=x1;x1=x2;y1=y2;x2=a+b-x1;y2=x2*x2*x2-x2+1/exp(x2);N=N+1;};
if ((b-a)>E) goto L1;
else if (y1<y2) {x=x1;y=y1;}
else {x=x2;y=y2;}
cout<<"\n\n Quantity of steps: "<<N<<endl<<" A point of a minimum of function f(x): "<<y;
}
kasatelniy ()
{
clrscr();
float a,b,E,y1,y2,z1,z2,x,y,c,z,xr,yr,N;
cout<<" -=***** A METHOD OF TANGENTS *****=-\n\n\n\n";
cout<<" Enter the beginning of an interval a: ";
cin>>a;
cout<<" Enter the end of an interval b: ";
cin>>b;
cout<<" Enter accuracy E: ";
cin>>E;
y1=a*a*a-a+exp(-a);
y2=b*b*b-b+exp(-b);
z1=3*a*a-1-exp(-a);
z2=3*b*b-1-exp(-b);
N=4;
L1:;
if ((b-a)<=2*E) {xr=(a+b)/2; yr=xr*xr*xr-xr+exp(-xr); N=N+1; cout<<"\n\n Quantity of steps: "<<N<<endl<<
" A point of a minimum of function f(x): "<<yr; return (0);}
if ((b-a)>2*E) {c=((b*z2-a*z1)-(y2-y1))/(z2-z1); y=c*c*c-c+exp(-c); z=3*c*c-1-exp(-c); N=N+2;}
if (z==0) {xr=c; yr=y; cout<<"\n\n Quantity of steps: "<<N<<endl<<
" A point of a minimum of function f(x): "<<yr; return (0);}
if (z<0) {a=c; y1=y; z1=z; goto L1;}
if (z>0) {b=c; y2=y; z2=z; goto L1;}
}
Соседние файлы в папке Лабораторная работа №12