matlab 隐函数求解出来结果很诡异,想用 fminbnd 求解 最小值,错误,具体程序如下

%使用for 循环是由于有好几层的板需要进行校核……%
for i=1:n

stress1(i)=stress12(1,1,i);
stress2(i)=stress12(2,1,i);
tao(i)=stress12(3,1,i);
end
%(这就是一个stress1(i),stress2(i),tao(i)是三个含有 符号Nx 和 Z 的表达式)%
F=stress1.^2/Xt^2-stress1.*stress2/Xt^2+stress2.^2/Yt^2+tao.^2/S^2-1;
%Xt Yt S 为数值,材料常数%
F_Nx=[];
Nxmin=[];
for i=1:n
jie=solve(F(i),Nx);%运行后可以看到jie里有值,但系数太诡异%
[fz,fval]=fminbnd(jie,z(i),z(i+1)); %这一句一直报错,错误提示见后%
fzmin=[fzmin fz ];
Nxmin=[Nxmin fval];
end

错误提示:
??? Error using ==> fcnchk at 103
If FUN is a MATLAB object, it must have an feval method.

Error in ==> fminbnd at 183
funfcn = fcnchk(funfcn,length(varargin));

Error in ==> composites at 311
[fz,fval]=fminbnd(jie,z(i),z(i+1));

1、最主要的问题在于,你的jie是sym对象,不能用于fminbnd这类数值方法的优化程序。可以改成
[fz,fval]=fminbnd(inline(char(jie(i)),z(i),z(i+1));

2、由于你现在的条件中,Xt、Yt、S以及z的值都没给出,我随便指定的值,虽然可以运行,但算出来的结果没什么意义。

希望对你有帮助,有问题可追问。追问

这是由于此例中,for 1:n ,n等于2
stress1(i),stress2(i),tao(i)里面值打了个包地址如下,都是1x2 sym ,
http://pan.baidu.com/share/link?shareid=196234905&uk=923277306
  
我试了一下,还是不行,是不是由于数据太大了……

追答

这个附件我在之前已经下载试过了,但我说的问题是,“Xt、Yt、S以及z的值都没给出”。
你说的“还是不行”是什么概念?仍然是前面出现的错,还是说得到的结果不符合你预期?

追问

  还是不行,是指:


        其中:

       Xt=1050e6;

        Xc=1050e6;

        Yt=28e6;

        Yc=140e6;

        S=42e6;

追答

式子写错了,应该是:

[fz,fval]=fminbnd(inline(char(jie(i))),z(i),z(i+1))

我之前的回答少了一个括号,你给补上但补错了位置。我之所以搞错是因为,你传的MAT文件格式比较新,我上网的这台机器安装的R2008b不能正确加载,改用另一台不上网的机器(安装的R2012b)测试,查明原因之后没拷代码,直接凭印象输入的。

 

另外,你还是没给出z的值,所以我计算出的结果仍然没有参考意义。

追问

太业界良心了,好感动的感觉……这么晚了,我都不好意思麻烦你了……
z=[-1e-3,0,1e-3]

追答

我也是刚好有别的事在忙,碰巧回答的,不必客气。

就程序的写法而言,上面已经说了原因以及解决方法,没太多可补充的了;就现在的问题而言,求出来的jie本身有些问题:系数都太大,所以导致根本无法用数值方法进行优化。

我们举个例子来说:
>> [num,den]=numden(jie(2));
>> subs(num,0)
ans =
NaN
>> double(subs(num,sym(0)))
ans =
Inf
>> subs(den,0)
ans =
NaN
>> double(subs(den,sym(0)))
ans =
Inf
上面的代码说明,你把jie的分母和分子都分别代入Z=0,直接用subs代入的结果是NaN(非数),而按照符号0代入再转为浮点数,得到的Inf(无穷大),那么分子分母都是无穷大,相除的结果仍然是NaN。

我们再进一步考查一下到底分子分母都是什么。以分母为例
>> vpa(den,4)
ans =
1.813e499*Z^2 + 3.433e496*Z + 1.626e493

我们知道,双精度浮点数的最大表示范围为1.79769e+308,而现在分母取Z=0时的最后一项仍然是超过浮点数范围的,所以数值方法没办法直接处理。

还有没有别的办法呢?幸运的是,经过研究,我找到了一种可行的方法:把前面调用fminbnd的代码改成
f=@(x)double(subs(jie(i),sym(x)));
[fz,fval]=fminbnd(f,z(i),z(i+1)),
就可以了。其实基本思路就是,既然用浮点数直接计算目标函数存在困难,那么就用符号运算去做,完成之后再转换为浮点数。

就写这么多吧,业界良心也需要休息。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-11
最主要的问题在于,你的jie是sym对象追问

求问怎么办,似乎我很不适合编程……

matlab 隐函数求解出来结果很诡异,想用 fminbnd 求解 最小值,错误,具 ...
1、最主要的问题在于,你的jie是sym对象,不能用于fminbnd这类数值方法的优化程序。可以改成 [fz,fval]=fminbnd(inline(char(jie(i)),z(i),z(i+1));2、由于你现在的条件中,Xt、Yt、S以及z的值都没给出,我随便指定的值,虽然可以运行,但算出来的结果没什么意义。希望对你有帮助,有问题...

相似回答