series_convergence.py
1from manim import *2import numpy as np3 4class SeriesConvergence(Scene):5 def construct(self):6 # 创建标题7 title = Text("级数收敛性演示", font="SimSun", font_size=36)8 title.to_edge(UP)9 self.play(Write(title))10 self.wait(1)11 12 # 创建坐标系13 axes = Axes(14 x_range=[0, 10, 1],15 y_range=[0, 2.5, 0.5],16 axis_config={"color": GREY},17 x_length=10,18 y_length=619 ).shift(DOWN * 0.5)20 21 axes_labels = axes.get_axis_labels(22 x_label="n",23 y_label="S_n"24 )25 26 self.play(Create(axes), Write(axes_labels))27 self.wait(1)28 29 # 创建几何级数 Sn = 1 + 1/2 + 1/4 + ... + 1/2^n30 def geometric_sum(n):31 return 2 * (1 - 1/2**(n+1))32 33 geometric_points = [axes.c2p(n, geometric_sum(n)) for n in range(10)]34 geometric_dots = VGroup(*[Dot(point, color=BLUE) for point in geometric_points])35 geometric_line = VMobject(color=BLUE)36 geometric_line.set_points_smoothly(geometric_points)37 38 geometric_label = MathTex(39 r"S_n = \sum_{k=0}^n \frac{1}{2^k}",40 color=BLUE41 ).scale(0.8).next_to(axes, UP, buff=0.2)42 43 # 创建调和级数 Sn = 1 + 1/2 + 1/3 + ... + 1/n44 def harmonic_sum(n):45 return sum(1/k for k in range(1, n+2))46 47 harmonic_points = [axes.c2p(n, harmonic_sum(n)) for n in range(10)]48 harmonic_dots = VGroup(*[Dot(point, color=RED) for point in harmonic_points])49 harmonic_line = VMobject(color=RED)50 harmonic_line.set_points_smoothly(harmonic_points)51 52 harmonic_label = MathTex(53 r"H_n = \sum_{k=1}^n \frac{1}{k}",54 color=RED55 ).scale(0.8).next_to(geometric_label, DOWN, buff=0.2)56 57 # 显示几何级数58 self.play(Write(geometric_label))59 for i in range(len(geometric_dots)):60 self.play(61 Create(geometric_dots[i]),62 Create(geometric_line) if i == len(geometric_dots)-1 else Wait(),63 run_time=0.364 )65 self.wait(1)66 67 # 显示调和级数68 self.play(Write(harmonic_label))69 for i in range(len(harmonic_dots)):70 self.play(71 Create(harmonic_dots[i]),72 Create(harmonic_line) if i == len(harmonic_dots)-1 else Wait(),73 run_time=0.374 )75 self.wait(1)76 77 # 添加极限线78 limit_line = DashedLine(79 axes.c2p(0, 2),80 axes.c2p(10, 2),81 color=BLUE_A82 )83 limit_label = MathTex(r"\lim_{n \to \infty} S_n = 2", color=BLUE_A).next_to(limit_line, RIGHT)84 85 self.play(86 Create(limit_line),87 Write(limit_label)88 )89 self.wait(1)90 91 # 添加发散箭头92 divergent_arrow = Arrow(93 axes.c2p(9, 2.3),94 axes.c2p(10, 2.5),95 color=RED_A,96 buff=097 )98 divergent_label = MathTex(99 r"\lim_{n \to \infty} H_n = \infty",100 color=RED_A101 ).next_to(divergent_arrow, RIGHT)102 103 self.play(104 Create(divergent_arrow),105 Write(divergent_label)106 )107 self.wait(1)108 109 # 添加部分和公式110 geometric_sum_formula = MathTex(111 r"S_n = 2(1-\frac{1}{2^{n+1}})",112 color=BLUE113 ).scale(0.8).to_corner(DL)114 115 harmonic_sum_formula = MathTex(116 r"H_n \approx \ln(n) + \gamma",117 color=RED118 ).scale(0.8).next_to(geometric_sum_formula, DOWN, buff=0.2)119 120 self.play(121 Write(geometric_sum_formula),122 Write(harmonic_sum_formula)123 )124 125 # 添加解释文本126 explanation = Text(127 "几何级数收敛性分析:\n" + 128 "1. 首项为1,公比为1/2\n" +129 "2. |q| = 1/2 < 1,级数收敛\n" +130 "3. 收敛于S∞ = a/(1-q) = 2",131 font="SimSun",132 font_size=24,133 line_spacing=1.2134 ).to_corner(DR)135 136 self.play(Write(explanation))137 self.wait(2)138 139def main():140 import os141 os.system("manim -pqh series_convergence.py SeriesConvergence")142 143if __name__ == "__main__":144 main() 讲解
这个视频围绕「级数收敛性演示」展开。画面把问题、图像和公式放在同一条理解路径中,让抽象关系先被看见。
开头先建立问题背景和主要对象,让观察从标题、坐标或第一组关系进入。
画面中出现的文字「级数收敛性演示」给出视觉入口。随后画面通过对象创建、移动、淡入淡出和高亮,把抽象命题拆成可以跟随的步骤。
随后出现更具体的图像或公式提示,动画会把局部对象和整体结论联系起来。这里可以重点观察变量、曲线、区域或向量如何随镜头推进而变化。
核心公式可以写成:
这类公式可以和画面中的符号一一对应。
观察路径
观察路径可以分三步:先锁定「级数收敛性演示」中的核心对象,尤其留意无穷级数、级数收敛、部分和之间的联系;再跟随画面中变量、图像或向量的变化;最后回到公式或结论,判断局部变化如何支撑整体关系。
本页可以从无穷级数、级数收敛、部分和这些概念进入,继续沿相邻问题观察同一类数学结构。