相关的勒让德功能

时间:2016-03-12 02:52:53

标签: python numpy

您好我正在编写Python代码,它返回相关的Legendre函数。 在这部分使用numpy poly1d函数,

firstTerm = (np.poly1d([-1,0,1]))**(m/2.0) # HELP!

它会产生错误,因为它只能被提升为整数。

还有其他替代方案,我可以提升所需的功能,以便为1/2等提供电源吗?

1 个答案:

答案 0 :(得分:3)

你不能将poly1d提升到半整数幂的原因是它不是多项式,因为它包含平方根。

虽然原则上你可以自己对函数进行正交化,或者从sympy.special.legendre这样的函数构造函数,但你最安全的赌注是符号数学。嘿,我们已经sympy.functions.special.polynomials.assoc_legendre了!由于符号数学很慢,您应该使用sympy.lambdify将每个函数转换为数字函数:

import sympy as sym

x = sym.symbols('x')
n = 3
m = 1
legfun_sym = sym.functions.special.polynomials.assoc_legendre(n,m,x)
legfun_num = sym.lambdify(x,legfun_sym)

print(legfun_sym)
print(legfun_num)
x0 = 0.25
print(legfun_sym.evalf(subs={x:x0}) - legfun_num(x0))

打印

-sqrt(-x**2 + 1)*(15*x**2/2 - 3/2)
<function <lambda> at 0x7f0a091976e0>
-1.11022302462516e-16

似乎有意义(第一个是x处的符号函数,第二个表示lambdify确实从函数创建了lambda,最后一个是数字伪随机点x0 = 0.25处的两个函数的差异,并且在机器精度内明显为零。)