我正在尝试积分函数
I
,其中包含勒让德多项式leg_f
:
import math
import numpy as np
from mpmath import *
from sympy import *
from scipy.special import legendre
n = 3
c = lambda h_c,z,R : (z**2+h_c**2)**0.5
c_supp = lambda h_c,z,R : (z**2+h_c**2)**(-n)
x = lambda h_x,z,R : -4*R*(R-h_x)/c(h_x,z,R)**2
leg_f = lambda h_l,z,R : legendre(n-1,(1-0.5*x(h_l,z,R))/(1-x(h_l,z,R))**0.5)
f_f_symb = lambda h_v,z,R : hyper((n, 0.5), (1), (-4*R*(R-h_v)/(z**2+h_v**2)))
I = lambda h_i,z_i,R_i : c_supp(h_i,z_i,R_i)*(1-x(h_i,z_i,R_i))**(-n/2)*leg_f(h_i,z_i,R_i)
h_i,z_i,R_i = symbols('h_i z_i R_i')
int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, np.inf))
但我收到错误
Traceback (most recent call last):
File "test.py", line 99, in <module>
int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, np.inf))
File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/integrals/integrals.py", line 1276, in integrate
integral = Integral(*args, **kwargs)
File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/integrals/integrals.py", line 75, in __new__
obj = AddWithLimits.__new__(cls, function, *symbols, **assumptions)
File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/concrete/expr_with_limits.py", line 389, in __new__
obj.is_commutative = function.is_commutative # limits already checked
AttributeError: 'poly1d' object has no attribute 'is_commutative'
可能是什么问题?将此类功能集成到 sympy 中是否正确?
我可以看到您的代码存在一些问题:
legendre
函数。 SymPy 有自己的 legendre
函数,当您编写 from sympy import *
时会导入该函数。另外,如果您对符号结果感兴趣,则根本不应该使用 SciPy 或 NumPy。0.5
这样的十进制数字。相反,您应该使用 Rational(1,2)
,它是表示分数 1/2
的 SymPy 对象。inf
来表示无穷大,而不是使用 NumPy 的 oo
来表示无穷大。以下代码消除了上述问题,因此消除了您收到的原始错误。
from sympy import *
n = 3
c = lambda h_c,z,R : (z**2+h_c**2)**Rational(1,2)
c_supp = lambda h_c,z,R : (z**2+h_c**2)**(-n)
x = lambda h_x,z,R : -4*R*(R-h_x)/c(h_x,z,R)**2
leg_f = lambda h_l,z,R : legendre(n-1,(1-Rational(1,2)*x(h_l,z,R))/(1-x(h_l,z,R))**Rational(1,2))
I = lambda h_i,z_i,R_i : c_supp(h_i,z_i,R_i)*(1-x(h_i,z_i,R_i))**(-n*Rational(1,2))*leg_f(h_i,z_i,R_i)
h_i,z_i,R_i = symbols('h_i z_i R_i')
int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, inf))
不幸的是,SymPy 无法快速集成您拥有的功能。你的被积函数看起来像这样
简化后,看起来更容易一些,但 SymPy 似乎在尝试评估这个积分时陷入困境。
除非绝对需要符号结果,否则我建议对这个问题进行数值积分。