我开始学习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 :(得分: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
我们可以让这个看起来更加pythonic,但为了简洁省略。
有关您需要在append
中使用chemanalysis
的原因的更多解释:
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
上述内容只会返回dydt
作为最后分配的值#ch2o
,您将丢失其他数据并每次重写dydt
。而是将其列为一个列表,odeint
要求您进行此操作。