共轭梯度法求极小值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

应用共轭梯度法求解方程组121242

x x x x +=⎧⎨-=⎩的根。初始值(0)(0,0)T x = 分析:将方程组Ax b =转化为优化问题中的极值问题然后应用共轭梯度法进行求解。 令()R x Ax b =-,只需求得x ,使得()R x 取得最小值。则有: min ()R x ⇔2min ()R x min T R R ⇔

()()

()()

()()()()2T T T T T T T T T T T T T T T T T T T T T T T T T T R R Ax b Ax b X A b Ax b X A AX X A b b Ax b b

X A AX X A b b Ax b b

X A A X b AX b Ax b b

X A A X b AX b b

=--=--=--+=--+=--+=-+这是一个数 与1()2

T T f x x Gx b x c =++比较 则有:2,()22T T T G A A g x A A A b ==- 回到题目问题中,则对应有124124012,,04444x G g b x --⎛⎫⎛⎫⎛⎫=== ⎪ ⎪ ⎪--⎝⎭⎝⎭⎝⎭

也就是应用共轭梯度法求点使221212()2212420f x x x x x =+--+取得最小值。

程序清单:

#include

#include

double a,b,s[2]; /*全局变量*/

double E=1e-6;

double F(double x1,double 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*s[0];

X2=x2+a1*s[1];

f1=F(X1,X2);

X3=x1+a2*s[0];

X4=x2+a2*s[1];

f2=F(X3,X4);

if (f1>f2)

{

while(1)

{

h=h*2;

a2=a2+h;

f1=f2;

X3=x1+a2*s[0];

X4=x2+a2*s[1];

f2=F(X3,X4);

if (f1>f2) {a1=a2-h;}

else{a=a1;b=a2;break;}

}

}

else

{

h=-h/4;

while(1)

{

a1=a1+h;

f2=f1;

X1=x1+a1*s[0];

X2=x2+a1*s[1];

f1=F(X1,X2);

if(f1

else{a=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;

double k1,k2;

x01=a;x02=a+h;x03=b;

X1=x1+x01*s[0];

X2=x2+x01*s[1];

X3=x1+x02*s[0];

X4=x2+x02*s[1];

X5=x1+x03*s[0];

X6=x2+x03*s[1];

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*s[0];

X8=x2+x0*s[1];

f=F(X7,X8);

if(fabs(x0-x02)<=E)

{

xmin=x0;break;

}

else if(x02

{

if(f2

{x03=x0;f3=f;}

else

{x01=x02;f1=f2;x02=x0;f2=f;}

}

else

{

if(f2

{x01=x0;f1=f;}

else

{x03=x02;f3=f2;x02=x0;f2=f;}

}

}

return(xmin);

}

void main()

{

double g[3],m1,m2,b;

int n=2,k=0;

double x1=0,x2=0; /*起始点*/

g[1]=4*x1-12;

g[2]=4*x2-4;

m1=g[1]*g[1]+g[2]*g[2];

s[0]=-g[1];

s[1]=-g[2];

while(1)

{

qujian(x1,x2);

a=MIN(x1,x2); /*求a的探索区间*/

x1=x1+a*s[0];

x2=x2+a*s[1];

g[1]=4*x1-12;

m2=g[1]*g[1]+g[2]*g[2];

if(sqrt(g[1]*g[1]+g[2]*g[2])<=E)

break;

if(k+1==n)

{g[1]=4*x1-12;g[2]=4*x2-4;s[0]=-g[1];s[1]=-g[2];}

else

{b=m2/m1;s[0]=-g[1]+b*s[0];s[1]=-g[2]+b*s[1];k=k+1;}

printf("最优解:\n X1=%f\n X2=%f\n",x1,x2);

}

}

运行结果:

最优解:

X1=3.000000

X2=1.000000

相关文档
最新文档