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 中集成这样的功能是正确的方法吗?

我看到您的代码存在一些问题:

  1. 您不需要从 SciPy 导入 legendre 函数。 SymPy 有自己的 legendre 函数,当你写 from sympy import * 时它会被导入。此外,如果您对符号结果感兴趣,则根本不应使用 SciPy 或 NumPy。
  2. 如果你想要符号计算,你不应该在你的代码中写像 0.5 这样的十进制数。相反,您应该使用 Rational(1,2),它是代表分数 1/2.
  3. 的 SymPy 对象
  4. 您应该使用 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 似乎在尝试评估这个积分时卡住了。

除非符号结果是绝对必要的,否则我建议对此问题进行数值积分。