2016-05-02 25 views
0

問題: N個の他の既知の関数g_1(t), ..., g_N(t)の線形結合として書くことができる関数f(t,N)を数値的に積分したいと思います。Pythonの関数オブジェクトの線形結合

私の解決策は、私は:私は機能を知っているg_iし、また係数、私の最初のアイデアは、係数の行ベクトルとg_i、その後はへの内積のためnp.dotを使用するラムダ関数を含む列ベクトルを作成することでしたので、私が望む関数オブジェクトを取得します。残念ながら、2つの関数オブジェクトを追加したり、関数オブジェクトにスカラーを掛けることはできません。

マイソリューションII:私は(基本的に私が何をしたいポイント賢明な定義)のような何かを行うことができます。もちろん、

def f(t,N,a,g): 
""" 
a = numpy array of coefficients 
g = numpy array of lambda functions corresponding to functions g_i 
""" 
    res = 0 
    for i in xrange(N): 
     res += a[i] * g[i](t) 
    return res 

しかしforループではなく、当然のことながら非常に大きい場合は特に:

  1. は、私は多くの多くの時間に、この機能を実行する必要があり、私はscipy.integrate.quadのような数値積分ルーチンには、この関数fを渡しトン
  2. 繰り返します。
+0

'g [i]'が多項式の場合は、あらかじめ多項式クラスを使って簡単に組み合わせることができます。しかし、そうでなければ、あなたはそれぞれを 't'のループで呼び出すことに悩まされていると思います。 –

+0

numexpr、cython、theanoまたはsympyの使用はどうですか? –

+0

@ PM2Ring:これらは正弦と余弦であり、L^2 [0,1]の切り捨てられた基底を形成します。だから、本当に一度にラムダ関数の配列を呼び出す方法はありませんか? – sbm

答えて

0

簡単に:

Cythonであなたがmemoryviewsを使用してインデックスをスピードアップすることができます。

これらの式は線形である場合は、sympy使用してそれらを重ね合わせることができます:私がしようとするといけないことができるように、

import sympy as sy 
x,y = sy.symbols('x y') 

g0 = x*0.33 + 6 
g1 = x*0.72 + 1.3 
g2 = x*11.2 - 6.5 
gn = x*3.3 - 7.3 

G = [g0,g1,g2,gn] 
#this is superimposition 
print sum(G).subs(x,15.1) 
print sum(gi.subs(x,15.1) for gi in G) 
''' 
output: 
228.305000000000 
228.305000000000 
''' 

あなたが望むものを、いくつかの例の入力と出力が得られていないその場合:

例を盲目になります...

low ram avaiableあなたはfinex方程式をnumexprにして、それを何らかの入力で評価することができます。さもなければnumpy配列で作業するのが最善です。

関連する問題