Numerical integration of the syms type in MATLAB
我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此,我需要使用" syms"类型,然后通过" diff"函数求导数。
1 2 3 4
| function p=Plm (l,m )
syms x
p = diff((x^ 2- 1)^l,m );
end |
然后,应使用该函数的输出" p"作为一个定积分,如
1 2
| fun = @ (x ) Plm (l,m ).* cos(x ).^ 2
integral (fun,- 1, 1) |
其中" l"和" m"可以用任何正整数代替。 Matlab给出了一个错误,即它无法与来自" p"的符号x进行积分。 如何解决这个问题?
-
我敢肯定,这是因为p是sym类型。 同样,您将给出给0的m区分为p,因为p不是m的功能。
-
什么是l? 请发布完整的示例。
-
@AnderBiguri,我对代码进行了更改。
-
@AminR。 brainkx是严厉的。 p不依赖于m,因此它应该为零(如果尝试,则为零)
-
同样,fun没有意义,其定义错误。
-
diff(fun,m)表示fun的第m个导数,有关集成过程,请参见mathworks.com/help/matlab/ref/integral.html。
-
我简化了代码的数学运算,以使我的观点清晰明了。
-
尝试int。 或者只是将Plm与double包装在一起。
问题是您对fun的定义,因为它没有返回数字输出。那么您在匿名函数中就有一个符号变量x和一个数字替换x(不相同)。这使事情变得复杂,因为Plm的符号输出返回的函数依赖于不再定义的符号,因为该符号是在函数工作区中创建的。这是一种非常糟糕的编程习惯,因为通常,您将无法在函数声明之外将其与更多符号x混合使用
我的建议是
在Plm内包含cos
定义Plm以接受在功能范围之外定义的符号,function p=Plm(l,m,x)是所述符号x。
否则,以下方法将起作用。匿名函数必须返回一个数值,因此您应将函数subs和double添加为:
1
| fun = @ (xin )double(subs (Plm (l,m ).* cos(x ).^ 2, 'x',xin )) |
这里的问题是cos(x)中的x不是符号,并且如果用xin代替它,由于subs的行为,它的行为将很奇怪。但是,我们可以使用symbar稍微修改一下,使用Plm所依赖的变量制作符号cos()。这将强制匿名函数对Plm进行两次评估(不好)。
简而言之,这可行:
1 2
| fun = @ (xin )double(subs (Plm (l,m ).* cos(symvar(Plm (l,m ))).^ 2,xin ));
integral (fun,- 1, 1); |