粒子位置的控制方程为:X(t + dt)= X(t)+((dt)^ 0.5)* U
其中U是Normal(0,1)随机变量。
我正在尝试最终解决X_0 = X(t = 0),X(t = dt),X(t = 2dt),...,X(t = Nt)
其中N很大且dt很小,但我首先尝试先解决X_0(Nt = 1000个正常随机数,所以我得到1000个不同的解决方案)
我已导入numpy.random
作为npr
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
"""
X(t+dt)=X(t)+sqrt(dt)*npr.randn(Nt)
return X0
如果我在我的python终端中键入此内容,则会收到该行的错误消息
X(t+dt)=X(t)+sqrt(dt)*npr.randn(Nt): 'can't assign to function call'
在这种情况下我不理解这个错误。
答案 0 :(得分:0)
在返回之前,您的方法甚至不会触碰X0
,因此我不太确定我的尝试是否符合您的要求。我和@Watten Weckesser一起阅读scipy-cookbook,但是对于你的方法,解决方案可能如下:
对于洞时间演化
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 as npr
,而第一种方法还需要import numpy
。