2017-02-18 4 views
0

私はPythonを学び始めています(これはPythonスクリプトでの私の最初の試みです)。私は次の方程式h2o + co2 < - > o2 + ch2oの化合物の濃度がどのように結びついているかを示す一連の微分方程式を解いてグラフ化しようとしています。私は、スクリプト実行時に普通微分方程式インデックスエラー

は、しかし:

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

y=[3.0,1.0,3.0,1.0] 
g=15 
i=25 
tspan= np.linspace(0,5,100) 

# h2o+co2 <-> o2+ch2o 
def chemanalysis(y,t): 

    x =i*math.sin(math.pi*t/12)**2 

    dydt= -x*(y[0]*y[1]) + g*(y[2]*y[3]) #co2 
    dydt= -x*(y[0]*y[1]) + g*(y[2]*y[3]) #h2o 
    dydt= x*(y[0]*y[1]) - g*(y[2]*y[3]) #o2 
    dydt= x*(y[0]*y[1]) - g*(y[2]*y[3]) #ch2o 


    return dydt 


y=odeint(chemanalysis,1,tspan) 

print(y) 

を私は次のエラーを取得する:

Traceback (most recent call last): 
File "first.py", line 25, in <module> 
     y=odeint(chemanalysis,1,tspan) 
     ixpr, mxstep, mxhnil, mxordn, mxords) 
     File "first.py", line 16, in chemanalysis 
     dydt= -x*(y[0]*y[1]) + g*(y[2]*y[3]) #co2 
    IndexError: index 1 is out of bounds for axis 0 with size 1 

私は、これはおそらくのpythonでの経験の私の不足によってもたらされた非常に単純な問題である知っています/一般的なプログラミング。私が間違っている箇所やこのコードを改善できる箇所については、本当に助けていただきたいと思います。私はいくつかの他の同様の問題を読んだ/他のスレッドでエラーメッセージが、私は自分自身で問題を解決することができませんでした。私はグラフのコンポーネントがこのスクリプトに現在添付されていないことを知っています、私はこの問題を最初に解決するまで待つことになりました。

よろしく

+0

'y = odeint(chemanalysis、1、tspan)'で引数に '1'を指定すると、' chemanalysis '関数に実際に入りたいので、リストと見なされる整数を与えます'。このエラーが発生しました。 – Kanak

答えて

1

ありますが、ここでやりたい二つのものです:

変更y=odeint(chemanalysis, 1, tspan)y2=odeint(chemanalysis, y, tspan)

にし、仕事へのodeintのために、あなたはyと同じサイズのリストを返す必要があります。

def chemanalysis(y,t): 
    x =i*math.sin(math.pi*t/12)**2 

    dydt = [] 

    dydt.append(-x*(y[0]*y[1]) + g*(y[2]*y[3])) #co2 
    dydt.append(-x*(y[0]*y[1]) + g*(y[2]*y[3])) #h2o 
    dydt.append(x*(y[0]*y[1]) - g*(y[2]*y[3])) #o2 
    dydt.append(x*(y[0]*y[1]) - g*(y[2]*y[3])) #ch2o 


    return dydt 

簡潔にするために、このように見えるようになりました。


あなたはchemanalysisappendを使用する必要がある理由についてもう少し説明:

dydt= -x*(y[0]*y[1]) + g*(y[2]*y[3]) #co2 
dydt= -x*(y[0]*y[1]) + g*(y[2]*y[3]) #h2o 
dydt= x*(y[0]*y[1]) - g*(y[2]*y[3]) #o2 
dydt= x*(y[0]*y[1]) - g*(y[2]*y[3]) #ch2o 

return dydt 

上記はちょうどあなたがに出失っている、#ch2oで最後に割り当てられた値としてdydtを返します他のデータと毎回dydt書き換えます。代わりにそれをリストにしてください。odeintはあなたにとにかくそれが必要です。

+0

あなたの超高速応答に感謝します。私はy =を使うのがなぜ間違っているのか理解していますが、関数にappendを追加した理由を教えてもらえますか? – AW1991

+1

@ AW1991これは、odeint関数https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.integrate.odeint.htmlの実装の必要性です。 また、 'dydt 'に複数回割り当てているときは、変数を上書きして情報を失うだけです。 – ComputerFellow

関連する問題