我试图用高斯噪声来解决一些随机微分方程。我想知道是否更好地使用噪音矢量:
eta = np.random.normal(size=N)*sqrtdt
q = []
p = []
q.append(1.0)
p.append(1.0)
for i in range(N):
q.append(f(q[i],p[i],eta[i])
p.append(g(q[i],p[i],eta[i])
f 和 g 表现良好的函数,或者我应该在每次迭代中创建随机数:
q = []
p = []
q.append(1.0)
p.append(1.0)
for i in range(N):
eta = np.random.normal()*sqrtdt
q.append(f(q[i],p[i],eta)
p.append(g(q[i],p[i],eta)
此代码应放入另一个 for 循环,并运行多个 N 值,其值从10 ^ 4到10 ^ 9不等。我也愿意采用另一种方式来写这个,我知道 for 循环不是最接近 Python思维 。
答案 0 :(得分:0)
一般来说,对你的问题没有明确的答复,假设" ok"表现就够了。实际上我会在这里考虑三种这样的策略。
方法的有趣优势" 2"是你可以用Cython加速内循环(例如)而不改变随机数发生器。
您可以存储q
和p
的当前值,以避免从列表中获取它们。您可以通过q.append(q_loop)
和p.append(p_loop)
附加。
无论如何,如果表现是一个问题,你应该对差异策略进行基准测试,并在第二次考虑使用"加速" (即Cython,Numba等)。随机方程的时间分辨率不能很好地矢量化,因此NumPy策略不适用于你。