Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2009-03-31, 02:11   #1
闻风听雨
初级会员
 
注册日期: 2009-03-21
年龄: 44
帖子: 11
声望力: 17
闻风听雨 正向着好的方向发展
默认 [紧急求助]最速上升法debug

求各位高手帮忙,先谢了
以下函数对任意z=f(x,y)求最大值,首先从起始点开始用最速上升法求上升最快的梯度,再用黄金分割法求得在此梯度上的局部最大值,如此类推,只到求得全局最大值.
(x_1,y_1,gh) 为局部最大值的坐标,子函数黄金查找法算法经单独验证,没有问题,主函数在运行过程中在循环判断部分老是出现如下错误:
在命令窗口中随便输入函数进行测试,例如:
>>syms x y
>>f=f=-(x-2)^2-(y-1)^2+12;
>> [x_1,y_1,gh]=mar(f)

??? Function 'lt' is not defined for values of class 'sym'.

Error in ==> lt at 18
[varargout{1:nargout}] = builtin('lt', varargin{:});

Error in ==> mar at 29
if t<0.0001


function [x_1,y_1,gh]=mar(f)
syms x y a b t x_1 y_1

a=diff(f,'x'); % f 函数分别对x,y求导
b=diff(f,'y');
x_new=0; % starting point
y_new=0;

t=1; %随机设置循环条件

while 1
syms h
m=subs(a,[x,y],[x_1,y_1]); %将m,n用x_1,y_1表示(替换掉x,y)
n=subs(b,[x,y],[x_1,y_1]);
t=sqrt(m^2+n^2);
if t<0.0001 %判断条件
% break;
else

gh=subs(f,[x,y],[x_1+m*h,y_1+n*h]); %构筑在梯度方向上新函数gh(h)
% gh_new=collect(gh,h);
h=Gold_section(gh,-1000,1000) % 调用黄金查找,在区间-100,100找一维方向上的最佳步长
% m=subs(a,[x,y],[x_1,y_1]);
% n=subs(b,[x,y],[x_1,y_1]);
x_1=x_1+m*h;
y_1=y_1+n*h;
end
%end
x_new;
y_new;


function h=Gold_section(gh,p,q)
phi = (sqrt(5)-1)/2;
h1=p+phi*(q-p);
h2=q-phi*(q-p)
fh1=subs(gh,h1);
fh2=subs(gh,h2);

k=1;
while q-p>=0.1

if(fh1 > fh2 )
p = h2;
h2=h1;
fh1=subs(gh,h1);
fh2=subs(gh,h2);
fh2=fh1;
h1=p+phi*(q-p);
fh1=subs(gh,h1);

else
q = h1;
h1= h2;
fh1=subs(gh,h1);
h2= q-phi*(q-p);
fh2=subs(gh,h2);
fh1=fh2;
fh1=subs(gh,h1);
end
k=k+1;
end
h=(p+q)/2;
% g=subs(gh,h);
k
闻风听雨 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码



所有时间均为北京时间。现在的时间是 20:11


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.