zhangyong3725 发表于 2010-7-16 11:39

fsolve求方程组时的错误问题

function f=funsss(p)
t=sym('exp(0.1*(x-0.925656)/(0.99999-x))+exp(0.3*(y-0.925656)/(0.99999-y))-z*(x*y-0.95)');
dyf1=diff(t,'x'); dyf2=diff(t,'y'); dyf3=diff(t,'z');
x=p(1); y=p(2); z=p(3); f=;
当输入
options.MaxIter=1e12; options.MaxFunEvals=1e8;
fsolve(@funsss,,options)
后,出错。
??? Undefined function or method 'norm' for input arguments of type 'sym'.
Error in ==> optim\private\trustnleqn at 138
normgradinf = norm(grad,inf);
Error in ==> fsolve at 295
    =...
但是,当我把M文件中计算出来的偏导数手动带入到f中时,就不会报错。请帮忙指出来。谢谢。

[ 本帖最后由 ChaChing 于 2010-7-22 09:49 编辑 ]

rocwoods 发表于 2010-7-16 16:08

楼主和我论坛生日一样哦,呵呵,你的函数用到符号运算了,f返回的是符号数值,需要转化下。关于MATLAB符号运算,最好用它来推导方程,得到符号函数表达式后用char转化成字符串然后用eval转化成匿名函数。如下:
function test
t=sym('exp(0.1*(x-0.925656)/(0.99999-x))+exp(0.3*(y-0.925656)/(0.99999-y))-z*(x*y-0.95)');
dyf1 = eval( ['@(x,y,z) ', char( diff(t,'x') ),';']);
dyf2 = eval( ['@(x,y,z) ', char( diff(t,'y') ),';']);
dyf3 = eval( ['@(x,y,z) ', char( diff(t,'z') ),';']);
function f = funsss(p)
x=p(1);
y=p(2);
z=p(3);
f=;
end

options.MaxIter=1e12;
options.MaxFunEvals=1e8;
fsolve(@funsss,,options)

end

运行结果:
Optimization terminated: first-order optimality is less than options.TolFun.
ans =
    0.9818
    0.9676
   31.8249


[ 本帖最后由 rocwoods 于 2010-7-16 16:10 编辑 ]

zhangyong3725 发表于 2010-7-16 16:49

回复 楼主 zhangyong3725 的帖子

谢谢你了,兄弟。我的Matlab太烂了,如果可以的话,可以向兄弟你学习下。
这个问题困惑我一天了,太感谢你了。
如果不嫌我学识浅薄,可以交流下。

rocwoods 发表于 2010-7-16 16:57

呵呵,客气了,在论坛里面有很多热心的人,欢迎你加入MATLAB学习者这个阵营,只要坚持每天看帖,时间长了自然水平就上去了!
页: [1]
查看完整版本: fsolve求方程组时的错误问题