查看: 36090|回复: 17|关注: 0

[已解决] MATLAB实现最速下降法

[复制链接]

新手

11 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
原程序代码
function [min,n]=Fastest_Dirction(x0,y0,eps)
%最速下降法,给定初始点,以及误差
%结果为收敛答案,以及迭代次数
syms x_1;
syms x_2;
f=(x_1-2)^4+(x_1-2)^2*x_2^2+(x_2+1)^2;      %计算的函数
v=[x_1,x_2];
J=jacobian(f,v);
Tidu=[subs(J(1),[x_1,x_2],[x0,y0]),subs(J(2),[x_1,x_2],[x0,y0])];
temp=sqrt((Tidu(1))^2+(Tidu(2))^2);
x1=x0;y1=y0;
n=0;
syms kk;
while(temp>eps)                                %进行迭代
    d=-Tidu;                                    %下降方向,负梯度方向
    f1=x1+kk*d(1);f2=y1+kk*d(2);
    fT=[subs(J(1),[x_1,x_2],[f1,f2]),subs(J(2),[x_1,x_2],[f1,f2])];
    Phi=sqrt((fT(1))^2+(fT(2))^2);
    lm=Gold(Phi,0,1,0.00001);                  %调用近似黄金分割法,初始搜索区间定为[0,1],eps=0.00001
    x0=x1+lm*d(1);y0=y1+lm*d(2);
    Tidu=[subs(J(1),[x_1,x_2],[x0,y0]),subs(J(2),[x_1,x_2],[x0,y0])];
    temp=sqrt((Tidu(1))^2+(Tidu(2))^2);
    x1=x0;y1=y0;
    n=n+1;                                     %迭代次数累计
end                                
min=[x0,y0];
%%定义近似黄金分割函数
function lm=Gold(f,a0,b0,eps)
syms x;format long;                             %提高精度,定义为双精度
syms kk;
u=a0+0.382*(b0-a0);
v=a0+0.618*(b0-a0);
k=0;
a=a0;b=b0;
array(k+1,1)=a;array(k+1,2)=b;      
while(abs(b-a)>=eps)
    Fu=subs(f,kk,u);
    Fv=subs(f,kk,v);
    if(Fu<Fv)
        b=v;
        v=u;
        u=a+0.382*(b-a);
        k=k+1;
    else
        a=u;
        u=v;
        v=a+0.618*(b-1);
        k=k+1;
    end
    array(k+1,1)=a;array(k+1,2)=b;         
end
lm=(a+b)/2;
在执行M文件是总是一直在运算,我估计是循环没有退出来,但是不知道哪里出错了,请各位大神帮忙看一下,能告诉我

新手

11 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2015-6-3 14:30:32 来自手机 | 显示全部楼层
为什么没人解答
来自: 微社区

新手

5 麦片

财富积分


050


1

主题

24

帖子

0

最佳答案
发表于 2015-6-3 18:56:45 | 显示全部楼层
完全看不懂楼主编的 么,表示我太菜了

MATLAB 数学、统计与优化
版块优秀回答者

入门

130 麦片

财富积分


50500


0

主题

238

帖子

28

最佳答案
  • 关注者: 20
发表于 2015-6-3 19:19:20 | 显示全部楼层 |此回复为最佳答案
看得我累。这里给你个范本吧
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题:  min f(x)
%输入:  x0是初始点, fun, gfun分别是目标函数和梯度
%输出:  x, val分别是近似最优点和最优值,  k是迭代次数.
maxk=5000;   %最大迭代次数
rho=0.5;sigma=0.4;
k=0;  epsilon=1e-5;
while(k<maxk)
    g=feval(gfun,x0);  %计算梯度
    d=-g;    %计算搜索方向
    if(norm(d)<epsilon), break; end
    m=0; mk=0;
    while(m<20)   %Armijo搜索
        if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)
            mk=m; break;
        end
        m=m+1;
    end
    x0=x0+rho^mk*d;
    k=k+1;
end
x=x0;
val=feval(fun,x0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function f=fun(x)
f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
%-------------------------------
function gf=gfun(x)
gf=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1), -200*(x(1)^2-x(2))]';
%-------------------------
x0=[-1,1]';
[x,val,k]=grad('fun','gfun',x0)

新手

11 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2015-6-3 21:09:54 | 显示全部楼层
maozedongren 发表于 2015-6-3 19:19
看得我累。这里给你个范本吧
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题:  ...

我来研习一下...谢啦

新手

11 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2015-6-4 00:01:08 | 显示全部楼层
maozedongren 发表于 2015-6-3 19:19
看得我累。这里给你个范本吧
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题:  ...

我看懂你的方法了,但是你用的Armijo搜索来确定步长,而用的是近似黄金分割,哥们能不能告诉我我的程序问题出在哪里?

MATLAB 数学、统计与优化
版块优秀回答者

入门

130 麦片

财富积分


50500


0

主题

238

帖子

28

最佳答案
  • 关注者: 20
发表于 2015-6-4 00:42:05 | 显示全部楼层
你的程序看起来确实很费劲。一时之间搞不懂你设计的算法。如果想让看看你的程序,至少把算法搞过来。我知道你的意图是用黄金分割结合最速下降法进行最小值求解。不过,看起来挺费劲的。用直接搜索法不行吗?我看你是用符号运算进行的。符号运算,你搞不好容易死循环,尤其你这没有跳出指令的。我觉得直接搜索挺好的,速度也不慢。
我尝试着弄一个
function [s,phis,k,G,E]=goldfun(phi,a,b,c,d,delta,epsilon)
%功能:
% s, phis分别是近似极小点和极小值,
% E=[ds,dphi], 分别是s和phis的误差限.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=(sqrt(5)-1)/2;  h=b-a; h2=d-c; phia=feval(phi,[a,c]); phib=feval(phi,[b,d]);
p=a+(1-t)*h;  q=a+t*h; %phip=feval(phi,p); phiq=feval(phi,q);
p2=c+(1-t)*h2;  q2=c+t*h2;
phip=feval(phi,[p,p2]); phiq=feval(phi,[q,q2]);
k=1;  G(k,:)=[a, p, q, b,c,p2,q2,d];
while(abs(phib-phia)>epsilon)|(h>delta)
    if(phip<phiq)
        b=q; d=q2; phib=phiq; q=p; q2=p2;phiq=phip;
        h=b-a;h2=d-c; p=a+(1-t)*h;  p2=c+(1-t)*h2;phip=feval(phi,[p,p2]);
    else
        a=p; c=p2;phia=phip;  p=q; phip=phiq;p2=q2;
        h=b-a;  q=a+t*h;  h2=d-c; q2=c+t*h2;phiq=feval(phi,[q,q2]);
    end
    k=k+1;  G(k,:)=[a, p, q, b,c,p2,q2,d];
end
ds=[abs(b-a),abs(d-c)]; dphi=abs(phib-phia);
if(phip<=phiq)
    s=[p,p2];  phis=phip;
else
    s=[q,q2];  phis=phiq;
end
E=[ds,dphi];
%---------------------------
function y=optfungold(x)
y=(x(1)-2)^4+(x(1)-2)^2*x(2)^2+(x(2)+1)^2;
end
%---------------------------------
[s,phis,k,G,E]=goldfun('optfungold',0,4,-3,1,1e-5,1e-6);
结果不错啊
迭代28次,x1=2,x2=-1,精度为3.8e-16

新手

11 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2015-6-4 17:24:59 | 显示全部楼层
maozedongren 发表于 2015-6-4 00:42
你的程序看起来确实很费劲。一时之间搞不懂你设计的算法。如果想让看看你的程序,至少把算法搞过来。我知道 ...

恩恩,我解决了问题了,感谢你的回答我也把你的方法写了一次,我们现在在学习所以我想都尝试一下

新手

10 麦片

财富积分


050


0

主题

74

帖子

0

最佳答案
发表于 2015-11-29 21:02:05 | 显示全部楼层
maozedongren 发表于 2015-6-3 19:19
看得我累。这里给你个范本吧
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题:  ...

你这里调用的不是0.618法和进退法,如果要调用,怎么办?困扰我很久了。似乎Armojo调用起来容易些,但这个没学过。

新手

5 麦片

财富积分


050


5

主题

21

帖子

0

最佳答案
发表于 2015-12-11 22:23:10 | 显示全部楼层
maozedongren 发表于 2015-6-3 19:19
看得我累。这里给你个范本吧
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题:  ...

你好,我想请问下后面的调用格式为什么可以这么写?我试着运行时不对的 ,不知道是我的运行方式有问题?谢谢您啦~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表