在Matlab中使用Pochhammer符号

Ale*_*les 3 math matlab symbolic-math mupad

我试图在Matlab中使用一个评估Pochhammer符号(上升阶乘)的脚本,但是即使表达式是负的(Wolfram Alpha和Mathematica给出答案),它也无法评估pochhammer(x,n)何时x为负数.xPochhammer(-3,2)

任何人都可以帮助我pochhammer在Matlab中进行负面论证吗?

hor*_*ler 8

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

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

evalin(symengine,'pochhammer(-3,2)')
Run Code Online (Sandbox Code Playgroud)

或者更灵活

feval(symengine,'pochhammer',-3,2)
Run Code Online (Sandbox Code Playgroud)

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

mfun('pochhammer',-3,-3:3)
Run Code Online (Sandbox Code Playgroud)

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

feval(symengine,'map',sym(-3:3),'n->pochhammer(-3,n)')
Run Code Online (Sandbox Code Playgroud)


但是,如果您根本不使用符号数学,则可能没有理由使用此函数而不是完全双精度解决方案.的阶乘幂被简单地定义为两个的比率gamma的功能,并且可以作为有效地实现(xn必须是相同的尺寸或标量-附加地,既不x也不x-n可以是小于或等于零,其中,所述的整数伽马函数是单数) :

poch = @(x,n)gamma(x+n)./gamma(x);
Run Code Online (Sandbox Code Playgroud)

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

poch = @(x,n)prod(bsxfun(@plus,x(:),0:n-1),2);
Run Code Online (Sandbox Code Playgroud)

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