数学建模社区-数学中国

标题: 牛顿法求函数最小值程序 [打印本页]

作者: tiansifei1    时间: 2012-2-13 17:54
标题: 牛顿法求函数最小值程序
本人自编了一个用牛顿法求解函数最小值的程序:
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'.
难道大于等于在符号变量的运算中就不能用了吗?




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5