MATLAB中syms类型的数值积分

时间:2016-02-03 14:44:28

标签: matlab integration symbolic-math

我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此我需要使用" syms"输入" diff"功能。

function p=Plm(l,m)
syms x    
p = diff((x^2-1)^l,m);
end

然后该函数的输出" p"应该用来取一个明确的积分

fun = @(x) Plm(l,m).*cos(x).^2
integral(fun,-1,1)

其中" l"和" m"可以用任何正整数代替。 Matlab给出的错误是它无法集成到来自" p"的符号x上。解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:0)

问题在于您对fun的定义,因为它没有返回数字输出。那么你在匿名函数中有一个符号变量x和一个数字替换x(不一样)。这使得事情变得复杂,因为Plm的符号输出返回一个依赖于未定义的符号的函数,因为它是在函数工作区中创建的。这是一个非常糟糕的编程习惯,因为一般情况下,你不能将它与函数声明之外的更多符号x混合使用

我的建议是

  1. cos
  2. 中加入Plm
  3. 定义Plm以接受在功能范围之外定义的符号,function p=Plm(l,m,x)x所述符号。
  4. 否则以下内容将起作用。匿名函数必须返回一个数值,因此您应该将函数subsdouble添加到其中:

    fun = @(xin)double(subs(Plm(l,m).*cos(x).^2,'x',xin))
    

    此处的问题是x中的cos(x)不是符号,如果您用xin替换它,由于subs的行为,它会表现得很奇怪。但是,我们可以通过使用cos()使用Plm所依赖的变量来制作符号symbar。这将强制匿名函数评估Plm两次(这不好)。

    简而言之,这有效:

    fun = @(xin)double(subs(Plm(l,m).*cos(symvar(Plm(l,m))).^2,xin));
    integral(fun,-1,1);