【问题标题】:Numerical integration of the syms type in MATLABMATLAB中syms类型的数值积分
【发布时间】:2016-05-12 19:53:26
【问题描述】:

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

【问题讨论】:

  • 我确定,这是因为 p 的类型为 sym。此外,您将p 与给出0m 区分开来,因为p 不是m 的函数。
  • 什么是l?请发布完整的示例。
  • @AnderBiguri,我修改了代码。
  • @AminR。 Brainkx 是正确的。 p 不依赖于 m,因此它应该是零(如果你尝试的话,它是零)
  • 另外fun 没有意义,它的定义错误。

标签: matlab integration symbolic-math


【解决方案1】:

问题在于您对fun 的定义,因为它不返回数字输出。那么你在匿名函数中有一个符号变量xx 的数字替换(不一样)。这使事情变得复杂,因为Plm 的符号输出返回一个函数,该函数依赖于一个不再定义的符号,因为它是在函数工作区中创建的。这是一个非常糟糕的编程习惯,一般来说,你不能在函数声明之外将它与更多符号x 混合使用

我的建议是

  1. Plm 中包含cos
  2. 定义Plm以接受定义在函数范围之外的符号,function p=Plm(l,m,x)x所述符号。

否则以下将起作用。匿名函数必须返回一个数值,因此您应该将函数subsdouble 添加到其中:

fun = @(xin)double(subs(Plm(l,m).*cos(x).^2,'x',xin))

这里的问题是cos(x) 中的x 不是一个符号,如果你用xin 代替它,由于subs 的行为,它的行为会很奇怪。但是,我们可以稍微修改一下,通过使用symbar 使用Plm 所依赖的变量来创建符号cos()。这将强制匿名函数评估Plm 两次(这不好)。

简而言之,这是可行的:

fun = @(xin)double(subs(Plm(l,m).*cos(symvar(Plm(l,m))).^2,xin));
integral(fun,-1,1);

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2014-06-12
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多