慢吞云雾缓吐愁 发表于 4 小时前

一次函数图像工厂:用 SymPy 自动天生 y=kx+b 对比动画

你在用 Manim 制作一次函数图像的对比动画时,是不是也遇到过这种贫困:想直观展示差别斜率 k 和截距 b 对直线的影响,但每改一个参数,都得重新手算两端点坐标、重新算与坐标轴的交点,以致要凭感觉“拉长”线段包管它贯穿画面。
改三组参数,工作量就翻三倍。
本日这篇文章,就是要彻底办理这个体力活。我会带你用 SymPy 把盘算交给代码,让 Manim 只负责“画”,实现一次函数图像的自动化天生与对比。
1. 痛点场景还原

假设我们想做一个简朴的对比动画,在坐标系里同时画出:

[*]$ y = 2x + 1$
[*]$ y = -\frac{1}{2}x + 3 $
如果纯用 Manim 手写,我们一样平常会如许写(只画此中一条的片断):
from manim import *

class ManualLinear(Scene):
    def construct(self):
      ax = Axes(
            x_range=[-5, 5],
            y_range=[-5, 5],
            axis_config={"include_numbers": True}
      )
      # 手动计算两个点的坐标,以保证线段能覆盖整个画面
      # y = 2x + 1,当 x=-5 时 y=-9,当 x=5 时 y=11
      line1 = Line(ax.c2p(-5, -9), ax.c2p(5, 11), color=RED)
      # 手动计算与 y 轴的交点 (0, 1)
      intercept_dot = Dot(ax.c2p(0, 1), color=YELLOW)

      self.add(ax, line1, intercept_dot)https://img2024.cnblogs.com/blog/83005/202606/83005-20260603134809596-501625238.gif这里的标题很显着:端点坐标、截距坐标都是我“算出来写死”的。
如果想把 k 改成 -0.7,b 改成 2.5,上面全部数字都得重新算一遍。
更难熬的是,如果想让线段刚好卡在坐标轴的边框上(既不超出也不短),还必要解方程求直线与矩形边框的交点——手动做着实太低效了。
这还只是一条线,如果要一次性展示 k 从 -2 到 2 的多条直线,手动盘算根本不大概。
2. SymPy 办理方案:把盘算“外包”出去

办理思绪非常直接:用 SymPy 负责符号运算,根据给定的参数自动求出我们必要的全部坐标。
焦点使命有三个:

[*]给定 k、b 和坐标系可视范围,自动天生直线的两个端点(恰恰落在边框上)
[*]自动求出直线与坐标轴的交点(截距)
[*]判定两条直线是否平行(系数比力)
先看纯 SymPy 的运算逻辑,不必要 Manim:
import sympy as spx, y = sp.symbols('x y')k, b = sp.symbols('k b')expr = k * x + b# y = kx + b# 示例:取 k=2, b=1,x 范围 [-5, 5],y 范围 [-5, 5]x_min, x_max = -5, 5y_min, y_max = -5, 5# 1. 求与坐标轴的交点x_intercept = sp.solve(expr.subs({k: 2, b: 1}), x)# 令 y=0# x_intercept = [-1/2]即 (-0.5, 0)y_intercept = expr.subs({k: 2, b: 1, x: 0})         # 令 x=0# y_intercept = 1即 (0, 1)# 2. 自动求边框端点:解直线与 x=x_min, x=x_max, y=y_min, y=y_max 的交点,#    生存落在矩形范围且是“极值方向”的两个点points_on_border = []for x_val in (x_min, x_max):    y_val = expr.subs({k: 2, b: 1, x: x_val})    if y_min
页: [1]
查看完整版本: 一次函数图像工厂:用 SymPy 自动天生 y=kx+b 对比动画