2017-05-07 9 views
1

を使ってscipy.optimize.broyden2を使用します。scipy.optimize.broyden2を使用したいのですが、問題は私の関数が単に引数を配列として取るのではなく、より多くのパラメータを取ることです。いくつかのパラメータを受け取る関数

どうすればよいですか?グローバル変数を定義しますか?

これらは私の関数です:

def F(S, I, R, alpha, beta): 
    return [- beta * S * I, beta * S * I - alpha * R, alpha * R] 

def euler(xi, xf, m, F, initial_values, alpha, beta): 
    h = (xf - xi)/m 

    t = np.linspace(xi, xf, m + 1) 
    t = np.delete(t, 0) 

    vect_y = [initial_values[0], initial_values[1], initial_values[2]] 

    for i in range(len(t)): 
     y_actual = [sum(x) for x in zip(vect_y, [element * h for element in F(vect_y[0], vect_y[1], vect_y[2], alpha, beta)])] 
     vect_y = y_actual 

    return vect_y 

私はx0initial_valuesだろうeuler、とbroyden2を使用したいです。

+0

は、一般的にPython的ソリューションではありません。 Pythonicの解決策は、おそらくあなたのパラメータを取る関数を定義し、 'scipy.optimize.broyden2'を使用する配列を作成し、' scipy.optimize.broyden2'の結果を返します。しかし、あなたのパラメータや問題について何も知らなくても、もっと言い表すのは難しいです。 –

+0

* argsなどを使用するようにリファクタリングすることができます。現在のコードを表示できますか?理論工学には難しいが、実際の問題を見る方が良い。 – mwm314

+0

@ mwm314私の機能を追加しました。 – OiciTrap

答えて

1

コメントで示唆したように、*list構文を使用して引数のリストをアンパックする補助関数を使用して、main関数を呼び出すことができます。最小の例を下に示します。fは、ルートが見つかっている関数です。

from scipy.optimize import broyden2 
def f(x, y, z): 
    return [x-1, y-2, z-3] 
broyden2(lambda X: f(*X), [0, 0, 0]) 

出力:グローバル変数を定義するarray([ 1., 2., 3.])

関連する問題