我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此我需要使用“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
的定义,因为它不返回数字输出。那么匿名函数中就有一个符号变量 x
和一个数字替换 x
(不相同)。这使事情变得复杂,因为 Plm
的符号输出返回一个函数,该函数依赖于不再定义的符号,因为它是在函数工作区中创建的。这是一种非常糟糕的编程实践,因为一般来说,您无法将其与函数声明之外的更多符号x
混合在一起
我的建议是
cos
包含在 Plm
Plm
以接受在函数范围之外定义的符号,function p=Plm(l,m,x)
是 x
所述符号。否则以下内容将起作用。匿名函数必须返回一个数值,因此您应该将函数
subs
和 double
添加到其中:
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);