2017-05-01 9 views
2

の限界として、私は各要素に0からそれを統合したいIは(またscipyのダウンロードとnumpyの使用)Pythonで機能を有する統合

import numpy as np 
from scipy import integrate 
LCDMf = lambda x: 1.0/np.sqrt(0.3*(1+x)**3+0.7) 

として定義numpyの配列の各要素と機能を統合numpyの配列は、より速く、efficienがあれば、私は思っていた私は、私が

an=integrate.quad(LCDMf,0,z[i]) 

しかし等を介して反復要素ごとにループを書くことができます知っているz = np.arange(0,100)

を言います各numpy要素でこれを行うt(そしてより簡単な)方法。

+0

私はずっと前にこの問題をnp.vectorizeメソッドを使って解決しました。私はどうやってそれをやったのかを思い出すことはできません...しかし、それは当時の普遍的な解決策のように思え、私のために働いていました。誰もそれに光を投げて同様の方向に解決することができますか? –

+0

'np.vectorize'は関数呼び出しで繰り返しをラップします。それはあなたのコードをスピードアップしません。 – hpaulj

+0

私は何とかnumpy配列で動作するために使用しました...高速化のためのものではありません –

答えて

1

np.vectorizeで修正したところ、次の解決法が見つかりました。シンプルでエレガントな作品です!

import numpy as np 
from scipy import integrate 
LCDMf = lambda x: 1.0/math.sqrt(0.3*(1+x)**3+0.7) 
np.vectorize(LCDMf) 

def LCDMfint(z): 
    return integrate.quad(LCDMf, 0, z) 

LCDMfint=np.vectorize(LCDMfint) 
z=np.arange(0,100) 

an=LCDMfint(z) 
print an[0] 

このメソッドは、ソートされていないフロートアレイまたは私達はそれで投げるとodeintの方法のように任意の初期条件をないもので動作します。

私はこれが誰かのどこかでも役立つことを願っています...あなたの意見をお寄せいただきありがとうございます。

0

より効率的に行うことは間違いありません。最終的に何を持っていることは一連の計算である:

  1. 0から3
にLCDMfを統合0から2
  • にLCDMfを統合0から1
  • にLCDMfを統合します

    だから、あなたが行うことができます非常にまず最初に、(結局、統合は他に何である!)の異なる部分区間を統合し、それらを合計し、それを変更です:

    1. のInt egrate LCDMf 0から1
    2. 隣あなたが飛び込むことができ、ステップ2

    からの結果を追加し、2〜3 LCDMf統合ステップ1

  • からの結果を追加し、1から2までLCDMfを統合

    dx = 0.0001 
    x = np.arange(0, 100, dx) 
    y = LCDMf(x) 
    
    :あなたは即座に多くのポイントでこの機能を評価するためにnumpyの放送を使用することができます

    1.0/np.sqrt(0.3*(1+x)**3+0.7) 
    

    :このように定義されLCDMf、

    これはかなり速くなければならず、曲線上に100万ポイントを与えます。これで、scipy.integrate.trapz()または関連する関数の1つを使用して統合することができます。各インターバルを統合する上のワークフローを使用して、すでに計算されたyとdxでこれを呼び出し、cumsum()を使用して最終結果を取得します。あなたがループで呼び出す必要がある唯一の機能は、インテグレータそのものです。

  • +0

    あなたの解決策にはあまり追いつかなかったかもしれません。 0〜1、0〜2などがその例である。必ずしも等間隔である必要はなく、整数である必要はない。だから、z = [0.1、0.15、0.367、0.265 ...]と言います。 –

    +0

    あなたは 'z = np.arange(0,100)'と言っていますが、もし他の 'z'があればそれを最初にソートすれば解決できます - 0から最小の' z'値まで単純に統合してから'z'から次の最小の' z'などに変更します。 –

    4

    ODEとして問題を言い換えることができます。

    enter image description here

    odeint

    関数は、z一連のF(z)を計算するために使用することができます。

    >>> scipy.integrate.odeint(lambda y, t: LCDMf(t), 0, [0, 1, 2, 5, 8]) 
    array([[ 0.  ], # integrate until z = 0 (must exist, to provide initial value) 
         [ 0.77142712], # integrate until z = 1 
         [ 1.20947123], # integrate until z = 2 
         [ 1.81550912], # integrate until z = 5 
         [ 2.0881925 ]]) # integrate until z = 8 
    
    +0

    面白い回避策。しかし、初期状態の値が「0」になることは制限的なことであり、普遍的には見えません。たとえば、もし私がzとの積分を0.1から0.5まで変化させたいとすれば、 –

    +0

    @RohinKumarあなたはいつも[prepend](http://stackoverflow.com/questions/36998260/prepend-element-to-numpy-array)a 0することができます。 – kennytm

    関連する問題