您好我正在编写Python代码,它返回相关的Legendre函数。 在这部分使用numpy poly1d函数,
firstTerm = (np.poly1d([-1,0,1]))**(m/2.0) # HELP!
它会产生错误,因为它只能被提升为整数。
还有其他替代方案,我可以提升所需的功能,以便为1/2等提供电源吗?
答案 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
处的两个函数的差异,并且在机器精度内明显为零。)