qq_42170810 2021-01-13 13:02
浏览 37

DFP算法 matlab程序运行不出来,求教

matlab程序如下,求解一个无约束的欧式距离问题,但是结果跑不出来,特别慢,有没有大神教一下

function [best_x,best_fx,count]=DFP(x0,ess) 
% ###########################
syms x1 x2 t;  
f=0.5*2000*sqrt((3-x1)^2+(8-x2)^2)+0.5*3000*sqrt((8-x1)^2+(2-x2)^2)+0.75*2500*sqrt((2-x1)^2+(5-x2)^2)+0.75*1000*sqrt((6-x1)^2+(4-x2)^2)+0.75*1500*sqrt((8-x1)^2+(8-x2)^2);
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=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; 
end
 

 

 

 

 

 

命令窗口输入的语句是

x0=[5.16 5.18];
ess=0.1
[best_x,best_fx,count]=DFP(x0,ess)

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 matlab实现基于主成分变换的图像融合。
    • ¥15 对于相关问题的求解与代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料
    • ¥15 使用R语言marginaleffects包进行边际效应图绘制
    • ¥20 usb设备兼容性问题
    • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊