单维纳过程(布朗运动)

时间:2015-11-09 00:38:35

标签: python numpy

粒子位置的控制方程为: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'

在这种情况下我不理解这个错误。

1 个答案:

答案 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