我正在尝试使用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)
情节:
答案 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
的整数索引填充,因为绘图程序没有给出任何其他时间尺度的知识。