dfp 算法matlab,MATLAB拟牛顿法之DFP与BFGS算法

DFP算法原理

由于博主使用WPS编辑的文本,公式无法赋值粘贴,这里以截图的方法给出了推导过程。博主会上传该DOC文档。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

BFGS算法原理

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NUTTg5QzU2,size_16,color_FFFFFF,t_70

matlab代码(DFP)

syms x1 x2

f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;

X=DFP(f,[0 0],1e-8,100)

function x=DFP(f,x0,eps,k)

%目标函数f

%初始迭代点x0

%迭代精度eps

%迭代次数K

x0=x0';

TiDu=matlabFunction(gradient(sym(f)));

m=length(x0);

H=eye(m);%构造初始海塞矩阵

%写出函数值,梯度值的表达式

f_cal='f(x0(1),x0(2))'; %初始点函数值

tidu_cal='TiDu(x0(1),x0(2))';

f1_cal='f(x_1(1),x_1(2))';%下一点函数值

%% 从第一个点计算到第二个点

f_x0=;%计算初始点函数值

tidu_x0=;%计算初始点梯度值

if norm(tidu_x0) < eps%判断是否满足终止条件

x=x0;

return;

end

d=-A*tidu_x0;% 下降方向

syms alfa %定义步长

x_1=x0+alfa*d;%更新迭代点位置

f_x1=;%计算迭代点的函数表达式

df_x1=diff(f_x1);%迭代点的梯度表达式

dalfa=double(solve(df_x1));%求解,得到步长alfa

x0=x0+dalfa*d;%更新初始点

tidu_x1=;%计算该点梯度

n=1;

while n < k && norm(tidu_x1) > eps

delta_x=dalfa*d; %计算sK

delta_g=tidu_x1-tidu_x0; %计算yk

delta_H=delta_x*delta_x'/(delta_x'*delta_g)- H*delta_g*delta_g'*H/(delta_g'*H*delta_g); %计算delta_Dk

H=H+delta_H; %dfp迭代公式

tidu_x0=tidu_x1; %将该点梯度作为新的初始点继续迭代

d=-A*tidu_x0;% 下降方向

syms alfa

x_1=x0+alfa*d;

f_x1=;

df_x1=diff(f_x1);

dalfa=double(solve(df_x1));

x0=x0+dalfa*d;

tidu_x1=;

end

x=x0;

end

matlab代码(BFGS)

%% BFGS算法与DFP算法过程类似,只是迭代函数不同

clc

clear

syms x1 x2

f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;

X=BFGS(f,[0 0],1e-8,100)

function x=BFGS(f,x0,eps,k)

x0=x0';

TiDu=matlabFunction(gradient(sym(f)));

m=length(x0);

A=eye(m);%构造初始矩阵

f_cal='f(x0(1),x0(2))';

tidu_cal='TiDu(x0(1),x0(2))';

f1_cal='f(x_1(1),x_1(2))';

%从第一个点计算到第二个点

f_x0=;

tidu_x0=;

if norm(tidu_x0) < eps

x=x0;

return;

end

d=-A*tidu_x0;% 下降方向

syms alfa

x_1=x0+alfa*d;

f_x1=;

df_x1=diff(f_x1);

dalfa=double(solve(df_x1));

x0=x0+dalfa*d;

tidu_x1=;

n=1;

while n < k && norm(tidu_x1) > eps

delta_x=dalfa*d;

delta_g=tidu_x1-tidu_x0;

delta_A=-A*delta_x*delta_x'*A/(delta_x'*A*delta_x)+delta_g*delta_g'/(delta_g'*delta_x);

A=A+delta_A;

tidu_x0=tidu_x1;

d=-A*tidu_x0;% 下降方向

syms alfa

x_1=x0+alfa*d;

f_x1=;

df_x1=diff(f_x1);

dalfa=double(solve(df_x1));

x0=x0+dalfa*d;

tidu_x1=;

end

x=x0;

end

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值