闻风听雨
2009-03-31, 02:11
:confused: 求各位高手帮忙,先谢了
以下函数对任意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
以下函数对任意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