NEWS DETAIL

SymPy 是什么?为什么 Manim 动画需要它?

发布时间:2026/10/25 4:59:45 · 栏目:资讯中心

尧图网络原创建站知识分享正文
简单说SymPy 是一个 Python 的符号计算库。别被符号计算这个词吓到用大白话讲就是让计算机帮你列式子、解方程、求导数而不是你自己手算。数值计算 vs 符号计算看一个更直观的对比你会立刻明白符号计算的强大import math import sympy as sp # 场景计算 sin(π/3) 的精确值 # 数值计算 - 得到近似小数 result_num math.sin(math.pi / 3) print(f数值计算: {result_num}) # 输出: 0.8660254037844386 ← 这是近似值不知道它等于 √3/2 # 符号计算 - 得到精确表达式 x sp.Symbol(x) result_sym sp.sin(sp.pi / 3) print(f符号计算: {result_sym}) # 输出: sqrt(3)/2 ← 精确的数学表达式 # 场景1求平方 print(\n 求 (sin(π/3))² ) # 数值计算 - 精度损失 square_num result_num ** 2 print(f数值: {square_num}) # 输出: 0.7499999999999999 ← 本应是 0.75有浮点误差 # 符号计算 - 精确化简 square_sym result_sym ** 2 print(f符号: {square_sym}) # 输出: 3/4 ← 精确值关键对比总结特性数值计算 (math)符号计算 (sympy)sin(π/3)0.86602540378...√3/2平方后0.749999999999...3/4能否继续代数运算❌ 只能数值近似✅ 可代入方程、求导、化简浮点精度问题⚠️ 存在误差累积✅ 完全精确符号计算的灵活性体现在保持数学形式√3/2比0.866...更有数学意义自动化简(√3/2)²自动变成3/4代数兼容可以继续解方程、求导、积分保持精确形式这对 Manim 动画尤为重要——你不仅需要坐标值更需要数学关系的可视化而符号计算保留了这种关系避免累积误差符号计算在累积的计算中能够有效的降低误差。比如公式In1−n×In−1其中 I0e−1。分别累积计算以后n符号计算数值计算 (模拟8位小数精度)误差分析0e−10.71828183初始误差 ≈1.5×10−912−e0.28171817误差微小22e−50.43656366误差开始累积316−6e0.30860902424e−650.236872925326−120e0.18276460误差开始显现61956e−53150.15054840713692−5040e0.121457208109536e−2983250.103642409985824−2691360e0.083858401026913600e−733093650.07515840偏差明显11296049600−807408000e0.09173440129688896000e−26384952005-0.08345440灾难性错误符号反转13342938611200−1258293216000e2.10490720完全失控使用Sympy的话可以在需要某一步结果的时候再代入e去具体计算出来不会累积误差。SymPy 核心入门把变量当作符号在 SymPy 中我们首先要定义符号变量import sympy as sp # 定义符号 - 告诉 SymPy x 是一个数学变量不是具体的数 x sp.Symbol(x) y sp.Symbol(y) # 现在可以构建表达式了 expr x**2 - 2*x - 1 # y x² - 2x - 1 print(expr) # 输出: x**2 - 2*x - 1核心操作代入求值.subs()有了表达式我们可以轻松计算任意 x 对应的 y 值# 计算 x1.5 时的函数值 result expr.subs(x, 1.5) print(result) # 输出: -1.75000000000000 print(float(result)) # 转换为浮点数: -1.75自动求导和解方程这才是真正解放双手的功能# 求导数 derivative sp.diff(expr, x) # 对 x 求导 print(derivative) # 输出: 2*x - 2 # 解方程导数0找顶点 vertex_x sp.solve(derivative, x)[0] # 解得 x1 vertex_y expr.subs(x, vertex_x) # 代入求 y print(f顶点坐标: ({vertex_x}, {vertex_y})) # 输出: (1, -2) # 解方程y0找与x轴交点 roots sp.solve(expr, x) print(f与x轴交点: {roots}) # 输出: [1 - sqrt(2), 1 sqrt(2)]看到了吗原本需要手动计算的所有值现在SymPy全自动搞定了SymPy 和 Manim 结合示例现在我们把SymPy和Manim结合起来做一个参数可调的抛物线动画。核心代码示例from manim import * import sympy as sp class AutoParabola(Scene): def construct(self): # SymPy 自动计算部分 x sp.Symbol(x) a, b, c 1, -2, -1 # 抛物线参数y ax² bx c expr a * x**2 b * x c # SymPy 符号表达式 # 自动求顶点令导数为 0 derivative sp.diff(expr, x) # 求导2ax b vertex_x float(sp.solve(derivative, x)[0]) vertex_y float(expr.subs(x, vertex_x)) # 自动求与 x 轴交点 roots sp.solve(expr, x) # 解方程 ax² bx c 0 root_points [(float(r), 0) for r in roots if r.is_real] # Manim 可视化部分 axes Axes(x_range[-2, 4, 1], y_range[-3, 3, 1], axis_config{color: BLUE}) # 用 SymPy 表达式直接作为绘图函数 parabola axes.plot( lambda x_val: float(expr.subs(x, x_val)), # SymPy 实时计算 y 值 colorYELLOW, stroke_width3, ) # 顶点使用 SymPy 算出的坐标 vertex_dot Dot(axes.c2p(vertex_x, vertex_y), colorRED) vertex_label MathTex( f({vertex_x:.1f}, {vertex_y:.1f}), font_size24, colorRED ).next_to(vertex_dot, UP) # x 轴交点 root_dots VGroup(*[ Dot(axes.c2p(rx, ry), colorGREEN) for rx, ry in root_points ]) # 动画播放 self.play(Create(axes)) self.play(Create(parabola)) self.play(Create(vertex_dot), Write(vertex_label)) self.play(Create(root_dots)) self.wait(2)代码核心解析关键点1无缝衔接# SymPy 计算出的值是符号类型需要转为 float 给 Manim 使用 vertex_x float(sp.solve(derivative, x)[0])关键点2动态函数映射# 用 lambda 将 SymPy 表达式翻译成 Manim 能理解的数值函数 parabola axes.plot( lambda x_val: float(expr.subs(x, x_val)), colorYELLOW, )关键点3坐标系转换# 数学坐标 → 屏幕坐标 vertex_dot Dot(axes.c2p(vertex_x, vertex_y))效果展示说明运行这段代码后你会看到坐标轴自动建立范围根据函数特点自适应抛物线精确绘制形状由 SymPy 实时计算红色顶点自动标注在正确位置坐标值精确显示绿色交点标记出抛物线与 x 轴的交点白色虚线标出对称轴位置最神奇的是如果你想改成 y2x23x−1只需要修改第 11 行的参数a, b, c 2, 3, -1 # 其他代码完全不用动
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/21 11:24:40

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/24 20:39:51

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/19 6:46:54

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/24 7:09:28

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/24 22:16:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/23 10:16:26

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询