ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

洛伦兹吸引子可视化:10个质点、30秒、1e-5 的差异,复现 3blue1brown 的混沌演示

洛伦兹吸引子可视化:10个质点、30秒、1e-5 的差异,复现 3blue1brown 的混沌演示 洛伦兹吸引子可视化10个质点、30秒、1e-5 的差异复现 3blue1brown 的混沌演示【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videosGitHub_Trending/vi/videos 项目归档了 3blue1brown 数学动画视频的源码其中 lorenz.py 只干一件事用 scipy 数值求解洛伦兹常微分方程组再用 manim 在 3D 空间画出 10 条初始条件仅相差 1e-5 的轨迹在一个文件里完成洛伦兹吸引子的蝴蝶效应可视化。效果先说结论两条起点几乎重合的轨迹演化 30 秒后分别停在蝴蝶翅膀的两侧。这套方程由气象研究者 Edward Lorenz 于 1963 年在研究大气对流时发现——规则完全确定行为却看起来毫无规律。这正是混沌系统最反直觉的地方而这 100 来行代码把它变成了可以拖动、可以改参数、可以复现的动画。① 先跑通动画环境准备与一条命令这一节的目标只有一个把视频渲染出来。如果你还没有本地副本先拉取仓库仓库是只读的所有改动都建议在你自己的工程里做git clone https://gitcode.com/GitHub_Trending/vi/videos项目依赖 Manim 动画引擎、SciPy 科学计算库和 NumPypip install manim scipy numpy然后在项目根目录执行manim -pql _2024/manim_demo/lorenz.py LorenzAttractor参数含义-p渲染完成后自动播放-ql快速低质量模式适合调试追求成品画质可换成-qh高质量或-4k4K 分辨率渲染时你应该看到左上角固定显示一组微分方程旋转的 3D 坐标系里 10 条蓝色曲线从几乎同一点出发逐渐散开成蝴蝶翅膀的形状每条曲线末端有一个发光小点拖着约 3 秒的轨迹尾迹。坐标范围上x 和 y 在 [-50, 50] 之间z 在 [0, 50] 之间。② 拆开源码从方程到动画的三段式方程函数三行代码定义洛伦兹系统$$ \frac{\mathrm{d}x}{\mathrm{d}t}\sigma(y-x),\qquad \frac{\mathrm{d}y}{\mathrm{d}t}x(\rho-z)-y,\qquad \frac{\mathrm{d}z}{\mathrm{d}t}xy-\beta z $$对应的 Python 实现只有 7 行def lorenz_system(t, state, sigma10, rho28, beta8 / 3): x, y, z state dxdt sigma * (y - x) dydt x * (rho - z) - y dzdt x * y - beta * z return [dxdt, dydt, dzdt]sigma10、rho28、beta8/3是经典取值这组参数下轨迹会收敛到著名的蝴蝶翅膀形状——即洛伦兹吸引子。数值求解solve_ivp 把方程变成点云动画需要的是轨迹上的一个个坐标点这一转化由 SciPy 的solve_ivp完成def ode_solution_points(function, state0, time, dt0.01): solution solve_ivp(function, t_span(0, time), y0state0, t_evalnp.arange(0, time, dt)) return solution.y.Tt_span指定演化区间y0是初始状态t_eval每隔dt0.01采样一个点演化 30 秒即得到 3000 个点返回值形状为(n_points, 3)的数组可直接喂给 manim 绘图蝴蝶效应在这套代码里的完整链条是两条轨迹的初始状态只差 1e-5仅 z 分量轨迹开始分歧偏差随时间指数级放大30 秒后两个端点已停在翅膀的不同位置微小的输入差异 → 宏观上截然不同的结果这也是混沌系统的三个典型特征在动画里都能直接观察到对初始条件的敏感依赖性微小的初始差异被时间指数放大确定性非周期性规则完全确定轨迹却从不重复分形结构吸引子的几何具有自相似性场景组装10 个初始条件与一条色带动画的核心循环不到 5 行states [[10, 10, 10 n * 1e-5] for n in range(10)] for state, color in zip(states, color_gradient([BLUE_E, BLUE_A], 10)): points ode_solution_points(lorenz_system, state, 30) curve VMobject().set_points_smoothly(axes.c2p(*points.T)) self.add(curve.set_stroke(color, 1, opacity0.25))几个关键点初始条件的差异只加在 z 分量上color_gradient从深蓝到浅蓝生成 10 种颜色axes.c2p负责把数据坐标映射到屏幕坐标。最后ShowCreation用rate_funclinear播放且run_time30——动画 1 秒对应系统演化 1 秒10 个发光点以真实速度沿曲线移动分岔发生的那一刻是肉眼可见的。③ 改一个参数观察系统变化在本地副本里各改一个数字用同一条manim -pql命令重跑对比效果改epsilon扰动量级1e-5改为010 条曲线完全重叠蝴蝶效应消失改为1e-2分岔发生得更早。改evolution_time演化时长30拉到60轨迹把翅膀铺得更密端点分布开始显露吸引子的分形纹理。改rho瑞利数参数把28降到20运动明显趋于有序rho≈28附近正是从有序转向混沌的临界区。改质点数把 10 改成 50翅膀更丰满也更能看出相邻初值的聚散关系。另外注意场景类继承自InteractiveScene在交互式环境下可以直接实时调整常量并重绘不必每改一个数都完整渲染。④ 常见坑与延伸方向先排掉三个容易卡住的地方导入依赖lorenz.py 第一行from manim_imports_ext import *走的是本仓库配套的 manimlib 分支普通环境里可能导入失败。好在lorenz_system和ode_solution_points两个函数不依赖动画框架复制进你自己的 manim 工程即可。TeX 公式左上角的方程用Tex(...)渲染依赖本机 LaTeX 环境公式不显示时先查这一项。点数与耗时每条曲线的点数约等于time / dt改dt同时影响轨迹平滑度和求解耗时。三个可以直接动手的延伸换混沌系统只改lorenz_system函数体如 Rössler 或 Duffing 方程下游的求解与绘制一行不用动。rho 扫描实验让rho从 20 到 30 步进 1各渲染一张静态图亲眼确认系统从有序到混沌的过渡发生在哪一步。对照同仓库的相关素材这套方程 → 数值解 → 动画的思路在其他文件里也出现过按主题对照阅读主题文件气象预测与湍流turbulence.py流体力学fluid_flow.py加密通信crypto.py市场波动类模拟simulations.py【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表