2016-09-21 4 views
0

私は関数H(t)が浮動小数点数を返しています。次に、この関数を含むいくつかの積分を数値的に計算したいと思います。しかし、積分のうちの1つは、基本的に、前の積分を呼び出す。将来の統合のために関数値を格納する

from scipy.integrate import quad 

def H(t): 
    return t 

def G1(t): 
    return quad(lambda x: H(x)*H(t-x),0,1)[0] 

def G2(t): 
    return quad(lambda x: G1(x)*H(t-x),0,1)[0] 

res = quad(G1,0,1) + quad(G2,0,1) 

私は、多数の機能のためにこれを行う必要があります(つまりG3、G4 ... Gnをして、次のように続ける)と私の最終結果は、それらのすべてに依存します。とにかくクワッド(G1,0,1)を実行するためには、とにかく多くのtの値に対してG1を計算しなければならないので、計算された値を保存してクワッド(G2,0,1)を計算するときに使用できますか?多分私自身の単純な統合関数を書こうとすることもできますが、これらの値を保存して再利用するにはどうすればいいですか?

+0

標準ライブラリの 'lru_cache'があります((https://docs.python.org/3.4/library/functools.html#functools.lru_cache)[ここを参照してください])それがこの問題の最良の方法であるかどうかはわかりません。あなたが計算しようとしている数式を変更することは可能ですか?すなわち、数式を紙に書いて、G1を一度評価する必要があるまで操作してみてください。 – syntonym

+0

@syntonym残念ながら(まだ)。私は基本的にこのプログラムを書いています。なぜなら、解析的に書き直す方法はまだ分かりませんし、いくつかの数値結果を見たいからです。 – Shinja

+0

それからlru_cacheは試してみる価値があると思います。私はscipyがいかに正確に統合されているのかは分かりませんが、関数呼び出しをキャッシュしています。たぶん、あなたは本当にあなたが望むすべてをキャッシュするために、少しキャッシュサイズを微調整する必要があります。 – syntonym

答えて

0

私はそれがlru_cacheと全く同じですが、私はすでにそれを書いているので、同様に共有可能性があります推測:

def store_result(func): 
    def remember(t): 
     if t not in func.results: 
      func.results[t] = func(t) 
     return func.results[t] 
    setattr(func, 'results', {}) # make dictionary to store results 
    return remember 

これは、彼らがで呼び出されたときに、それらを辞書と取得するために、結果を格納する機能を変更するデコレータです同じ議論。ニーズに合わせて変更することができます。

用法:

@store_result 
def G1(t): 
    return quad(lambda x: H(x)*H(t-x),0,1)[0] 
+0

lru_cacheが解決しても、これは私が探していた解決策のタイプであり、将来どのように書くことができるかを示してくれます。 – Shinja

関連する問題