资源描述
作业二 用DFP算法求解,取,。
一、求解:
(1) 求迭代点x1
令,得的极小值点,
所以得:
于是,由DFP修正公式有
下一个搜索方向为
(2) 求迭代点x2
令,得的极小值点
于是得:,所以:,
因Hesse阵为正定阵,为严格凸函数,所以为整体
极小点。
二、DFP算法迭代步骤如下:
(1)给定初始点,初始矩阵(通常取单位阵),计算,令k=0,给定控制误差。
(2)令。
(3)由精确一维搜索确定步长,
(4)令。
(5)若,则停;
否则令 , 。
(6)由DFP修正公式得。令k=k+1,转步骤(2)
三、 DFP算法matlab程序实现
function [best_x,best_fx,count]=DFP(x0,ess)
syms x1 x2 t;
f=x1*x1+2*x2*x2-2*x1*x2-4*x1;
fx=diff(f,x1);%求表达式f对x1的一阶求导
fy=diff(f,x2);%求表达式f对x2的一阶求导
fi=[fx fy];%构造函数f的梯度函数
%初始点的梯度和函数值
g0=subs(fi,[x1 x2],x0);
f0=subs(f,[x1 x2],x0);
H0=eye(2);
%输出x0,f0,g0
x0
f0
g0
xk=x0;
fk=f0;
gk=g0;
Hk=H0;
k=1;
while(norm(gk)>ess)%迭代终止条件||gk||<=ess
disp('************************************************************')
disp(['第' num2str(k) '次寻优'])
%确定搜索方向
pk=-Hk*gk';
%由步长找到下一点x(k+1)
xk=xk+t*pk';
f_t=subs(f,[x1 x2],xk); %构造一元搜索的一元函数φ(t)
%由一维搜索找到最优步长
df_t=diff(f_t,t);
tk=solve(df_t);
if tk~=0
tk=double(tk);
else
break;
end
%计算下一点的函数值和梯度
xk=subs(xk,t,tk)
fk=subs(f,[x1 x2],xk)
gk0=gk;
gk=subs(fi,[x1 x2],xk)
%DPF校正公式,找到修正矩阵
yk=gk-gk0;
sk=tk*pk';
Hk=Hk-(Hk*yk'*yk*Hk)/(yk*Hk*yk')+sk'*sk/(yk*sk')%修正公式
k=k+1;
end
disp('结果如下:')
best_x=xk;%最优点
best_fx=fk;%最优值
count=k-1;
四、 程序执行结果
在命令窗口输入以下命令:
>> x0=[1 1];
ess=1e-6;
[best_x,best_fx,count]=DFP(x0,ess)
程序运行结果:
x0 =
1 1
f0 =
-3
g0 =
-4 2
************************************************************
第1次寻优
xk =
2.0000 0.5000
fk =
-5.5000
gk =
-1 -2
Hk =
0.8400 0.3800
0.3800 0.4100
************************************************************
第2次寻优
xk =
4 2
fk =
-8
gk =
0 0
Hk =
1.0000 0.5000
0.5000 0.5000
结果如下:
best_x =
4 2
best_fx =
-8
count =
2
可以看到,最优点,迭代次数2次,与前面结果一致。
展开阅读全文