MATLAB 中 syms 类型的数值积分
Numerical integration of the syms type in MATLAB
我正在使用勒让德多项式的生成函数(无论它是什么数学实体),为此我需要使用 "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 进行积分的错误。解决这个问题的方法是什么?
问题是您对 fun
的定义,因为它 return 不是数字输出。那么你在匿名函数中有一个符号变量 x
和 x
的数字替换(不相同)。这使事情变得复杂,因为 Plm
return 的符号输出是一个依赖于不再定义的符号的函数,因为它是在函数工作区中创建的。这是一个非常糟糕的编程习惯,因为一般来说,您将无法在函数声明
之外将它与更多符号 x
混合
我的建议是
- 包括
cos
里面的Plm
- 定义
Plm
以接受在函数范围之外定义的符号,function p=Plm(l,m,x)
是 x
所述符号。
否则以下将起作用。匿名函数必须 return 一个数值,所以你应该添加函数 subs
和 double
作为:
fun = @(xin)double(subs(Plm(l,m).*cos(x).^2,'x',xin))
这里的问题是 cos(x)
中的 x
不是一个符号,如果你用 xin
代替它,它会由于 [=22 的行为而表现得很奇怪=].但是,我们可以稍微修改一下,使用 Plm
所依赖的变量,通过使用 symbar
来创建一个符号 cos()
。这将强制匿名函数计算 Plm
两次(这不好)。
简而言之,这有效:
fun = @(xin)double(subs(Plm(l,m).*cos(symvar(Plm(l,m))).^2,xin));
integral(fun,-1,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 进行积分的错误。解决这个问题的方法是什么?
问题是您对 fun
的定义,因为它 return 不是数字输出。那么你在匿名函数中有一个符号变量 x
和 x
的数字替换(不相同)。这使事情变得复杂,因为 Plm
return 的符号输出是一个依赖于不再定义的符号的函数,因为它是在函数工作区中创建的。这是一个非常糟糕的编程习惯,因为一般来说,您将无法在函数声明
x
混合
我的建议是
- 包括
cos
里面的Plm
- 定义
Plm
以接受在函数范围之外定义的符号,function p=Plm(l,m,x)
是x
所述符号。
否则以下将起作用。匿名函数必须 return 一个数值,所以你应该添加函数 subs
和 double
作为:
fun = @(xin)double(subs(Plm(l,m).*cos(x).^2,'x',xin))
这里的问题是 cos(x)
中的 x
不是一个符号,如果你用 xin
代替它,它会由于 [=22 的行为而表现得很奇怪=].但是,我们可以稍微修改一下,使用 Plm
所依赖的变量,通过使用 symbar
来创建一个符号 cos()
。这将强制匿名函数计算 Plm
两次(这不好)。
简而言之,这有效:
fun = @(xin)double(subs(Plm(l,m).*cos(symvar(Plm(l,m))).^2,xin));
integral(fun,-1,1);