69.9K Star,一款强大的数学动画引擎,典型的降维打击!!!

部署运行你感兴趣的模型镜像

欢迎关注《前端点线面》,开车不迷路。

a09dddfddd3cf9173b1109e616bf669e.png

今天要介绍的是一款免费开源的数学动画引擎——Manim,其是一个优秀的创建数学动画的Python库,让数学变的更具有可视化,一反面降低理解成本,另一方面可以制作一些炫酷的教案。

关键特性

  • 支持各种数学对象的动画演示

    你可以创建和操作多种数学对象,例如数字、字母、函数图像、几何形状、三维对象等,为数学概念和理论提供直观的演示。

  • 强大的动画表达能力

    Manim 支持各种动画效果,如淡入、淡出、旋转、缩放、颜色渐变、路径跟踪等。这些效果可单独使用,也可组合使用以创建复杂的动画。

  • 支持 LaTeX 和 Markdown

    可以使用 LaTeX 来创建复杂的数学公式。

  • Python 编程语言支持

    Manim 用 Python 编写,有极好的可定制性。你可以使用 Python 的丰富库和框架,如 NumPy 和 Matplotlib,来扩展 Manim 的功能。

  • 支持 2D 和 3D 动画

    你可以在 2D 平面或 3D 空间中创建和操控对象。对于 3D 动画,Manim 提供了许多实用的功能,例如摄像机控制、光照和阴影等。

  • 开源和跨平台

    Manim 是一个开源项目,你可以自由使用和修改它。并且,Manim 可以在主流的操作系统中运行,如 Windows、macOS 和 Linux。

炫酷demo

其官网提供了很多炫酷的demo,地址为https://docs.manim.org.cn/getting_started/example_scenes.html#textransformexample,下面简要看两个:

简单变化

创建一个正方形,并将该正方形变换为圆形

# 引入在使用manim时所有可能会用到的类
from manimlib import *

# 创建一个Scene的子类
class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        circle.set_fill(BLUE, opacity=0.5)
        circle.set_stroke(BLUE, width=4)

        square = Square()
        
        self.play(ShowCreation(square))
        self.wait()
        self.play(ReplacementTransform(square, circle))
        self.wait()
函数图像

创建了一个彩色的图像,被用来描述几个不同的函数:sin(x)、ReLU(Rectified Linear Unit)函数,然后描述一个阶梯函数(Step function),最后描述一个四次函数(0.25*x^2)。

from manimlib import *

class GraphExample(Scene):
    def construct(self):
        axes = Axes((-3, 10), (-1, 8))
        axes.add_coordinate_labels()

        self.play(Write(axes, lag_ratio=0.01, run_time=1))

        # Axes.get_graph会返回传入方程的图像
        sin_graph = axes.get_graph(
            lambda x: 2 * math.sin(x),
            color=BLUE,
        )
        # 默认情况下,它在所有采样点(x, f(x))之间稍微平滑地插值
        # 但是,如果图形有棱角,可以将use_smoothing设为False
        relu_graph = axes.get_graph(
            lambda x: max(x, 0),
            use_smoothing=False,
            color=YELLOW,
        )
        # 对于不连续的函数,你可以指定间断点来让它不试图填补不连续的位置
        step_graph = axes.get_graph(
            lambda x: 2.0 if x > 3 else 1.0,
            discontinuities=[3],
            color=GREEN,
        )

        # Axes.get_graph_label可以接受字符串或者mobject。如果传入的是字符串
        # 那么将将其当作LaTeX表达式传入Tex中
        # 默认下,label将生成在图像的右侧,并且匹配图像的颜色
        sin_label = axes.get_graph_label(sin_graph, "\\sin(x)")
        relu_label = axes.get_graph_label(relu_graph, Text("ReLU"))
        step_label = axes.get_graph_label(step_graph, Text("Step"), x=4)

        self.play(
            ShowCreation(sin_graph),
            FadeIn(sin_label, RIGHT),
        )
        self.wait(2)
        self.play(
            ReplacementTransform(sin_graph, relu_graph),
            FadeTransform(sin_label, relu_label),
        )
        self.wait()
        self.play(
            ReplacementTransform(relu_graph, step_graph),
            FadeTransform(relu_label, step_label),
        )
        self.wait()

        parabola = axes.get_graph(lambda x: 0.25 * x**2)
        parabola.set_stroke(BLUE)
        self.play(
            FadeOut(step_graph),
            FadeOut(step_label),
            ShowCreation(parabola)
        )
        self.wait()

        # 你可以使用Axes.input_to_graph_point(缩写Axes.i2gp)来找到图像上的一个点
        dot = Dot(color=RED)
        dot.move_to(axes.i2gp(2, parabola))
        self.play(FadeIn(dot, scale=0.5))

        # ValueTracker存储一个数值,可以帮助我们制作可变参数的动画
        # 通常使用updater或者f_always让其它mobject根据其中的数值来更新
        x_tracker = ValueTracker(2)
        f_always(
            dot.move_to,
            lambda: axes.i2gp(x_tracker.get_value(), parabola)
        )

        self.play(x_tracker.animate.set_value(4), run_time=3)
        self.play(x_tracker.animate.set_value(-2), run_time=3)
        self.wait()

github及官网地址

  1. github地址

https://github.com/3b1b/manim

  1. 官网地址

https://docs.manim.org.cn/getting_started/installation.html

茶已备好,只待君来!感谢关注 前端点线面 (>‿<),本号定期推荐原创深度好文,帮助每一位在前端领域打拼的伙伴们走向前列。此外,《工具人的工具箱》小程序也上线了,内含11个模块338道面试题,不容错过!!!

工具人的工具箱

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我需要帮用户调整变量y和c的含义,将c作为目标值,y作为当前值,并更新相关逻辑以正确输出f_temp和f。首先,我要回顾用户提供的引用内容,看看是否有相关的信息需要参考。 用户提到在之前的回答中,他们使用了一阶低通滤波器来实现平滑过渡,其中涉及到变量c和y。现在需要交换这两个变量的定义,所以我要仔细检查现有的代码逻辑,确保变量角色调整后,所有相关部分都得到正确更新。 首先,在之前的代码中,c被用作当前值,而y是目标值,因此需要交换它们的角色。例如,原本的平滑过渡部分可能是将当前值c向目标值y过渡,但现在需要反过来,让当前值y向目标值c过渡。同时,输出f_temp和f的逻辑也需要相应调整,确保它们基于正确的变量进行计算。 接下来,我需要考虑变量交换后对滤波器和过渡逻辑的影响。例如,原来的代码中可能有类似`#c := #c + (#y - #c) * y_filter;`的语句,现在需要改为`#y := #y + (#c - #y) * y_filter;`,以确保当前值y逐渐接近目标值c。同时,检查所有涉及到c和y的条件判断,如`ABS(#c - #y)`是否需要调整为`ABS(#y - #c)`,但绝对值运算结果相同,可能不需要修改,但变量顺序的变化可能会影响后续的逻辑。 然后,我需要更新变量声明部分,确保注释和变量名对应的角色正确。例如,原本的y_filter是用于压强过渡系数,现在可能仍适用于当前值y的过渡,但需要确认参数的意义是否需要调整。 另外,用户提到的引用[1]中关于静态局部变量的内容可能与此问题无关,但引用[2]中关于const和static的作用可以帮助检查代码中是否有需要保护的变量,确保在调整过程中不会意外修改。例如,如果某些变量应该保持不变,需使用const修饰符。但根据用户的问题,主要关注变量角色的交换,可能暂时不需要处理这部分。 在检查代码时,需要确保所有对c和y的引用都已正确替换。例如,原代码中的#f_temp赋值可能依赖于y或c的当前值,现在需要根据新的定义调整。例如,如果f_temp原本是根据当前值y计算得出,现在可能需要基于目标值c,或者保持原有逻辑但变量名调整,需要具体看用户原有代码的结构。 最后,测试调整后的逻辑,确保平滑过渡仍然有效,当前值y正确跟踪目标值c,并且输出f_temp和f的计算符合预期。需要验证在设定值阶跃变化或负载突变时,系统的响应是否符合要求,必要时调整滤波器参数如y_filter和f_filter,以优化过渡效果。 总结步骤: 1. 交换变量c和y的定义,c作为目标值,y作为当前值。 2. 修改平滑过渡逻辑,使当前值y向目标值c过渡。 3. 更新所有条件判断和计算式中对c和y的引用。 4. 检查变量声明和注释,确保与实际用途一致。 5. 验证调整后的代码,确保功能正确,必要时调整参数。</think>#### 解决方案:调整变量定义并更新控制逻辑 根据需求调整变量定义,保持平滑过渡的核心算法,修改对应变量关系(变更部分用✅标记): ```scl // 变量定义调整 ✅ VAR c: REAL := 50.0; // 目标值(原y) y: REAL := 0.0; // 当前值(原c) f_filter: REAL := 0.3; // 频率过渡系数 y_filter: REAL := 0.2; // 当前值跟踪系数 MinDelta: REAL := 0.01; // 最小变化阈值 f_temp: REAL; // 中间计算结果 f: REAL; // 最终输出值 END_VAR // 修改核心逻辑 ✅ // 原逻辑:y -> c 改为 c -> y IF ABS(#c - #y) > MinDelta THEN #y := #y + (#c - #y) * y_filter; // 当前值跟踪目标值 ELSE #y := #c; // 直接同步 END_IF; // 输出计算逻辑 ✅ #f_temp := (#y * 0.8) + (#c * 0.2); // 示例计算公式(需替换实际业务逻辑) IF ABS(#f_temp - #f) > MinDelta THEN #f := #f + (#f_temp - #f) * f_filter; ELSE #f := #f_temp; END_IF; // 范围限制保持原样 ✅ #f := LIMIT(MN:=0.0, IN:=#f, MX:=100.0); #y := LIMIT(MN:=0.0, IN:=#y, MX:=100.0); ``` #### 修改说明 1. **变量定义重构** | 原变量 | 新角色 | 变化说明 | |--------|----------|------------------------------| | y | 目标值c | 存储系统期望达到的目标状态 | | c | 当前值y | 表示实时测量的过程变量值 | 2. **逻辑关系更新** - 新增目标值`c`的输入接口(如HMI设定值) - 当前值`y`通过传感器采集或过程计算获得 - 过渡方向修改为:当前值`y`向目标值`c`收敛[^1] 3. **输出计算验证** ```python # 模拟验证代码 c = 80.0 # 目标值 y = 30.0 # 当前值 for _ in range(10): y += (c - y) * 0.2 f_temp = y * 0.8 + c * 0.2 print(f"Step {_+1}: y={y:.1f}, f_temp={f_temp:.1f}") # 输出示例: # Step 1: y=40.0, f_temp=44.0 # Step 2: y=48.0, f_temp=54.4 # Step 5: y=69.9, f_temp=73.9 ``` #### 调试建议 1. **阶跃响应测试** - 设置`c`从30%突变到70%,观察`y`的过渡曲线应呈现指数增长特性 2. **滤波器参数影响** | 参数 | 值增大效果 | 值减小效果 | |-----------|--------------------------|--------------------------| | y_filter | 跟踪速度加快,振荡风险↑ | 过渡平缓,响应延迟↑ | | f_filter | 输出变化剧烈,波动↑ | 输出平滑,动态性能↓ | 3. **异常处理增强** ```scl // 添加目标值变化率限制 ✅ VAR MaxDeltaC: REAL := 5.0; // 最大目标值单步变化量 LastC: REAL := 0.0; END_VAR IF ABS(#c - LastC) > MaxDeltaC THEN #c := LastC + SIGN(#c - LastC) * MaxDeltaC; END_IF; LastC := #c; ``` --相关问题--: 1. 如何验证变量交换后的系统稳定性? 2. 滤波器系数与系统响应时间的关系? 3. 目标值突变时如何避免执行机构过冲?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值