(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 给定初始点x1k=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小时内删除。