Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';poly1d';对象没有属性';是可交换的';_Python_Sympy_Polynomials_Integrate - Fatal编程技术网

Python 属性错误:';poly1d';对象没有属性';是可交换的';

Python 属性错误:';poly1d';对象没有属性';是可交换的';,python,sympy,polynomials,integrate,Python,Sympy,Polynomials,Integrate,我正在尝试集成函数I,它包含勒让德多项式leg\u 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

我正在尝试集成函数
I
,它包含勒让德多项式
leg\u 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'
回溯(最近一次呼叫最后一次):
文件“test.py”,第99行,在
int_result=integrate(I(h_I,z_I,R_I),(z_I,0,np.inf))
文件“/Users/Library/Python/2.7/lib/Python/site packages/sympy/integrals/integrals.py”,第1276行,在integrate中
积分=积分(*args,**kwargs)
文件“/Users/Library/Python/2.7/lib/Python/site packages/sympy/integrals/integrals.py”,第75行,在新的__
obj=AddWithLimits.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
文件“/Users/Library/Python/2.7/lib/Python/site packages/sympy/concrete/expr_with_limits.py”,第389行,新文件__
obj.is_可交换=函数.is_可交换#限制已检查
AttributeError:“poly1d”对象没有属性“是可交换的”

有什么问题吗?在Symphy中集成此类功能是否正确

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

  • 您不需要从SciPy导入
    legendre
    函数。Symphy有自己的
    legendre
    函数,当您从Symphy 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))
    
    不幸的是,尽管Symphy无法快速集成您拥有的功能。你的被积函数是这样的

    经过简化后,它变得更容易在眼睛上,但SymPy似乎陷入了试图计算这个积分

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