电话: 邮箱:

AG真人 让数学公式自动推导

发布日期:2026-05-19 04:55 作者:admin 来源:未知 点击:141

AG真人 让数学公式自动推导

咱们在作念数学公式推导的视频时,比如,念念展示一个因式剖判:x 2 + 2 x + 1 x^2+2x+1 x 2 + 2 x + 1 酿成 ( x + 1 ) 2 (x+1)^2 ( x + 1 ) 2 的,或者反过来因式伸开,齐需要手动计较剖判或伸开后的适度。

然后再作念一个切换动画。

expr1 = MathTex("x^2 +

expr2 = MathTex("(x +

self.play(Transform(expr1, expr2))

苟简的公式不错手动去作念,若是公式稍稍复杂呢?比如:

x 3 − 6 x 2 + 11 x − 6 x^3-6x^2+11x-6 x 3 #Python #动效 #数学 #每天一个学问点− 6 x 2 + 11 x − 6 可剖判成: ( x − 1 ) ( x − 2 ) ( x − 3 ) (x-1)(x-2)(x-3) ( x − 1 ) ( x − 2 ) ( x − 3 )2 x 3 + 4 x 2 − 30 x 2x^3 + 4x^2-30x 2 x 3 + 4 x 2 − 30 x 可剖判成: 2 x ( x − 3 ) ( x + 5 ) 2x(x-3)(x+5) 2 x ( x − 3 ) ( x + 5 )... ...这几个公式就不是那么容易剖判了,咱们制作公式变换的数学动画,或者绘制函数图像时,笃定不念念把时刻花在这些数学推导上。

那么,把 SymPy 引进了 Manim 的动画制作中—— 一切齐变了。

1. 痛点收复:手动推导假定咱们要展示从 ( x + 2 ) ( x − 3 ) (x+2)(x-3) ( x + 2 ) ( x − 3 ) 伸开到 x 2 − x − 6 x^2-x-6 x 2 − x − 6 的进程。 传统作念法会这么写: # 原始因式

expr_origin = MathTex("(x + 2)(x - 3)")

# 手动计较中间方法(默算 or 草稿纸)

# ... ...

# 统一同类项

expr_result = MathTex("x^2 - x - 6")

# 然后动画切换切换...

self.play(Transform(expr_origin, expr_result))

问题可想而知:

容易算错(高出是整个复杂时)无法自动化(换个新公式就得重写代码)短少动态生成的纯真性咱们真实需要的 是一个能自动惩处代数变形,况且把适度无缝喂给 Manim 的管说念。

Python 2. SymPy 登场:代数变形的“发动机”SymPy 是 Python 的标志计较库,苟简说便是能让计较机帮你 推导数学公式 。

C 中枢刀兵: expand 和 factorfrom sympy import symbols, expand, factor, latex

x = symbols("x")

# 原始抒发式:因边幅式

expr_factored = (x + 2) * (x - 3)

# 一键伸开!

expr_expanded = expand(expr_factored) print(expr_expanded) # 输出:x**2 - x - 6

# 再一键因式剖判!

expr_back = factor(expr_expanded) print(expr_back) # 输出:(x - 3)*(x + 2)

expand 按次不错匡助咱们将因式伸开;

factor 方规则是剖判因式。

SymPy 不仅能复返计较适度,还能生成 LaTeX 字符串 ,这恰是 Manim 渲染公式需要的方法:

from sympy import latex

latex_code = latex(expr_expanded) print(latex_code) # 输出:x^{2} - x - 6

有了这个“发动机”,咱们只需要告诉 SymPy 最先和至极,中间的整个代数变形它齐能自动计较。

3. Manim 联动实战:让公式自动推导底下通过一个弧线绘制的示例来演示 SymPy 怎样让 Manim 动画愈加苟简。

为了大概绘制弧线的按次大概通用,咱们封装几个函数:

from sympy import symbols, sympify, solve, Eq, latex, lambdify

def plot_function_curve(axes, equation_str, x_range, plot_range): """ 绘制函数弧线

Args: axes: 坐标系对象 equation_str: 方程字符串,如 "x**2 - x - 6" x_range: 画图 x 规模,如 [-3.5, 4.5] plot_range: 用于 sympy 求解的 x 规模

Returns: graph: 弧线对象 graph_label: 弧线标签 """ x = symbols("x") expr = sympify(equation_str)

# 创建可调用函数

f = lambdify(x, expr, modules="numpy")

# 绘制弧线

graph = axes.plot(f, x_range=x_range, color=YELLOW, stroke_width=3)

# 创建标签

graph_label = axes.get_graph_label( graph, label=f"f(x)={latex(expr)}", x_val=x_range[1], direction=UP * 3 )

return graph, graph_label

def find_roots(equation_str): """ 使用 SymPy 求解方程的根

Args: equation_str: 方程字符串,如 "x**2 - x - 6"

Returns: roots: 实数根列表 """ x = symbols("x") expr = sympify(equation_str)

# 求解方程 f(x) = 0

solutions = solve(Eq(expr, 0), x)

# 只保留实数根

roots = [] for sol in solutions: if sol.is_real: roots.append(float(sol))

return roots

def create_root_markers(axes, roots): """ 创建零点标记和标签

Args: axes: 坐标系对象 roots: 根的列表

Returns: root_dots: 零点标记组 root_labels: 零点标签组 """ root_dots = VGroup root_labels = VGroup

for rx in roots: # 在零点处画点

dot = Dot(axes.c2p(rx, 0), color=RED, radius=0.1) # 添加坐标标签

label = MathTex(f"({rx}, 0)", font_size=30, color=RED).next_to(dot, UP * 0.5) root_dots.add(dot) root_labels.add(label)

return root_dots, root_labels

其中:

plot_function_curve :把柄弧线方程的字符串(比如 "x**2 - x - 6" )来绘制弧线find_roots :求解弧线方程的根,AG真人中国官网入口也便是和弧线和 X 轴的交点create_root_markers :把弧线方程的根标记出来有了上头封装的函数,绘制一个弧线的动画代码就十分简易了。

class PlotQuadraticFunction(Scene):

def construct(self):

# 1. 创建坐标系

axes = Axes( x_range=[-4, 5, 1], # x 轴规模:-4 到 5,步长 1

y_range=[-8, 10, 2], # y 轴规模:-8 到 10,步长 2

x_length=8, y_length=6, axis_config={"color": BLUE, "include_numbers": True, "font_size": 24}, x_axis_config={"numbers_to_include": range(-4, 6)}, y_axis_config={"numbers_to_include": range(-8, 11, 2)}, ) axes_labels = axes.get_axis_labels(x_label="x", y_label="f(x)")

开云kaiyun(中国)体育官网

# 界说方程

equation = "x**2 - x - 6"

# 绘制函数图像

graph, graph_label = plot_function_curve( axes, equation, x_range=[-3.5, 4.5], plot_range=[-4, 5] )

# 使用 SymPy 求解零点

roots = find_roots(equation)

# 创建零点标记

root_dots, root_labels = create_root_markers(axes, roots)

# 动画展示

self.play(Create(axes), Write(axes_labels)) self.wait

self.play(Create(graph), Write(graph_label)) self.wait

self.play( LaggedStart( *[Create(dot) for dot in root_dots], *[Write(label) for label in root_labels], lag_ratio=0.3, ) ) self.wait

上头的代码看着长,其实要害的就一瞥:equation = "x**2 - x - 6" 。

其他部分齐是渲染坐标系,创建各式元素的动画等等。

生成的成果如下:

使用 SymPy 中中枢的几个按次如下:

sympify :比如, expr = sympify(equation_str) 将弧线方程的字符串改造成 SymPy 中的标志公式lambdify : SymPy 中的标志公式改造为 Python 函数(供 Manim 绘制弧线用)latex :比如, latex(expr) ,将 SymPy 中的标志公式改造为 Manim 中显现公式的 Latex 方法solve : solve(Eq(expr, 0), x) ,求解方程的根,也便是动画中标记的与 X 轴的交点只从上头示例中的代码,可能还看不出来上 SymPy 和 Manim 团结的威力。

这时候,怎样咱们还念念绘制另一个弧线,x 3 − 6 x 2 + 11 x − 6 x^3-6x^2+11x-6 x 3 − 6 x 2 + 11 x − 6 ,那么,唯有改一瞥代码就行了。

equation = "x**2 - x - 6" 改成 "x**3 - 6*(x**2) +11*x - 6"

这里显现的有点重迭,咱们不错把柄弧线显现的情况,调治下坐标系或弧线参数的规模。

axes = Axes(

x_range=[-2, 5, 1],

# ...

x_axis_config={"numbers_to_include": range(-1, 6)}, # ...

)

# 绘制函数图像

graph, graph_label = plot_function_curve( axes, equation, x_range=[-1, 4.5], plot_range=[-1, 5] # 调治了这里的规模

)

4. 小结本文主要本色如下: 痛点解析 :手动推导公式既低效又容易出错。SymPy 中枢本事 : expand 伸开、 factor 因式剖判、 latex 改造。Manim 联动套路 : SymPy 算 → LaTeX 转 → Manim 渲染。任何代数方程的 因式变化 或 弧线函数 齐不错 自动化生成 AG真人,咱们不错把元气心灵连合在动画节拍和视觉操办上。