最速下降法
#include
#include
float goldena(float x[2],float p[2])
{float a;
a=(p[0]*p[0]+p[1]*p[1])/(2*p[0]*p[0]-400*x[1]*p[0]*p[0]+1200*x[0]*x[0]*p[0]*p[0]-400*x[0]*
p[0]*p[1]-400*p[0]*p[1]+200*p[1]*p[1]);
return a;
}
main()
{float a=0,x[2],p[2],g[2]={0,0},e=0. 1,t;
int i=0;
x[0]=0;
x[1]=0;
p[0]=-2*(1-x[0])-400*(x[1]-x[0]*x[0])*x[0];
p[1]=200*(x[1]-x[0]*x[0]);
g[0]=-p[0];
g[1]=-p[1];
printf("");
while(sqrt(g[0]*g[0]+g[1]*g[1])>e&&i<=3000)
{
a=goldena(x,g);
x[0]=x[0]+a*g[0];
x[1]=x[1]+a*g[1];
p[0]=-2*(1-x[0])-400*(x[1]-x[0]*x[0])*x[0];
p[1]=200*(x[1]-x[0]*x[0]);
g[0]=-p[0];
g[1]=-p[1];
printf("di %d ci t=%f x1=%f x2=%f a=%f",++i,sqrt(g[0]*g[0]+g[1]*g[1]),x[0],x[1],a);
}
printf("the x[1]=%f,x[2]=%f
y=%f",x[0],x[1],100*(x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0]));
}