我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此我需要使用" 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上。解决这个问题的方法是什么?
答案 0 :(得分:0)
问题在于您对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);