本人自编了一个用牛顿法求解函数最小值的程序: global f
global dfx
global dfy
f='exp(x^2+y^2-x*y)*cos(x+y)';
X=input('请输入初始值[x,y]:');
r=grad(X);
s=hesse(X);
k=1;
epsilon=0.01;
while sqrt(sum(r.^2))>=epsilon
d=-inv(s)*r;
X=X+d;
k=k+1;
end
disp('[x,y]=');disp([X(1),X(2)]);
disp('k=');disp(k);
disp('fobj=');disp(exp(X(1)^2+X(2)^2-X(1)*X(2))*cos(X(1)+X(2)));
其中函数grad为: function r=grad(X)
global f
global dfx
global dfy
dfx=diff(f,X(1));dfy=diff(f,X(2));
r=[dfx;dfy];
函数hesse为: function s=hesse(X)
global f
global dfx
global dfy
dfxx=diff(dfx,X(1));dfxy=diff(dfx,X(2));
dfyx=diff(dfy,X(1));dfyy=diff(dfy,X(2));
s=[dfxx,dfxy;dfyx,dfyy];
但当我输入一些初始值比如[1,2],[1,3],[1,4]等等之类的时候。就会报错:
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
Error in ==> grad at 6
r=[dfx;dfy];
Error in ==> newton_method at 6
r=grad(X);
如果初始值里面含有零分量(比如[0,1]),就会报错:
??? Error using ==> diff
Difference order N must be a positive integer scalar.
Error in ==> grad at 5
dfx=diff(f,X(1));dfy=diff(f,X(2));
Error in ==> newton_method at 6
r=grad(X);
求高手帮我分析一下究竟是错在什么地方,谢谢!
p.s.如果用syms定义了x和y,再去定义函数f,即: syms x y;
f=exp(x^2+y^2-x*y)*cos(x+y);
运行时会报错:
Function 'ge' is not defined for values of class 'sym'.
难道大于等于在符号变量的运算中就不能用了吗?