返回信息流以下是本人根据网上修改的代码 但无法顺利运行 ,求破
若有大神能告诉我三元函数的最速下降法怎么写 甚佳
在线等 求破
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)
这是一条镜像帖。来源:北邮人论坛 / matlab / #10593同步于 2013/12/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
[问题]【求助】如何用matlab实现最速下降法 测试函数是三元函数
chenyuntc
2013/12/30镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
这样可以吗:
fminunc(@(x)(x(1)^2)+(2*x(2)^2)+(x(3)),[1,1,1])
不过它说你这函数值负的太多,可能是unbounded,即它的值可能可以无限低,它对x3已经尝试到 -2.3575 e+20 了
这个测试函数比较简单 可以直接求导 而实际的题目中的那个函数很复杂的
【 在 sherlockwk 的大作中提到: 】
: 那个求导的部分其实不用matlab算,因为直接可以公式推导出来,这样程序就会简单很多。。。
嗯 谢谢
【 在 cdllikeny 的大作中提到: 】
: 这样可以吗:
: fminunc(@(x)(x(1)^2)+(2*x(2)^2)+(x(3)),[1,1,1])
: 不过它说你这函数值负的太多,可能是unbounded,即它的值可能可以无限低,它对x3已经尝试到 -2.3575 e+20 了