BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #10593同步于 2013/12/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖

[问题]【求助】如何用matlab实现最速下降法 测试函数是三元函数

chenyuntc
2013/12/30镜像同步4 回复
以下是本人根据网上修改的代码 但无法顺利运行 ,求破 若有大神能告诉我三元函数的最速下降法怎么写 甚佳 在线等 求破 matlab最速下降法 function x=fsxsteep(f,e,a,b,c) % fsxsteep函数 最速下降法 % x=fsxsteep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点; % fsx TJPU 2008.6.15 x1=a;x2=b,x3=c; Q=fsxhesse(f,x1,x2,x3); x0=[x1 x2 x3]'; fx1=diff(f,'x1'); %对x1求偏导数 fx2=diff(f,'x2'); %对x2求偏导数 fx3=diff(f,'x3'); g=[fx1 fx2 fx3]'; %梯度 g1=subs(g); %把符号变量转为数值 d=-g1; while (abs(norm(g1))>=e) t=(-d)'*d/((-d)'*Q*d);t=(-d)'*d/((-d)'*Q*d); %求搜索方向 x0=x0-t*g1; %搜索到的点 v=x0; a=[1 0 0]*x0; b=[0 1 0]*x0; c=[0 0 1]*x0; x1=a; x2=b; x3=c; g1=subs(g); d=-g1; end; x=v; function x=fsxhesse(f,a,b,c) % fsxhesse函数 求函数的hesse矩阵; % 本程序仅是简单的求二次函数的hesse矩阵!; % x=fsxhesse(f)为输入函数 f为二次函数 x1,x2为自变量; % fsx TJPU 2008.6.15 x1=a;x2=b;x3=c; fx=diff(f,'x1'); %求f对x1偏导数 fy=diff(f,'x2'); %求f对x2偏导数 fz=diff(f,'x3'); %求f对x2偏导数 fxx=diff(fx,'x1'); %求二阶偏导数 对x1再对x1 fxy=diff(fx,'x2'); %求二阶偏导数 对x1再对x2 fxz=diff(fx,'x3'); fyx=diff(fy,'x1'); %求二阶偏导数 对x2再对x1 fyy=diff(fy,'x2'); %求二阶偏导数 对x2再对x2 fyz=diff(fy,'x3'); fzx=diff(fz,'x1'); fzy=diff(fz,'x2'); fzz=diff(fz,'x3'); fxx=subs(fxx); %将符号变量转化为数值 fxy=subs(fxy); fxz=subs(fxz); fyx=subs(fyx); fyy=subs(fyy); fyz=subs(fyz); fzy=subs(fzy); fzx=subs(fzx); fzz=subs(fzz); x=[fxx,fxy,fxz;fyx,fyy,fyz;fzx,fzy,fzz]; %求hesse矩阵 测试函数 syms x1 x2 x3; X=[x1,x2,x3]; fx=X(1)^2+2*X(2)^2+X(3); z=fsxsteep(fx,0.001,1,1,1)
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
cdllikeny机器人#1 · 2013/12/31
这样可以吗: fminunc(@(x)(x(1)^2)+(2*x(2)^2)+(x(3)),[1,1,1]) 不过它说你这函数值负的太多,可能是unbounded,即它的值可能可以无限低,它对x3已经尝试到 -2.3575 e+20 了
sherlockwk机器人#2 · 2013/12/31
那个求导的部分其实不用matlab算,因为直接可以公式推导出来,这样程序就会简单很多。。。
chenyuntc机器人#3 · 2013/12/31
这个测试函数比较简单 可以直接求导 而实际的题目中的那个函数很复杂的 【 在 sherlockwk 的大作中提到: 】 : 那个求导的部分其实不用matlab算,因为直接可以公式推导出来,这样程序就会简单很多。。。
chenyuntc机器人#4 · 2013/12/31
嗯 谢谢 【 在 cdllikeny 的大作中提到: 】 : 这样可以吗: : fminunc(@(x)(x(1)^2)+(2*x(2)^2)+(x(3)),[1,1,1]) : 不过它说你这函数值负的太多,可能是unbounded,即它的值可能可以无限低,它对x3已经尝试到 -2.3575 e+20 了