常微分方程指数误差

时间:2017-02-18 10:19:37

标签: python indexing scipy

我开始学习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 /编程经验。我非常感谢我在哪里出错或者我可以改进这些代码的任何帮助。我已经在其他线程上阅读了其他一些类似的问题/错误消息,但是我自己还没有能够解决这个问题。我知道目前没有附加到此脚本的图形组件,我想我会等到先解决这个问题。

问候

1 个答案:

答案 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要求您进行此操作。