MATLAB中syms型的数值积分
我使用的是勒让德多项式的生成函数(不管它是什么数学实体),为此,我需要使用“syms”类型,然后通过“diff”函数进行导数MATLAB中syms型的数值积分,matlab,integration,symbolic-math,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进行积分。解
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进行积分。解决这个问题的方法是什么?问题在于您对
乐趣的定义,因为它不会返回数字输出。然后在匿名函数中有一个符号变量x
和一个数字替换x
(不同)。这使得事情变得复杂,因为Plm
的符号输出返回的函数依赖于在函数工作区中创建的不再定义的符号。这是一种非常糟糕的编程实践,通常情况下,您无法将其与函数声明之外的更多符号x
混合使用
我的建议是
包括cos
内部Plm
定义Plm
以接受在功能范围外定义的符号,功能p=Plm(l,m,x)
是x
所述符号
否则,以下操作将起作用。匿名函数必须返回一个数值,因此应将函数subs
和double
添加到其中,如下所示:
fun = @(xin)double(subs(Plm(l,m).*cos(x).^2,'x',xin))
这里的问题是cos(x)
中的x
不是一个符号,如果用xin
替换它,由于subs
的行为,它的行为会异常。但是,我们可以稍微修改一下,使用Plm
所依赖的变量,通过使用symbar
生成一个符号cos()
。这将强制匿名函数对Plm求值两次(这不好)
简言之,这是可行的:
fun = @(xin)double(subs(Plm(l,m).*cos(symvar(Plm(l,m))).^2,xin));
integral(fun,-1,1);
我敢肯定,这是因为p
属于sym
类型。另外,您可以根据给出0
的m
来区分p
,因为p
不是m
的函数。什么是l
?请发布完整的示例。@AnderBiguri,我对代码做了更改。@Amir。brainkx是正确的p
不依赖于m,因此它应该是零(如果您尝试的话,它是零)而且fun
没有意义,它的定义是错误的。