1、画出 DFP 拟 Newton 法的算法流程图;
2、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 DFP 拟 Newton 法,求解如下问题:
精度为 0.001,初始点为(-1,1)。
3、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 BFGS 拟 Newton 法,求解如下问题:
精度为 0.001,初始点为(-1,1)。
function y=f(x)
if(length(x)==1)
global xk;
global pk;
x=xk+x*pk;
end
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
黄金分割算法精确搜索的 DFP 拟 Newton 法
function x_=DFP_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
%step 2
pk=-(Hk*g0')'; %默认都是列向量
%step 3
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
%step 4
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 5
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
x_=xk;
return;
end
sk=(a*pk)'; %x(k+1)-x(k)=a*pk
yk=(g1-g0)';
%step 6
Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
g0=g1;
end
Wolfe-Powell 不精确搜索的 DFP 拟 Newton 法
function x_=DFP_Wolfe(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
%step 2
pk=-(Hk*g0')'; %默认都是列向量
%step 3
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 4
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 5
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
x_=xk;
return;
end
sk=(a*pk)'; %x(k+1)-x(k)=a*pk
yk=(g1-g0)';
%step 6
Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
g0=g1;
end
黄金分割算法精确搜索的 BFGS 拟 Newton 法
function x_=BFGS_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
%step 2
pk=-(Hk*g0')'; %默认都是列向量
%step 3
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
%step 4
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 5
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
x_=xk;
return;
end
sk=(a*pk)'; %x(k+1)-x(k)=a*pk
yk=(g1-g0)';
%step 6
wk=(yk'*Hk*yk)^0.5*(sk/(yk'*sk)-(Hk*yk)/(yk'*Hk*yk));
Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk)+wk*wk';
g0=g1;
end
Wolfe-Powell 不精确搜索的 BFGS 拟 Newton 法
function x_=BFGS_Wolfe(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
%step 2
pk=-(Hk*g0')'; %默认都是列向量
%step 3
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 4
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 5
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
x_=xk;
return;
end
sk=(a*pk)'; %x(k+1)-x(k)=a*pk
yk=(g1-g0)';
%step 6
wk=(yk'*Hk*yk)^0.5*(sk/(yk'*sk)-(Hk*yk)/(yk'*Hk*yk));
Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk)+wk*wk';
g0=g1;
end
调用命令式文件:
clear
clc
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
H=[1 0;0 1]
fprintf('=========================\n');
fprintf('精确搜索的DFP拟Newton法:\n');
x_=DFP_hjfg(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的DFP拟Newton法:\n');
x_=DFP_Wolfe(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('精确搜索的BFGS拟Newton法:\n');
x_=BFGS_hjfg(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的BFGS拟Newton法:\n');
x_=BFGS_Wolfe(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));