共轭梯度法C语言源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//******************************
//function: min f=x1*x1+25*x2*x2
//method:gradient
//******************************
#include
#include
#include
const float eps=0.000001;
void main()
{
double d[2],x[2],g[2],temp[2],lamda,alpha,g_org,g_now,t;
int n=0;
x[0]=2;
x[1]=2;
g[0]=2*x[0];
g[1]=50*x[1];
while (sqrt(g[0]*g[0]+g[1]*g[1]) > eps && n<20)
{
g_org=g[0]*g[0]+g[1]*g[1];
d[0]=-g[0];
d[1]=-g[1];
alpha=-(x[0]*d[0]+25*x[1]*d[1])/(d[0]*d[0]+25*d[1]*d[1]);
x[0]=x[0]+alpha*d[0];
x[1]=x[1]+alpha*d[1];
//update gradient
g[0]=2*x[0];
g[1]=50*x[1];
g_now=g[0]*g[0]+g[1]*g[1];
lamda=g_now/g_org;
d[0]=-g[0]+lamda*d[0];
d[1]=-g[1]+lamda*d[1];
t=-(x[0]*d[0]+25*x[1]*d[1])/(d[0]*d[0]+25*d[1]*d[1]);
x[0]=x[0]+t*d[0];
x[1]=x[0]+t*d[1];
n++;
printf("Iteration number: %d\n",n);
printf("x[0] = %f; x[1]=%lf\n",x[0],x[1]);
printf("\n");
}
}