Files
jupyter-collection/scientific-computing-2/auto_examples_jupyter/plot_randomwalk.ipynb

96 lines
20 KiB
Plaintext
Raw Normal View History

2025-10-21 11:20:44 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Random walk exercise\n",
"\n",
"Plot distance as a function of time for a random walk\n",
"together with the theoretical result\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 参数设定1000 条随机行走轨迹,每条 200 步\n",
"n_stories = 1000\n",
"t_max = 200\n",
"\n",
"# 时间轴 [0, 1, 2, ..., 199]\n",
"t = np.arange(t_max)\n",
"\n",
"# 生成每一步randint(0,2) 返回 0/1映射到 -1/+1\n",
"rng = np.random.default_rng()\n",
"steps = 2 * rng.integers(0, 1 + 1, (n_stories, t_max)) - 1\n",
"\n",
"# 沿每条轨迹axis=1累加步长得到各时刻的位置\n",
"positions = np.cumsum(steps, axis=1)\n",
"\n",
"# 计算均方位移:先平方再按轨迹求平均\n",
"sq_distance = positions**2\n",
"mean_sq_distance = np.mean(sq_distance, axis=0)\n",
"\n",
"# 作图:绿色点线=模拟结果 ⟨x²⟩^(1/2);黄色直线=理论 √(t)\n",
"plt.figure(figsize=(4, 3))\n",
"plt.plot(t, np.sqrt(mean_sq_distance), \"g.\", t, np.sqrt(t), \"y-\")\n",
"plt.xlabel(r\"$t$\")\n",
"plt.ylabel(r\"$\\sqrt{\\langle (\\delta x)^2 \\rangle}$\")\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.11"
}
},
"nbformat": 4,
"nbformat_minor": 4
}