2017-12-16 11 views
-1

私は多項式ルジャンドルleg_f含む関数I、統合しようとしています:はAttributeError: 'poly1d' オブジェクトは、 'is_commutative' は属性を持っていない

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でそのような関数を統合するのは正しい方法ですか?

答えて

0

私は見ることができますあなたのコードを持ついくつかの問題があります。

  1. あなたはscipyのダウンロードからlegendre機能をインポートする必要はありません。 symPyには、from sympy import *を書くときにインポートされる独自のlegendre関数があります。また、象徴的な結果に興味がある場合は、SciPyやNumPyを使用しないでください。
  2. シンボリック計算が必要な場合は、コードに0.5のような10進数を書くべきではありません。代わりにRational(1,2)を使用してください。これは、分数1/2を表すSymPyオブジェクトです。
  3. 無限にNumPyのinfを使用する代わりに、無限にSympyの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は、この積分を評価しようと動けなくなるように思われる単純化した後、あなたの積分はこの

Original

のように見えます。

Simplified

シンボリックな結果が絶対に必要でない限り、私はこの問題の数値積分をお勧めします。

+0

ありがとうございます! – ani87

関連する問題