vansen 发表于 2008-7-24 15:57

讨论一下两种quad积分方式

本人最近刚学MATLAB,在学习ik760218转帖的MATLAB 小技巧的时候发现了一下问题,还请大虾们指点一二,原帖地址:http://forum.vibunion.com/thread-2588-1-3.html

方法一:

m=5;
a = m;
b = m + 1;
K = m.^2;
y = subs('sin(K*x)/x', 'K', sym(K, 'd') )
quad( inline(vectorize(char(y))), a, b)

y =

sin(25.*x)/x


ans =
    0.0016


方法二:

m=5;
a = m;
b = m + 1;
K = m.^2;
sym x;
l=sin(K*x)/x;
y = subs('l', 'K', sym(K, 'd') );
quad( inline(vectorize(char(y))), a, b)
ans =
    5.5000


两个的计算结果为什么相差这么大呢?百思不得其解,还请各位大大指点!

sigma665 发表于 2008-7-24 17:41

回复 楼主 的帖子

第2种是错的
y = subs('l', 'K', sym(K, 'd') );
无法自动识别l=sin(K*x)/x;
因为相当于重新定义了一个字符型l,把原来的覆盖了

vansen 发表于 2008-7-24 19:12

谢谢sigma665!
要是我被积的函数很复杂,比如不止3个参数( a,b,k )是在运行时确定的,可能有10+个,难道对于每一个不确定的参数都要用y = subs('sin(K*x)/x', 'K', sym(K, 'd') )运行一下,再求积分吗?

编了个有很多参数的程序,运行时报Not enough inputs to inline function.


a=1;
b=2;
c=3;
x=a+b;
y=a+c;
z=a*b;
m = subs('x*y*z*k', 'x', sym(x, 'd'));
m = subs('x*y*z*k', 'y', sym(y, 'd'));
m = subs('x*y*z*k', 'z', sym(z, 'd'));
quad( inline(vectorize(char(m))), a, b)

??? Error using ==> inline.subsref at 14
Not enough inputs to inline function.
Error in ==> quad at 71
y = f(x, varargin{:});

[ 本帖最后由 vansen 于 2008-7-24 19:39 编辑 ]

rocwoods 发表于 2008-7-24 20:00

举个例子:
计算a*sin(x)+b*sqrt(log(x))+c^2*d这个表达式在x=10,20的积分。
%经过大量计算得到a,b,c,d的值后
譬如a=1,b=2,c=3,d=4

定义f=@(x) a.*sin(x)+b.*sqrt(log(x))+c.^2.*d
quad(f,10,20)
即可
注:@是匿名函数声明符号,7.0以上版本支持

vansen 发表于 2008-7-25 09:36

问题解决了,谢谢各位热心的前辈们!
刚来这里不久,发现这里的学术氛围非常好,给新手们总结的索引贴真的非常好,而且对于每一个问题总有很多热心的人来帮忙解决,很有一种家的温馨的感觉。希望赶快成长,希望能有为大家服务的时候:@)
页: [1]
查看完整版本: 讨论一下两种quad积分方式