matlab问题,我编写的程序有人知道错哪了吗?详见问题补充

程序:symsz;r=250;l=500;forN=1:30c=N/pi/r^2;b=acos((l-z)./sqrt(l^2+r^2-2*l.*z));a=r^2.*(... 程序:
syms z;
r=250;
l=500;
for N=1:30
c=N/pi/r^2;
b=acos((l-z)./sqrt(l^2+r^2-2*l.*z));
a=r^2.*(acos(z/r)-z.*sqrt(r^2-z.^2)/r)+(l^2+r^2-2*l*z).*(b-sqrt((r^2-z.^2)./(l^2+r^2-2*l.*z)));
F=@(z)(2.*z.*l*c*b*exp(-c*a));
E(N)=quad(F,0,r);
end
plot(E,'-ok')
问题:
??? Undefined function or method 'isfinite' for input arguments of type 'sym'.
Error in ==> quad at 83
if ~isfinite(y(1))
有人能告诉我,我写的程序哪里错误吗?
展开
 我来答
tianxiawulang
2014-11-13 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2628万
展开全部

原因

在前面的代码中,a是一个关于z的符号表达式,这样导致匿名函数F也是一个符号表达式,而quad*系列函数是用来计算数值积分的,不能处理sym类型的表达式。

 

解决方法

1、把循环体斗缓余中最后两句

    F=@(z)(2.*z.*l*c*b*exp(-c*a));
    E(N)=quad(F,0,r);

改成

    F=2.*z.*l*c*b*exp(-c*a);
    E(N)=quadgk(@(z)double(subs(F)),0,r);

这种方法使用符号运算,效率比较低(在我的电脑上计算一步哪李平均需要大约10秒)。另外空滚,注意积分函数使用quadgk,用quad可能算不出。

 

2、把最后两句改成(和上一种方法仅最后一句不同)

    F=2.*z.*l*c*b*exp(-c*a);
    E(N)=quadgk(eval(['@(z)' vectorize(F)]),0,r);

这种方法效率比上一种高很多,我在同一台电脑上测试,全部计算完只需要1秒多一点的时间。但在2008b上会遇到一个莫名其妙的问题——pi被表示成大写的PI,导致计算出错,已知在2007b上没问题,其它版本的情况不清楚。

 

3、计算出的结果是随N按指数规律增大的,大约在N=16就超出了双精度浮点数的表示范围而得到无穷大。如果把纵轴按照对数分度,画出的曲线大致如下:

你确定这是你想要的结果?

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式