配列を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つ)が実際の解答なのか分かりません。
私は本当にいくつかのガイダンスに感謝します。 ありがとうございました!
解決しようとしている数学的な微分方程式を説明してください。私はそれが正しくPythonコードに翻訳されていないと思う。特に、 'm'は' eq2() 'で何を表していますか? 'm'の長さが' len(t) 'の値を0.1としたシーケンスを作成しましたが、コメントには"ランダム変数 "と書かれています。どのような意味で「ランダム」を意味しますか? –
両方の方程式は完全に任意です - 私は方程式を構成しました。変数の1つが配列のときにODEINTを実装する方法を知りたいだけでした。 expの場合、 'm'は値0.1のみを含む配列ではなく、拍動性毛細血管血流を表す正弦波信号です。私は「ランダム変数」の代わりに「任意の信号」と言っていたと思います。間違った言葉を使いました。 – bluetooth
*「exp」の場合、「m」は拍動性毛細血管血流を表す正弦波信号である可能性があります。*この場合、「m」は配列ではなく時間tの関数でなければなりません。 'eq2'のあなたのコードは' p = np.sqrt(y)+ m(t)* y ** 2'のようなものになり、 'm(t)'(スカラを返す関数)他の場所。 –