Python 单维纳过程(布朗运动)
粒子位置的控制方程为:Xt+dt=Xt+dt^0.5*U 其中U是一个0,1的正态随机变量 我试图最终解决X_0=Xt=0,Xt=dt,Xt=2dt,…,Xt=Nt 其中N是大的,dt是小的,但是我首先尝试用Nt=1000个正态随机数来解X_0,所以我得到了1000个不同的解 我已经作为npr导入了numpy.random 如果我在python终端中输入这个,我会得到一条错误消息 Xt+dt=Xt+sqrtdt*npr.randnNt:“无法分配给函数调用”Python 单维纳过程(布朗运动),python,numpy,Python,Numpy,粒子位置的控制方程为:Xt+dt=Xt+dt^0.5*U 其中U是一个0,1的正态随机变量 我试图最终解决X_0=Xt=0,Xt=dt,Xt=2dt,…,Xt=Nt 其中N是大的,dt是小的,但是我首先尝试用Nt=1000个正态随机数来解X_0,所以我得到了1000个不同的解 我已经作为npr导入了numpy.random 如果我在python终端中输入这个,我会得到一条错误消息 Xt+dt=Xt+sqrtdt*npr.randnNt:“无法分配给函数调用” 在这种情况下,我不理解这个错误。在返
在这种情况下,我不理解这个错误。在返回X0之前,您的方法甚至没有触及X0,因此我不太确定我的尝试是否符合您的要求。我与@Watten Weckesser一起阅读scipy食谱,但对于您的方法,解决方案可能是:
def wiener1(dt=0.1,X0=X(t=0),Nt=1000):
""" Input variables:
dt time step
X0 intial value, X(t=0) = X0
Nt number of time steps
"""
# initialize start value
res = X0
# calculate and store time series
for ii in range(1,Nt):
# X(t+dt)=X(t)+sqrt(dt)*npr.randn(Nt)
res += sqrt(dt)*npr.randn(Nt)
# return final value after t = N*dt
return res
对于空洞的时间演化
def wiener1(dt=0.1,X0=X(t=0),Nt=1000):
""" Input variables:
dt time step
X0 intial value, X(t=0) = X0
Nt number of time steps
"""
# create result array
res = numpy.zeros(Nt)
# initialize start value
res[0] = X0
# calculate and store time series
for ii in range(1,Nt):
# X(t+dt)=X(t)+sqrt(dt)*npr.randn(Nt)
res[ii] = res[ii-1] + sqrt(dt)*npr.randn(Nt)
# return time series
return res
如果您只是对最终值感兴趣,可以节省阵列内存并执行以下操作:
def wiener1(dt=0.1,X0=X(t=0),Nt=1000):
""" Input variables:
dt time step
X0 intial value, X(t=0) = X0
Nt number of time steps
"""
# initialize start value
res = X0
# calculate and store time series
for ii in range(1,Nt):
# X(t+dt)=X(t)+sqrt(dt)*npr.randn(Nt)
res += sqrt(dt)*npr.randn(Nt)
# return final value after t = N*dt
return res
当然,两种方法都需要一个import numpy.random作为npr,第一种方法还需要一个import numpy。什么是X?它是如何定义的?如果它是一个numpy.array,你应该使用X[t]而不是Xt,t在哪里定义???我应该如何定义它们?我很困惑,我已经花了很多时间在这上面,却一无所获。也许你应该从头开始,读一本教程。。。这些都是非常基本的东西。我是否将X定义为一个函数?仅供参考:我想知道在第一种情况下,res[ii]=res[ii-1]+sqrtdt*npr.randnt是否应该是res[ii]=res[ii-1]+sqrtdt*npr.randn1。类似地,在第二种情况下,res+=sqrtdt*npr.randnt应该是res+=sqrtdt*npr.randn1。