MATLAB中syms型的数值积分

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进行积分。解

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

问题在于您对
乐趣的定义,因为它不会返回数字输出。然后在匿名函数中有一个符号变量
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
    没有意义,它的定义是错误的。