2016-12-20 27 views
0

配列をODEに渡して、ODEINT関数を使用してそのODEを解決しようとしています。しかし、私は次のエラーを取得する:ここでSciPyのODEINT関数の配列入力

RuntimeError: The size of the array returned by func (50) does not match the size of y0 (1)

は私のサンプルコードは次のとおりです。

from scipy.integrate import odeint 
import numpy as np 
import matplotlib.pyplot as plt 


#First ODE 
def eq1 (x,t): 
    return (0.5*(x)+2*x**2) 

#Second ODE 
def eq2 (y,t,m): 
    p = np.sqrt(y)+m*y**2 
    return p 

t = np.linspace(0,1,50) 
IC = [2] # Initial Condition 
m = [0.1]*len(t) # A random variable 

#Solver for the first ODE 
one = odeint(eq1,IC,t) 
plt.plot (t,one) 

#Solver for the Second ODE 
two = odeint (eq2,IC,t,(m,)) 
plt.plot (t,two) 

最初のソルバーは正常に動作しますが、もう一つはエラーをスローします。このエラーメッセージに基づいて、私はICの次元が変数mの次元と同じではないことを理解しています。したがって、最初のODEのソルバーに関連する行をコメントアウトし、ICをIC = [2]*len(m)と変更すると、エラーメッセージが表示されなくなります。方法3、two.shapeは(50,50)です。私は解のどの次元(2つ)が実際の解答なのか分かりません。

私は本当にいくつかのガイダンスに感謝します。 ありがとうございました!

+0

解決しようとしている数学的な微分方程式を説明してください。私はそれが正しくPythonコードに翻訳されていないと思う。特に、 'm'は' eq2() 'で何を表していますか? 'm'の長さが' len(t) 'の値を0.1としたシーケンスを作成しましたが、コメントには"ランダム変数 "と書かれています。どのような意味で「ランダム」を意味しますか? –

+0

両方の方程式は完全に任意です - 私は方程式を構成しました。変数の1つが配列のときにODEINTを実装する方法を知りたいだけでした。 expの場合、 'm'は値0.1のみを含む配列ではなく、拍動性毛細血管血流を表す正弦波信号です。私は「ランダム変数」の代わりに「任意の信号」と言っていたと思います。間違った言葉を使いました。 – bluetooth

+0

*「exp」の場合、「m」は拍動性毛細血管血流を表す正弦波信号である可能性があります。*この場合、「m」は配列ではなく時間tの関数でなければなりません。 'eq2'のあなたのコードは' p = np.sqrt(y)+ m(t)* y ** 2'のようなものになり、 'm(t)'(スカラを返す関数)他の場所。 –

答えて

0

私の知る限り、配列をPythonのODE関数のパラメータとして渡す方法はありません。 Funnily十分に私はそれがMatlabで可能だと思います。あなたの問題を解決する唯一の方法は(しかし非効率的に)FORループを使うことです。