扩散模拟

时间:2015-06-02 09:26:37

标签: python ipython

我正在尝试模拟扩散过程并使用以下代码来模拟扩散方程:

dx = 0.1
dt = 0.1
t = np.arange(0, 10, dt)
x = np.arange(0, 10, dx)
D = 1/20
k = 1

# We have an empty array
Cxt = np.tile(np.nan, (len(t), len(x)))
# Definition of concentration profile at t = 0.
Cxt[0] = np.sin(k*2*np.pi*x/10)+1
for j in range(len(t) - 1):
    # Second derivative to x: C_xx
    C_xx = (np.roll(Cxt[j], -1) + np.roll(Cxt[j], 1) - 2*Cxt[j]) / dx**2
    # Concentrationprofile in the next time step
    Cxt[j+1] = Cxt[j] + dt * D * C_xx

# Plot the concentration profiles in qt
%matplotlib qt
plt.waitforbuttonpress()
for i in range(len(t)):
    ti = t[i]
    Ci = Cxt[i]
    plt.cla()
    plt.plot(x, Ci, label='t={}'.format(ti))
    plt.xlabel('x')
    plt.ylabel('C(x)')
    plt.axis([0, 10, 0, 2])
    plt.title('t={0:.2f}'.format(ti))
    plt.show()
    plt.pause(0.01)
%matplotlib inline

我想知道正弦最大值消失的速度有多快。要做到这一点,我想绘制幅度(最大值和平均值之间的距离)作为时间的函数,但我该怎么做?

我如何知道振幅在什么时间小于开始的因素?

1 个答案:

答案 0 :(得分:0)

一种方法是在每个时间步长处将通用正弦函数f(x)=A*sin(k*x+phi)+c拟合到结果数据,并将其幅度A作为结果。这可以通过以下方式实现:

from scipy.optimize import curve_fit
fit_function=lambda x,A,k,phi,c:A*np.sin(k*x+phi)+c
timestep=50
amplitude=curve_fit(fit_function,x,Cxt[timestep,:],p0=[1,k*2*np.pi/10,0,1])[0][0]

我选择了起始值p0以匹配您的初始化。当然,你会想以某种方式包装它来回答你提出的任何问题,即搜索timestep的值,其中amplitude低于1/e或其他。

编辑:只需获取数据的最大值和平均值之间的差异就可以实现

Cxt.max(axis=1)-Cxt.mean(axis=1)

这将返回按时间索引的1D阵列。