属性错误:“poly1d”对象没有属性“is_commutative”

问题描述 投票:0回答:1

我正在尝试积分函数

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 中是否正确?

python sympy polynomials symbolic-integration
1个回答
0
投票

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

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

除非绝对需要符号结果,否则我建议对这个问题进行数值积分。

© www.soinside.com 2019 - 2024. All rights reserved.