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

124 lines
33 KiB
Plaintext
Raw Normal View History

2025-10-21 11:20:44 +08:00
{
"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
}