Скачиваний:
2
Добавлен:
01.05.2014
Размер:
8.1 Кб
Скачать
#include <math.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>


//class vector
//{
//	public:

double tmp[2],X[2]={1,2} ,p[2]={1,1},D1[3]={1,1,1},D[3]={1,1,1},P[3]={1,1,1},C[2]={1,1};
//double X[2] = {8, 9},p[2] = {1, 0};
double e2 = 0.0000001, e = e2;
int w=25,nomF,k1=1,k0=0;;
char t;
double vect(double c,int i){
	return(X[i] + c*p[i]);
}
void sum(double z[2],double s[2],double k[2]){
	k[0]=z[0]+s[0];
	k[1]=z[1]+s[1];
}
void copy(double z[2],double s[2]) {
	z[0]=s[0];
	z[1]=s[1];
}
double dlin(double y[2]){

 return (sqrt(y[0]*y[0]+y[1]*y[1]));
}
void rmin(double c)
{C[0] = X[0] + c*p[0];
 C[1] = X[1] + c*p[1];}
double y(double);
double dy(double);
double Swenn4(double);
double Bolstano(double, double, int);
double DSK(double);   //Returns Minimum, found with Method DSK (Point to start serching)

double y(double a)
{
 double x[2] = {vect(a,k0), vect(a,k1)};
// double d[3] = {D[0] + a*P[0], D[1] + a*P[1], D[2] + a*P[2]};
 if (nomF==1) {return pow((x[1] -pow(x[0],2)),2) + 100*pow((1-pow(x[0],2)),2);}
 if (nomF==2) {return  4*pow((x[0] -5),2) + pow((x[1] - 6),2);}
 if (nomF==3) {return  (x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0]);}
// if (nomF==4) {return  (d[0]-1)*(d[0]-1)+(d[1]-3)*(d[1]-3)+4*(d[2]+5)*(d[2]+5);}
}

double dy(double ax)
{
 return (y(ax+e) - y(ax))/e;
}
double Swenn4(double x)
{
 int i=0; //Количество итераций
 double a = e2, A;
 static double B = 0, f = 0;//какой вход
 if (f)  //f=0 не первый вход
	{
	 A = B;
	 B = 0;
	 f = 0;
	 return(A);
	}
 if (dy(x) > 0)
	{
	 p[0] = -p[0];
	 p[1] = -p[1];
	}
 do
	{
	 a = 2*a;
	 x += a;
	 i++;
	}
 while((dy(0)*dy(x) > 0)&&(i<w));
 A = x-a;
 B = x;
 f = 1;
 cout<<"iteracii: "<<i<<"\n";
 return A;
}

double Bolstano(double A, double B)
{
double sq;
 double x, L;
 int i=0;
 x = (A + B)/2;
 while(((fabs(dy(x)) > e) && (fabs(L) > e))&&(i<w))
	{
	 if (dy(x) < 0)
		A = x;
	 else
		B = x;
	 L = B - A;
	 x = (A + B)/2;
	 i++;
 sq=fabs(dy(x));
	}
 cout<<"Bolcano iteracii: "<<i<<"\n";
 return x;
}

double DSK(double X1)
{
 double X2, a, b, c, d, h, Min;
 int i=0;

 h = 0.01*X1;
 if (!h)
	h = 0.1;
 X2 = X1 + h;
 if (y(X1) < y(X2)) //направление убывания
	 h = -h;
 do
	{
	 X2 = X1 + h;
	 while(y(X1) > y(X2)) //убывает
		{
		 h = 2*h;
		 X1 = X2;
		 X2 = X1 + h;
		}
	 if (y(X1) < y((X1+X2)/2))
		{
		 b = X1;
		 c = (X1+X2)/2;
		 a = 2*b - c;
		}
	 else
		{
		 a = X1;
		 b = (X1+X2)/2;
		 c = 2*b - a;
		}
	 d = b + (b-a)*(y(a)-y(c))/(y(a) - 2*y(b) + y(c))/2;
	 h = h/2;
	 if (y(b) < y(d))
		X1 = b;
	 else
		X1 = d;
	 i++;
	 if (i==w) {break;}
	}
 while((fabs((d - b)/b) > e) || (fabs((y(d) - y(b))/y(b)) > e2) );
 Min = (b+d)/2;
 cout<<"Dsk iteracii: "<<i<<"\n";
 return Min;
}

void main1 (double C[2])
{

 double a, b, c;
 a = Swenn4(0);
 b = Swenn4(0);
 cout << "Swenn-4:  interval[" << a << ", " << b << "]\n";
 double A[2] = {vect(a,k0), vect(a,k1)}, B[2] = {vect(b,k0), vect(b,k1)};
 cout << "[ {" << A[0] << "," << A[1] << "} : {" << B[0] << "," << B[1] << "} ]\n";

 c = Bolstano(a, b);
 C[0] = vect(c,k0);
 C[1] = vect(c,k1);
 cout << "Method Bolstano: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";

 c = DSK(0);
 C[0] = vect(c,k0);
 C[1] = vect(c,k1);
 cout << "Method DSK:      Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";

}

//---------------------------------------------------------

void main2(void){

	// X[2]={1.5,2};
	char n;
	 double x1=2.5,C[2],first[2]={1.5,2},dlinaD=e,dlinaF;
	int i=0,k=0,d=2,l=0;
	copy(C,tmp);

	do {
		dlinaF=dlinaD;
		if (d==2) {
			p[0]=1;
			p[1]=0;
			}
			else {
				p[0]=0;
				p[1]=1;
				d=1;
				}
		do {
			main1(C);
			copy(X,C);
			cout<<C[0]<<"___"<<C[1]<<"\n";
			if (t=='n') {n=getch();}
			i++;
			}
		while (i<2);
		l++;
		i=0;
		k++;
		d++;
		dlinaD=dlin(C);
		x1=fabs(dlinaD-dlinaF);
		}
	while (x1>=e);
	cout<<"\n\n\n Minimum najden za " <<l<<" iteracij";
	copy(tmp,C);

}

//---------------------------------------------------------
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//---------------------------------------------------------

void main(void){
	char n,k,all;
	double a=1, b=2, c=3;
	double A[2] = {vect(a,k0), vect(a,k1)}, B[2] = {vect(b,k0), vect(b,k1)};
	clrscr();
	textcolor(49);
	textbackground(3);
	nomF=1;
	all='1';
	do{
	switch (all){
	case '1':{
	do {
	clrscr();
	cout<<"\n  Setup:\n\n";
	cout<<"1. Tochnost\n2. Kolichestvo wagov\n3. Vibor Funkcii\n4. Ustanovka pervoj tochki\n5. Sbros to4ek \n\n0. Continue";
	cout<<"\n\n\n Tekuwie:\n\n Tochnost           "<<e2<<"\n Kolichestvo wagov  "<<w<<"\n Tekuwaja funkcija  #"<<nomF<<"\n To4ki: a= "<<a<<"        b= "<<b<<"\n";
	n=getch();
	switch (n){
		case '1': {
			clrscr();
			cout<<"\n Tochnost po umolchaniju 0.0000001\n\n  Izmenit? (y/n)";
			k=getch();
			if (k=='y') {
				cout<<"\n\n    Vvedite tochost:   ";
				cin>>e2;
				}

			break;}
		case '2': {
			clrscr();
			cout<<"\n Kolichestvo wagov po umolchaniju 25\n\n  Izmenit? (y/n)";
			k=getch();
			if (k=='y') {
				cout<<"\n\n    Vvedite Kolichestvo wagov:   ";
				cin>>w;
				}
			break;}
		case '3': {
			clrscr();
			cout<<"Tekuwaja funkcija #"<<nomF<<"\n\nIzmenit? (y/n)";
			k=getch();
			if (k=='y') {
			cout<<"\n     Viberete fukciu:\n\n1. pow((x[1] -pow(x[0],2)),2) + 100*pow((1-pow(x[0],2)),2)\n2. 4*pow((x[0] -5),2) + pow((x[1] - 6),2)  \n3. (x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0])" ;
			k=getch();
			switch(k) {
				case '1': { nomF=1;
					    cout<<"\n\n Tekuwaja funkcija #1";
					break;}
				case '2': { nomF=2;
					    cout<<"\n\n Tekuwaja funkcija #2";

					break;}
				case '3': { nomF=3;
					    cout<<"\n\n Tekuwaja funkcija #3";

					break;}
				case '4': { nomF=4;
					    cout<<"\n\n Tekuwaja funkcija #4";
					    break;}

			}}
			break;}
		case '4': {clrscr();
			cout<<" Vvedite interval a..b\n a: ";
			cin>>a;
			cout<<" b: ";
			cin>>b;
			break;}
		case '5': {a=1; b=2; c=3;tmp[0]=1;tmp[1]=1;X[0]=1;X[1]=2;break;}
		case '0': {all='2';break;}
		default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
		}
	}  while (n!='0');    }
	case '2':{
	do {
	clrscr();
	cout<<"\n  Viberite metod:\n\n";
	cout<<"1. Metod Swenna\n2. Metod Boltsano\n3. Metod DSK\n4. Metod Ciklicheskogo Pokoardinatnogo Spuska\n5. Setup\n\n0. Exit";
	n=getch();
	switch (n){
		case '1': {
			clrscr();
			cout<<"\n     Vi vibrali metod Swenna\n";
			a = Swenn4(a);
			b = Swenn4(b);
			cout << "Swenn-4:  interval[" << a << ", " << b << "]\n";
			cout << "[ {" << A[0] << "," << A[1] << "} : {" << B[0] << "," << B[1] << "} ]\n";
			getch();break;}
		case '2': {
			clrscr();
			cout<<"\n     Vi vibrali metod Boltsano\n";
			c = Bolstano(a, b);
			b=a;
			a=c;
			rmin(c);
			cout << "Method Bolstano: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
			getch();break;}
		case '3': {
			clrscr();
			cout<<"\n     Vi vibrali metod DSK\n" ;
			c = DSK(a);
			b=a;
			a=c;
		       //	if (nomF==4) {
			 //	D1[0] = D[0] + c*P[0];
			 //	D1[1] = D[1] + c*P[1];
			 //	D1[2] = D[2] + c*P[2];
		       //		cout << "Method DSK:      Min = " << c << " - {" << D1[0] << "," << D1[1] <<"," << D1[2]<< "}\n";}
			 //	else {
					rmin(c);
					cout << "Method DSK:      Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
			 //	     }
			getch();break;}
		case '4': {
			clrscr();
			cout<<"\n     Vi vibrali metod Ciklicheskogo Pokoardinatnogo Spuska\n";
			cout<<"\n\n\nauto? (y/n)\n\n";
			t=getch();
			main2();
			getch();
			break;}
		case '5': {all='1';break;}
		case '0': {all='0';break;}
		default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
		}
	}  while (n<'0'||n>'6');
	break;}
	default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
	}
	}
	while (all!='0');
}
Соседние файлы в папке Лабораторная работа №52