1、1应用共轭梯度法求解方程组 的根。初始值124x(0),Tx分析:将方程组 转化为优化问题中的极值问题然后应用共轭梯度法进行求解。Ab令 ,只需求得 ,使得 取得最小值。则有:()Rxx()Rxmin2in()RminT()()()2TTTTTTbXAxbAxbXx这 是 一 个 数与 比较1()TfxGc则有: ,()2TAgxAb回到题目问题中,则对应有 124012,4xgb也就是应用共轭梯度法求点使 取得最小值。112() 0fx程序清单:#include #includedouble a,b,s2; /*全局变量*/double E=1e-6;double F(double x1,d
2、ouble x2)double y;y=2*x1*x1+2*x2*x2-12*x1-4*x2+20;return(y);void qujian(double x1,double x2) /*用前进后退法求a的探索区间*/double a0=0,h=1,a1,a2,f1,f2,X1,X2,X3,X4;a1=a0;a2=a0+h;X1=x1+a1*s0;X2=x2+a1*s1;f1=F(X1,X2);X3=x1+a2*s0;X4=x2+a2*s1;f2=F(X3,X4);if (f1f2)2while(1)h=h*2;a2=a2+h;f1=f2;X3=x1+a2*s0;X4=x2+a2*s1;f2
3、=F(X3,X4);if (f1f2) a1=a2-h;elsea=a1;b=a2;break;elseh=-h/4;while(1)a1=a1+h;f2=f1;X1=x1+a1*s0;X2=x2+a1*s1;f1=F(X1,X2);if(f1f2) a2=a1-h;h=2*h;elsea=a1;b=a2;break;double MIN(double x1,double x2) /*二次插值法求a的最小值*/double x01,x02,x03,x0,xmin;double f1,f2,f3,f;double X1,X2,X3,X4,X5,X6,X7,X8;double h=(b-a)/2;
4、double k1,k2;x01=a;x02=a+h;x03=b;X1=x1+x01*s0;X2=x2+x01*s1;X3=x1+x02*s0;X4=x2+x02*s1;X5=x1+x03*s0;X6=x2+x03*s1;f1=F(X1,X2);f2=F(X3,X4);f3=F(X5,X6);while (1)k1=(f3-f1)/(x03-x01);k2=(f2-f1)/(x02-x01)-k1)/(x02-x03);x0=(x01+x03-k1/k2)/2;X7=x1+x0*s0;X8=x2+x0*s1;f=F(X7,X8);if(fabs(x0-x02)=E)3xmin=x0;break
5、;else if(x02x0)if(f2f)x03=x0;f3=f;else x01=x02;f1=f2;x02=x0;f2=f;elseif(f2f)x01=x0;f1=f;elsex03=x02;f3=f2;x02=x0;f2=f;return(xmin);void main()double g3,m1,m2,b;int n=2,k=0;double x1=0,x2=0; /*起始点*/g1=4*x1-12;g2=4*x2-4;m1=g1*g1+g2*g2;s0=-g1;s1=-g2;while(1)qujian(x1,x2);a=MIN(x1,x2); /*求a的探索区间*/x1=x1+a*s0;x2=x2+a*s1;g1=4*x1-12;m2=g1*g1+g2*g2;if(sqrt(g1*g1+g2*g2)=E)break;if(k+1=n)g1=4*x1-12;g2=4*x2-4;s0=-g1;s1=-g2;else b=m2/m1;s0=-g1+b*s0;s1=-g2+b*s1;k=k+1;printf(“最优解:n X1=%fn X2=%fn“,x1,x2);运行结果:最优解:X1=3.0000004X2=1.000000