3

我尝试使用在 Matlab 中评估Pochhammer 符号(上升阶乘)的脚本,但它无法评估pochhammer(x,n)任何时候x是负数,即使表达式在负数时有效x(Wolfram Alpha 和 Mathematica 给出答案Pochhammer(-3,2))。

任何人都可以帮我pochhammer在 Matlab 中工作以解决负面论点吗?

4

2 回答 2

8

我假设您指的是这个 Pochhammer 函数。请注意,pochhammer(未大写)是MuPAD的一部分,它是 Matlab 的Symbolic Math Toolbox提供的单独环境。mupad您可以通过在 Matlab 命令窗口中键入来访问 MuPAD 。

但是,如果像普通的 Matlab 用户一样,您希望使用pochhammerMatlab 本身的函数并使用它进行编程,则您无法从常规命令窗口或编辑器以正常方式运行它,正如您所发现的那样。相反,您必须使用

evalin(symengine,'pochhammer(-3,2)')

或更灵活

feval(symengine,'pochhammer',-3,2)

在这里查看更多。它们都返回符号数字作为结果,并且仅适用于标量输入。如果您需要双精度输出并具有矢量输入(仅适用于第二个,n)使用

mfun('pochhammer',-3,-3:3)

这相当于使用 MuPAD 的map功能,所以你也可以这样写:

feval(symengine,'map',sym(-3:3),'n->pochhammer(-3,n)')


但是,如果您根本不使用符号数学,则可能没有理由使用此函数来代替完全双精度的解决方案。Pochhammer符号被简单地定义为两个gamma函数的比率,并且可以有效地实现为(x并且n必须是相同的维度或标量 - 此外,既不是xx-n不能是小于或等于零的整数,其中伽马函数是奇异的) :

poch = @(x,n)gamma(x+n)./gamma(x);

如果nx是整数,您应该使用它round来确保输出完全是整数。唯一的陷阱是,对于足够大的值x和/或n这种天真的实现将溢出到Inf(或NaN)。在这些情况下,您需要执行其他操作,例如使用符号版本(Inf在转换回双精度时可能会或可能不会返回)。对于n(和标量n>=0)的整数值,可以使用以下内容

poch = @(x,n)prod(bsxfun(@plus,x(:),0:n-1),2);

请注意,即使对于整数,这也可能比gamma版本慢 20 倍。

于 2013-08-08T21:06:21.577 回答
1

Matlab的数字命令pochhammer(不是 MuPAD)是在 matlab 版本 R2014b 中引入的。

于 2015-10-15T09:35:38.930 回答