Runge-Kutta 4绘图时间范围不受tmax的限制

时间:2017-04-08 14:05:43

标签: python plot ode runge-kutta

我正在尝试使用4阶Runge Kutta方法解决ODE。问题是我的代码中定义的tmax似乎不会影响绘图的时间范围。更改tmax仅会影响绘图的曲线。相反,时间范围取决于nT

#generated electricity
g = 1.0 

#rate constants
k_diss = 0.1
k_em = .01

#4th order RK
def RK4(func, yi, ti, dt):
    k1 = dt*func(yi, ti)
    k2 = dt*func(yi + 0.5 * k1, ti + 0.5 * dt)
    k3 = dt*func(yi + 0.5 * k2, ti + 0.5 * dt)
    k4 = dt*func(yi + k3,ti + dt)
    return yi + 1./6*(k1 + 2*k2 + 2*k3 + k4)

#variation of cEX
def df(t, c, k_diss, k_em):
    return np.array([g - 2*k_diss*c[0] - k_em*c[0]])

#time
tmax = 30.0
nT = 500
T = np.linspace(0,tmax,nT)
dT = tmax/(nT-1)

#initial condition
C0, T0 = 1.0, 0.0

#storage
C = np.zeros(nT)
C[0] = C0

#ODE solver

r = ode(df).set_integrator('dopri5')
r.set_initial_value(C0,T0).set_f_params(k_diss,k_em)

#loop over time
iT = 1

for i in range(1,nT):
    C[iT] = r.integrate(r.t + dT)
    iT += 1

最重要的是,情节应该减少(可以在下面看到),而不是增加。我的代码基于以下内容(tmax确实以它应该的方式运行):

def RK4(func, yi, ti, dt):
    k1 = dt*func(yi,ti)
    k2 = dt*func(yi+0.5*k1,ti+0.5*dt)
    k3 = dt*func(yi+0.5*k2,ti+0.5*dt)
    k4 = dt*func(yi+k3,ti+dt)
    return yi + 1./6*  ( k1+2*k2+2*k3+k4 )

# funtion that defines the concentration of CA
def df(c,t):
    return np.array([-k*c[0],k*c[0]])   # return the value

# time argument
tmax,nT = 30.0,50
T = np.linspace(0,tmax,nT)
dT = tmax/(nT-1)

# rate constant
k = 0.2

# declare the array to store
RK = np.zeros((2,nT))

# initial condition
RK[0,0] = 1.

for iT in range(1,nT):
    RK[:,iT] = RK4(df,RK[:,iT-1],T[iT-1],dT)

情节:

1 个答案:

答案 0 :(得分:0)

我将第一个脚本的结尾更改为

com.google.zxing:core:3.3.0

第一次更改,因为#loop over time for iT in range(1,nT): C[iT] = r.integrate(T[iT]) import matplotlib.pyplot as plt plt.plot(T,C) plt.xlabel("time"); plt.ylabel("cEX"); plt.show() 实际上是您的意图,C[i]是时间T[i]的值,并且因为有一种方法可以一致地表达这一点,为什么不使用它。

由于您没有添加绘图命令,因此只能猜出您的错误。很可能是你没有在你的情节命令中包含时间。如果你只写plt.plot(C),那么水平轴用C的整数索引填充,因为绘图程序没有给出任何其他时间尺度的知识。

corrected plot