最速下降法
#include
#include
#define Exp 0.01
double A[4]={0,0,0,0};
double x[4]={2,2,2,2};
double f(double x1,double x2,double x3,double x4) {
double p;
p=(x1+10*x2)*(x1+10*x2)+5*(x3-x4)*(x3-x4)+(x2-2*x3)*(x2-2*x3)*(x2-2*x3)*(x2-
2*x3)+10*(x1-x4)*(x1-x4)*(x1-x4)*(x1-x4);
return p;
}
double g(double x1,double x2,double x3,double x4) {
double q,g1,g2,g3,g4;
g1=2*(x1+10*x2)+40*(x1-x4)*(x1-x4)*(x1-x4);
g2=20*(x1+10*x2)+4*(x2-2*x3)*(x2-2*x3)*(x2-2*x3);
g3=10*(x3-x4)-8*(x2-2*x3)*(x2-2*x3)*(x2-2*x3);
g4=-10*(x3-x4)-40*(x1-x4);
q=g1*g1+g2*g2+g3*g3+g4*g4;
return q;
}
double h(double x1,double x2,double x3,double x4) {
double r,g1,g2,g3,g4,h1,h2,h3,h4,h5,h6;
g1=2*(x1+10*x2)+40*(x1-x4)*(x1-x4)*(x1-x4);
g2=20*(x1+10*x2)+4*(x2-2*x3)*(x2-2*x3)*(x2-2*x3);
g3=10*(x3-x4)-8*(x2-2*x3)*(x2-2*x3)*(x2-2*x3);
g4=-10*(x3-x4)-40*(x1-x4);
h1=2+120*(x1-x4)*(x1-x4);
h2=-120*(x1-x4)*(x1-x4);
h3=200+12*(x2-2*x3)*(x2-2*x3);
h4=-24*(x2-2*x3)*(x2-2*x3);
h5=10+48*(x2-2*x3)*(x2-2*x3);
h6=10+120*(x1-x4)*(x1-x4);
r=(h1*g1+20*g2+h2*g4)*g1+(20*g1+h3*g2+h4*g3)*g2+(h4*g2+h5*g3+(-10)*g4)*g3+(h
2*g1+(-10)*g3+h6*g4)*g4;
return r;
}
void main()
{
int i;
double f0,g0,h0,y;
do
{
f0=f(x[0],x[1],x[2],x[3]);
g0=g(x[0],x[1],x[2],x[3]);
h0=h(x[0],x[1],x[2],x[3]);
A[0]=x[0]-(g0*(2*(x[0]+10*x[1])+40*(x[0]-x[3])*(x[0]-x[3])*(x[0]-x[3])))/h0;
A[1]=x[1]-(g0*(20*(x[0]+10*x[1])+4*(x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2])
))/h0;
A[2]=x[2]-(g0*(10*(x[2]-x[3])-8*(x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2])))/
h0;
A[3]=x[3]-(g0*((-10)*(x[2]-x[3])-40*(x[0]-x[3])))/h0;
if(sqrt(g0)