使用西皮·奥德林时间步长不同

2024-06-01 19:44:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用scipy.integrate.odeint有不同的时间步长。在

具体来说,我设置了一个一维扩散模拟,粒子在一端扩散到另一端。对于扩散,我使用有限差分二阶导数近似。在

令人惊讶的是,我得到了不同的模拟结果,这取决于所采取的时间步长,即使总的模拟时间是相同的。在

import scipy
import scipy.integrate
import numpy as np
import sys

num_bins=40
bin_size=0.01
bin_size2=bin_size*bin_size
mol_scale=1e-9


def step(y, t, d,dt):
    dnorm=(d*dt)/(bin_size2)
    dydt=np.zeros([num_bins])
    for i in range(1,num_bins-1):
        dydt[i]=(y[i-1]-2*y[i]+y[i+1])*dnorm
    dydt[0]=(-y[0]+y[1])*dnorm
    dydt[num_bins-1]=(y[num_bins-2]-y[num_bins-1])*dnorm
    return dydt

y0=np.zeros([num_bins])
y0[1]=1000*mol_scale

d1=0.001
d2=0.01
d3=0.1
#dt1=1
dt=0.01
num_mins=2
t2 = np.linspace(0, num_mins, int((60*num_mins)/dt)+1) #second intervals
sol1 = scipy.integrate.odeint(step, y0, t2, args=(d1,dt))
sol2 = scipy.integrate.odeint(step, y0, t2, args=(d2,dt))
sol3 = scipy.integrate.odeint(step, y0, t2, args=(d3,dt))

import matplotlib.pyplot as plt

tp=-1
plt.plot(range(num_bins), sol1[tp, :]/mol_scale, 'b', label='sol1')
plt.plot(range(num_bins), sol2[tp, :]/mol_scale, 'g', label='sol2')
plt.plot(range(num_bins), sol3[tp, :]/mol_scale, 'r', label='sol3')

plt.legend(loc='best')
plt.xlabel('x')


plt.grid()
plt.show()

当dt=1(1秒)时,在2分钟模拟结束时,我得到以下信号分布。在

Signal profile after two minutes simulation with dt=1

然而,当dt=0.1(0.1秒)时,我得到了不同的信号分布。在

Signal profile after two minutes simulation with dt=0.1

你觉得我做错什么了吗?在

谢谢

克伦。在


Tags: importbinstepnpdtpltscipynum