MATLAB 中 syms 类型的数值积分

Numerical integration of the syms type in MATLAB

我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此我需要使用 "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 进行积分的错误。解决这个问题的方法是什么?

问题是您对 fun 的定义,因为它 return 不是数字输出。那么你在匿名函数中有一个符号变量 xx 的数字替换(不相同)。这使事情变得复杂,因为 Plm return 的符号输出是一个依赖于不再定义的符号的函数,因为它是在函数工作区中创建的。这是一个非常糟糕的编程习惯,因为一般来说,您将无法在函数声明

之外将它与更多符号 x 混合

我的建议是

  1. 包括cos里面的Plm
  2. 定义 Plm 以接受在函数范围之外定义的符号,function p=Plm(l,m,x)x 所述符号。

否则以下将起作用。匿名函数必须 return 一个数值,所以你应该添加函数 subsdouble 作为:

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

这里的问题是 cos(x) 中的 x 不是一个符号,如果你用 xin 代替它,它会由于 [=22 的行为而表现得很奇怪=].但是,我们可以稍微修改一下,使用 Plm 所依赖的变量,通过使用 symbar 来创建一个符号 cos()。这将强制匿名函数计算 Plm 两次(这不好)。

简而言之,这有效:

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