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

double func(double x1,double x2,double x3)
	{
	 return (3*(x1-4)*(x1-4)+5*(x2+3)*(x2+3)+7*(2*x3+1)*(2*x3+1));
	}
double df(double x1,double x2,double x3,double p1,double p2,double p3)
	{
	 return (6*(x1-4)*p1+10*(x2+3)*p2+28*(2*x3+1)*p3);
	}

double agrad1(double x1)
	{
	 return (-6*(x1-4));
	}
double agrad2(double x2)
	{
	 return (-10*(x2+3));
	}
double agrad3(double x3)
	{
	 return (-28*(2*x3+1));
	}


double odnom(double x1,double x2,double x3,double p1,double p2,double p3,double eps,int i)
	{
	 double x1k,x2k,x3k,alfak,alfa0,a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,x11,x22,x33,xmin1,xmin2,xmin3;
	 double n=fabs((func(x1,x2,x3)-df(x1,x2,x3,p1,p2,p3))/df(x1,x2,x3,p1,p2,p3));
	 if(n>1) {alfa0=1;}
	 else {alfa0=n;}

	 alfak=alfa0;
	 x1k=x1+alfak*p1;
	 x2k=x2+alfak*p2;
	 x3k=x3+alfak*p3;

	 while(func(x1,x2,x3)>func(x1k,x2k,x3k))
		{
		 x1=x1k;
		 x2=x2k;
		 x3=x3k;
		 alfak=alfak*2;
		 x1k=x1+alfak*p1;
		 x2k=x2+alfak*p2;
		 x3k=x3+alfak*p3;
		}

	 x11=(x1k+x1)/2;
	 x22=(x2k+x2)/2;
	 x33=(x3k+x3)/2;

	 if (func(x1,x2,x3)<func(x11,x22,x33))
		{
		 a1=x1;
		 a2=x2;
		 a3=x3;
		 c1=x11;
		 c2=x22;
		 c3=x33;
		}
	 else
		{
		 a1=x11;
		 a2=x22;
		 a3=x33;
		 c1=x1;
		 c2=x2;
		 c3=x3;
		}

	 b1=(a1+c1)/2;
	 b2=(a2+c2)/2;
	 b3=(a3+c3)/2;

	 d1=b1+0.5*(b1-a1)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
	 d2=b2+0.5*(b2-a2)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
	 d3=b3+0.5*(b3-a3)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));

	 while ((sqrt(((b1-d1)*(b1-d1)+(b2-d2)*(b2-d2)+(b3-d3)*(b3-d3))/(d1*d1+d2*d2+d3*d3))>eps)||((func(b1,b2,b3)-func(d1,d2,d3))/func(d1,d2,d3))>eps)
	 {
	 alfak=alfa0;
	 x1k=x1+alfak*p1;
	 x2k=x2+alfak*p2;
	 x3k=x3+alfak*p3;

	 while(func(x1,x2,x3)>func(x1k,x2k,x3k))
		{
		 x1=x1k;
		 x2=x2k;
		 x3=x3k;
		 alfak=alfak*2;
		 x1k=x1+alfak*p1;
		 x2k=x2+alfak*p2;
		 x3k=x3+alfak*p3;
		}

	 x11=(x1k+x1)/2;
	 x22=(x2k+x2)/2;
	 x33=(x3k+x3)/2;

	 if (func(x1,x2,x3)<func(x11,x22,x33))
		{
		 a1=x1;
		 a2=x2;
		 a3=x3;
		 c1=x11;
		 c2=x22;
		 c3=x33;
		}
	 else
		{
		 a1=x11;
		 a2=x22;
		 a3=x33;
		 c1=x1;
		 c2=x2;
		 c3=x3;
		}

	 b1=(a1+c1)/2;
	 b2=(a2+c2)/2;
	 b3=(a3+c3)/2;

	 d1=b1+0.5*(b1-a1)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
	 d2=b2+0.5*(b2-a2)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
	 d3=b3+0.5*(b3-a3)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));

	 alfa0=alfa0/2;
	 if (func(b1,b2,b3)>func(d1,d2,d3))
		{
		 x1=b1;
		 x2=b2;
		 x3=b3;
		}
	 else
		{
		 x1=d1;
		 x2=d2;
		 x3=d3;
		}
		 }
	 xmin1=(b1+d1)/2;
	 xmin2=(b2+d2)/2;
	 xmin3=(b3+d3)/2;

	 if (i==1)
		{
		 return xmin1;
		}
	 if (i==2)
		{
		 return xmin2;
		}
	 if (i==3)
		{
		 return xmin3;
		}
	 if (i==4)
		{
		 return 2*alfa0;
		}

	}

void main()
{
 clrscr();
 double x0[3],x1[3],x2[3],p[3],eps=0.01,d[3],x11[3],xmin[3],alfaopt;
 int k=1,i,n;

 cout<<"‚ўҐ¤ЁвҐ ­ з «м­го в®зЄг\n";
 for (n=1;n<4;n++)
	{
	 cin>>x1[n];
	}

 cout<<"‚ўҐ¤ЁвҐ Ў §®ўго в®зЄг\n";
 for (n=1;n<4;n++)
	{
	 cin>>x0[n];
	}

 for (n=1;n<4;n++)
	{
	 x1[n]=x0[n];
	}

  p[1]=agrad1(x1[1]);
  p[2]=agrad2(x1[2]);
  p[3]=agrad3(x1[3]);

  for(n=1;n<4;n++)
	{
	 if(p[1]!=0) { p[1]=0; p[2]=agrad1(x1[1]); break;}
	 if(p[2]!=0) { p[2]=0; p[3]=agrad2(x1[2]); break;}
	 if(p[3]!=0) { p[3]=0; p[1]=agrad3(x1[3]); break;}
	}

  for(i=1;i<4;i++)
	{
	 x11[i]=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,i);
	}

  for(i=1;i<4;i++)
	{
	 d[i]=x11[i]-x0[i];
	}

 while(sqrt(d[1]*d[1]+d[2]*d[2]+d[3]*d[3])>eps)
 {
  p[1]=agrad1(x1[1]);
  p[2]=agrad2(x1[2]);
  p[3]=agrad3(x1[3]);

  for(n=1;n<4;n++)
	{
	 if(p[1]!=0) { p[1]=0; p[2]=agrad1(x1[1]); break;}
	 if(p[2]!=0) { p[2]=0; p[3]=agrad2(x1[2]); break;}
	 if(p[3]!=0) { p[3]=0; p[1]=agrad3(x1[3]); break;}
	}

  for(i=1;i<4;i++)
	{
	 x11[i]=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,i);
	}

  for(i=1;i<4;i++)
	{
	 d[i]=x11[i]-x0[i];
	}

  alfaopt=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,4);

  for(i=1;i<4;i++)
	{
	 x2[i]=x11[i]+alfaopt*d[i];
	}

  for(i=1;i<4;i++)
	{
	 x1[i]=x2[i];
	 x0[i]=x11[i];
	}
  k++;
 }

 for(i=1;i<4;i++)
	{
	 xmin[i]=x11[i];
	}

 for(i=1;i<4;i++)
	{
	 cout<<"ЊЁ­Ё¬г¬    =\n"<<xmin[i]<<"\n";
	}

 cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ© ="<<k;
 getch();

}
Соседние файлы в папке all