Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
02.05.2014
Размер:
4.53 Кб
Скачать
#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