1 / 12
文档名称:

共轭梯度法程序.docx

格式:docx   大小:58KB   页数:12页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

共轭梯度法程序.docx

上传人:likuilian1 2022/7/19 文件大小:58 KB

下载得到文件列表

共轭梯度法程序.docx

文档介绍

文档介绍:一、 共扼梯度法
共轭梯度法(Conjugate Gradient)是共轭方向法的一种,因为 在该方向法中每一个共轭向量都是依靠赖于迭代点处的负梯度而构 造出来的,所以称为共轭梯度法。由于此法最先由 Fletcher和
Reeves (k)
式5
式6
式7
式8
式9
式io
整理后得
式ii
由上可见,只要利用相邻两点的梯度就可以构造一个共轭方向。以这 种方式产生共轭方向并进行迭代运算的方法,即共轭梯度法。
三、共鲍梯度法的迭代方法步骤:
1、 给定的起始点x(。)和迭代计算精度h;
2、 取X(。)的负梯度作为搜索方向
S(o)=-Af (X(o))
3、 沿方向S(k)进行一维搜索,得
X(k+l)=X (k) +a (k) s (k)
4、 进行收敛检验。
若满足IAf (X(k+D)||<h,则令
X*=X(k+l), f (X*) =f (X(k+1))
输出最优解,结束迭代计算;否则,转入6)
5、 若k=n,则令X(o)=X(k+D,转入(2)开始新一轮的迭代;否则, 转入(6)o
6、 构造新的共轲方向
6 =11 顼(X(k+l))l|2
II 颂(X(幻)||2
S (k+l) =-Af (X(k)) +P (k) s (k)
令 k=k+l,转入(3).
四、共轭梯度法的计算框图如下:
五、共扼梯度法的C++实现程序清单:
#include<>
#include<>
#define N 10
#define eps pow(10,-6)
double f(double x[],double p[])
{
double s;
s=x[]*x[]+4*p[]*p[]-1;
return s;
}
/*以下是进退法搜索区间源程币/
void sb(double *a,double *b,double x[],double p[])
{
double t0,t1,t,h,alpha,f0,f1;
int k=0;
t0=1; /*初始值*/
h=; /*初始步长*/ alpha=1;
f0=f(x,p,t0);
tl=tO+h;
fl=f (x, p, tl);
while (1)
{
if(fl<fO)
{
h=alpha^h; t=tO;
tO=tl; fO=f1;
k++;
}
else
{
if (k==0)
{h=-h;t=tl;}
else
{
^a=t<tl?t:tl;
*b二
break;
tl=tO+h;
}
}
double hjfg(double x[],double p[])
{
double beta,t1,t2,t;
double f1,f2;
double a=0,b=0;
double *c,*d;
c=&a,d=&b;
sb(c,d,x,p);/*调用进退法搜索区间*/
printf(〃\nx1=%lf,x2=%lf,p1=%lf,p2=%lf〃,x[0],x[1],p[0],p[1]);
printf(〃\n[a,b] = [%lf,%lf]〃,a,b);
beta=(sqrt(5)-)/2;
t2=a+beta*(b-a); f2=f(x,p,t2);
t1=a+b-t2; f1=f(x,p,t1);
while(1)
{
if(fabs(t1-t2)<eps)
break;
else
{
if(f1<f2)
{
t=(t1+t2)/2;
b=t2; t2=t1;
f2=f1; t1=a+b-t2;
f1=f(x,p,t1);
}
else
{
a=t1; t1=t2;
f1=f2;
t2=a+beta*(b-a);
f2=f(x,p,t2);
}
}
}
t=(t1+t2)/2;
return t;
}
/*以下是共轭梯度法程序源代码*/
void gtd()
{
double x[N],g[N],p[N],t=0,f0,mod1=0,mod2=0,nanda=0;
int i,k,n;
printf("请输入函数的初值x1,x2=〃);
scanf(〃%d〃,&n);
printf("\n请输入步长值:\n");
for(i=0;i<n;i++)
scanf(〃%lf〃,&x[i]);
f0=f(x,g,t);