AttributeError: 'poly1d' object has no attribute 'is_commutative'
AttributeError: 'poly1d' object has no attribute 'is_commutative'
我正在尝试对函数 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 中集成这样的功能是正确的方法吗?
我看到您的代码存在一些问题:
- 您不需要从 SciPy 导入
legendre
函数。 SymPy 有自己的 legendre
函数,当你写 from sympy import *
时它会被导入。此外,如果您对符号结果感兴趣,则根本不应使用 SciPy 或 NumPy。
- 如果你想要符号计算,你不应该在你的代码中写像
0.5
这样的十进制数。相反,您应该使用 Rational(1,2)
,它是代表分数 1/2
. 的 SymPy 对象
- 您应该使用 Sympy 的
oo
来代替 NumPy 的 inf
来获得无穷大。
以下代码消除了上述问题,因此消除了您遇到的原始错误。
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 似乎在尝试评估这个积分时卡住了。
除非符号结果是绝对必要的,否则我建议对此问题进行数值积分。
我正在尝试对函数 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 中集成这样的功能是正确的方法吗?
我看到您的代码存在一些问题:
- 您不需要从 SciPy 导入
legendre
函数。 SymPy 有自己的legendre
函数,当你写from sympy import *
时它会被导入。此外,如果您对符号结果感兴趣,则根本不应使用 SciPy 或 NumPy。 - 如果你想要符号计算,你不应该在你的代码中写像
0.5
这样的十进制数。相反,您应该使用Rational(1,2)
,它是代表分数1/2
. 的 SymPy 对象
- 您应该使用 Sympy 的
oo
来代替 NumPy 的inf
来获得无穷大。
以下代码消除了上述问题,因此消除了您遇到的原始错误。
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 似乎在尝试评估这个积分时卡住了。
除非符号结果是绝对必要的,否则我建议对此问题进行数值积分。