Random Walk 挑战程序设计竞赛 期望值和方程组

博客介绍了《挑战程序设计竞赛》中的一道题目,涉及N*M网格中从(0,0)出发,避开石头到达(N-1,M-1)的期望步数计算。通过设立期望值E(x,y)并建立方程组来解决,当无法到达或遇到石头时,期望步数为0。解题思路包括等概率移动的方程推导和状态转移方程的整数化表示,并给出了代码实现。" 88722499,7358314,Android Studio迁移Eclipse项目问题及解决,"['Android开发', 'Android Studio', 'Eclipse', '项目迁移', 'Gradle']

题目来自《挑战程序设计竞赛》4.1更加复杂的数学问题 期望值和方程组

这题其实就是ZJUT 1423,然而ZJUT似乎挂了。。。

1.题目详情

有一个N*M的格子,从(0,0)出发,每一步朝着上下左右四个格子中可以移动的格子等概率的移动。另外有些格子中有石头,因此无法移至这些格子。求第一次到达(N-1,M-1)格子的期望步数。题目假定至少存在一条从(0,0)出发到格子(N-1,M-1)的路径

限制条件

2<=N,M<=10

样例:('#'和'.'分别表示石头和可以移动的格子)


2.解题思路

设E(x,y)表示从格子(x,y)出发,到达终点的期望步数。先考虑从格子(x,y)向上下左右四个方向移动的情况,由于是等概率的,有如下关系:E(x,y)=1/4*E(x-1,y)+1/4*E(x,y+1)+1/4*E(x,y-1)+1/4*E(x+1,y)+1。如果移动不是等概率的,把1/4改成相应的数值就可以了。如果存在不能移动方向,也可以列出类似的式子。此外,当(x,y)=(N-1,M-1)时,有E(N-1,M-1)=0.为了使方程有唯一解,我们令无法到达终点的格子和有石头的格子都有E(x,y)=0。把N*M个方程联立起来就可以求期望步数了。

另外,为了更方便的表示上述状态转移方程,把上式改写成4*E(x,y)-E(x-1,y)-E(x,y+1)-E(x,y-1)-E(x+1,y)=4(把方程整数化),其中4表示格子(x,y)可以移动的方向的数目(可以上下左右移动,这就很容易理解,代码中的move以及为什么令A[x*M+y][nx*M+ny]=-1了。

3.代码


                
Wigner方程描述了量子力学中粒子的运动,是一个偏微分方程。而随机粒子方法是一种数值模拟方法,可以用来模拟Wigner方程的解,特别适用于高维量子系统的数值计算。下面给出使用随机粒子方法模拟Wigner方程的代码示例。 首先,我们需要导入必要的库: ```python import numpy as np import matplotlib.pyplot as plt from scipy import integrate ``` 然后,我们定义一些常数初始条件: ```python hbar = 1.0 m = 1.0 omega = 1.0 sigma = 1.0 x0 = 0.0 p0 = 1.0 Nt = 1000 dt = 0.1 Np = 1000 ``` 其中,hbar、m、omega、sigma分别表示普朗克常数、质量、频率初始粒子分布的标准差,x0p0为初始位置动量,Nt为时间步数,dt为时间步长,Np为随机粒子数。 接下来,我们定义一个函数,用于计算Wigner函数的演化: ```python def wigner_evolution(x, p, t): def V(x): return 0.5 * m * omega**2 * x**2 V_x = V(x) V_p = 0.0 dx = np.sqrt(2.0 * dt / hbar) * np.random.normal(size=Np) dp = np.sqrt(2.0 * dt / hbar) * np.random.normal(size=Np) x_new = x + p / m * dt + dx p_new = p - V_x / hbar * dt - p / m * dt + dp W_new = np.zeros((Np, Np)) for i in range(Np): for j in range(Np): W_new[i, j] = np.exp( -0.5 * ((x_new[i] - x_new[j])**2 / sigma**2 + (p_new[i] - p_new[j])**2 * sigma**2)) / (2.0 * np.pi * hbar) return W_new ``` 其中,V(x)为势函数,dxdp分别为随机粒子的位置动量扰动,x_newp_new为演化后的位置动量,W_new为演化后的Wigner函数。 最后,我们可以使用Euler方法来数值求解Wigner方程,并画出Wigner函数的演化: ```python x = np.random.normal(loc=x0, scale=sigma, size=Np) p = np.random.normal(loc=p0, scale=sigma, size=Np) W = np.zeros((Np, Np)) for i in range(Np): for j in range(Np): W[i, j] = np.exp( -0.5 * ((x[i] - x[j])**2 / sigma**2 + (p[i] - p[j])**2 * sigma**2)) / (2.0 * np.pi * hbar) for it in range(Nt): W = wigner_evolution(x, p, it*dt) x = x + p / m * dt p = p - integrate.quad(lambda x: V(x), x - 0.5 * sigma, x + 0.5 * sigma)[0] / hbar * dt - p / m * dt W = np.mean(W, axis=0) plt.plot(x, W) plt.show() ``` 运行以上代码即可得到Wigner函数的演化图像。注意,由于随机粒子方法本身的随机性,每次运行结果可能会略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值