【发布时间】:2021-09-26 20:46:16
【问题描述】:
我正在尝试解决布朗粒子和朗格文动力学的 SDE。 起初我尝试用普通随机数生成器模拟 2D 布朗运动, 代码是:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
dt = .001 # Time step.
T = 2. # Total time.
n = int(T / dt) # Number of time steps.
t = np.linspace(0., T, n) # Vector of times.
sqrtdt = np.sqrt(dt)
y = np.zeros(n)
x = np.zeros(n)
for i in range(n-1):
x[i + 1] = x[i] + np.random.normal(0.0,1.0)
y[i + 1] = y[i] + np.random.normal(0.0,1.0)
fig, axs = plt.subplots(1, 1, figsize=(12, 12))
plt.plot(y, x, label ='Position')
plt.title("Simulation of Brownian motion")
plt.show()
现在,当我尝试借助正向欧拉法模拟相同的过程时,控制方程为
mdv/dt=η
使用以下代码,
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
dt = .001 # Time step.
T = 2. # Total time.
n = int(T / dt) # Number of time steps.
t = np.linspace(0., T, n) # Vector of times.
sqrtdt = np.sqrt(dt)
v_x = np.zeros(n)
v_y = np.zeros(n)
y = np.zeros(n)
x = np.zeros(n)
for i in range(n-1):
v_x[i + 1] = v_x[i] + sqrtdt * np.random.normal(0.0,1.0)
v_y[i + 1] = v_y[i] + sqrtdt * np.random.normal(0.0,1.0)
x[i+1] = x[i] + (v_x[i]*dt)
y[i+1] = y[i] + (v_y[i]*dt)
fig, axs = plt.subplots(1, 1, figsize=(12, 8))
plt.plot(y, x, label ='Position')
plt.title("Simulation of Brownian motion")
plt.show()
结果是这样的,
我想弄清楚我的错误。请帮忙
【问题讨论】:
-
澄清一下,两张图片都是空白的?另外(遗憾的是)SO 不支持 Latex 表达式。
-
非常抱歉,我已经更新了图片。
-
第二张图片是空白的错误吗?
-
在第一种情况下,您在位置上应用了随机“力”,在第二种情况下,您仅在速度上应用了随机“力”。其中一个是错误的。
-
第二种情况,我尝试用正向欧拉法求解方程。而在第一种情况下,我的意图是在前一个时间位置值上添加一个随机位置。
标签: python arrays stochastic