MATLAB中syms类型的数值积分

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进行积分。 如何解决这个问题?


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

我的建议是

  • Plm内包含cos
  • 定义Plm以接受在功能范围之外定义的符号,function p=Plm(l,m,x)是所述符号x
  • 否则,以下方法将起作用。匿名函数必须返回一个数值,因此您应将函数subsdouble添加为:

    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);