MATLAB 中 syms 类型的数值积分

问题描述 投票:0回答:1

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

matlab symbolic-math numerical-integration
1个回答
0
投票

问题在于您对

fun
的定义,因为它不返回数字输出。那么匿名函数中就有一个符号变量
x
和一个数字替换
x
(不相同)。这使事情变得复杂,因为
Plm
的符号输出返回一个函数,该函数依赖于不再定义的符号,因为它是在函数工作区中创建的。这是一种非常糟糕的编程实践,因为一般来说,您无法将其与函数声明之外的更多符号
x
混合在一起

我的建议是

  1. cos
    包含在
    Plm
  2. 定义
    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);
© www.soinside.com 2019 - 2024. All rights reserved.