我正在尝试模拟扩散过程并使用以下代码来模拟扩散方程:
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
我想知道正弦最大值消失的速度有多快。要做到这一点,我想绘制幅度(最大值和平均值之间的距离)作为时间的函数,但我该怎么做?
我如何知道振幅在什么时间小于开始的因素?
答案 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阵列。