124 lines
33 KiB
Plaintext
124 lines
33 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"# Mandelbrot set\n",
|
|||
|
|
"\n",
|
|||
|
|
"Compute the Mandelbrot fractal and plot it\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 640x480 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"import numpy as np\n",
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"from numpy import newaxis\n",
|
|||
|
|
"import warnings\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"def compute_mandelbrot(N_max, some_threshold, nx, ny):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" 计算 Mandelbrot 集合的布尔数组。\n",
|
|||
|
|
"\n",
|
|||
|
|
" 参数\n",
|
|||
|
|
" ----\n",
|
|||
|
|
" N_max : int\n",
|
|||
|
|
" 最大迭代次数。\n",
|
|||
|
|
" some_threshold : float\n",
|
|||
|
|
" 模长阈值,用于判断点是否属于 Mandelbrot 集。\n",
|
|||
|
|
" nx, ny : int\n",
|
|||
|
|
" 图像在 x、y 方向的像素个数。\n",
|
|||
|
|
"\n",
|
|||
|
|
" 返回\n",
|
|||
|
|
" ----\n",
|
|||
|
|
" mandelbrot_set : 二维 bool 数组 (nx, ny)\n",
|
|||
|
|
" True 表示对应复数 c 属于 Mandelbrot 集。\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 1. 构造复平面网格\n",
|
|||
|
|
" x = np.linspace(-2, 1, nx) # 实轴范围 [-2, 1]\n",
|
|||
|
|
" y = np.linspace(-1.5, 1.5, ny) # 虚轴范围 [-1.5, 1.5]\n",
|
|||
|
|
" c = x[:, np.newaxis] + 1j * y[np.newaxis, :] # 广播成 (nx, ny) 复数矩阵\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 2. 初始化 z,与 c 同形\n",
|
|||
|
|
" z = c.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 3. 迭代:z_{n+1} = z_n^2 + c\n",
|
|||
|
|
" # 屏蔽运行时警告(溢出/无效值在集合外部必然出现)\n",
|
|||
|
|
" with warnings.catch_warnings():\n",
|
|||
|
|
" warnings.simplefilter(\"ignore\")\n",
|
|||
|
|
" for _ in range(N_max):\n",
|
|||
|
|
" z = z**2 + c\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 4. 根据最终模长判断是否在集合内\n",
|
|||
|
|
" mandelbrot_set = abs(z) < some_threshold\n",
|
|||
|
|
" return mandelbrot_set\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 5. 生成 601×401 像素的 Mandelbrot 集合\n",
|
|||
|
|
"mandelbrot_set = compute_mandelbrot(N_max=50, some_threshold=50.0,\n",
|
|||
|
|
" nx=601, ny=401)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 6. 绘制:转置使 y 轴竖直,extent 设定坐标轴范围\n",
|
|||
|
|
"plt.imshow(mandelbrot_set.T, extent=(-2, 1, -1.5, 1.5))\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 7. 使用灰度色阶(黑色=集合内,白色=集合外)\n",
|
|||
|
|
"plt.gray()\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 8. 显示图形\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
|
|||
|
|
}
|