(1)DFP法
给定控制误差ε.
Step1,给定初始点x0,初始矩阵H0(通常取单位矩阵),计算g0,令k=0.
Step2,令pk=-Hkgk.
Step3,由精确一维搜索确定步长ak.
f(xk+akpk)=minf(xk+apk).(a>=0);
Step4 令xk+1=xk+akpk.
Step5 若||gk+1||<=ε,则x*=xk+1停;否则令
sk=xk+1-xk, yk=gk+1-gk.
Step6,由DFP修正公式(3.39)得Hk+1.令k=k+1,转Step2.
返回值函数
double min(double X[])
{
return X[0]*X[0]+X[1]*X[1]-X[0]*X[1]-10*X[0]-4*X[1]+60;
}
定义结构体
typedef struct ARRAY
{
int Row,Col;
double *Addr;
}Array;
初始化结构体变量
int Init_Array(Array*pArray,int Row,int Col)
{
pArray->Row=Row;
pArray->Col=Col;
if(!(pArray->Addr=(double *)malloc(Row*Col*sizeof(double))))
{
printf("Faile in Initial Array!");
exit(1);
}
return 1;
}
(2)BFGS法
给定控制误差ε.
Step1,给定初始点x0,初始矩阵H0(通常取单位矩阵),计算g0,令k=0.
Step2,令pk=-Hkgk.
Step3,由精确一维搜索确定步长ak.
f(xk+akpk)=minf(xk+apk).(a>=0);
Step4 令xk+1=xk+akpk.
Step5 若||gk+1||<=ε,则x*=xk+1停;否则令
s正则化共轭梯度法k=xk+1-xk, yk=gk+1-gk.
Step6,修正公式
Hk+1=Hk-HkykykTHk/(ykTHkyk)+skskT/(ykTsk)+wkwkT .
其中wk由一下公式给出.
Wk=(ykTHkyk)1/2(sk/(ykTsk)-Hkyk/(ykTHkyk))
得Hk+1.令k=k+1,转Step2.
修正公式与DFP法不一样,其他部份都一样.
(1) 共轭梯度法
给定控制误差ε。
Step1 给定初始点x1,k=1。
Step2 计算gk=g (xk)。
Step3 若‖gk‖≤ε,则x*=xk停;否则令
pk=- gk+βk-1pk-1 ,
当k>1时,βk-1=gkTgk/ gk-1Tgk-1 ;
当k=1时,βk-1=0。
Step4 由精确一维搜索确定步长αk,满足
f (xk+αkpk)=min f (xk+αpk)(当α≥0)。
Step5 令xk+1= xk+αkpk ,k=k+1,转Step2
基本算法同DFP法.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论