向量分析可视化

斯托克斯公式演示

围绕斯托克斯公式演示,观察斯托克斯公式、环流量、旋度密度之间的关系与推理路径。

打开原视频

stokes_theorem.py
1from manim import *2import numpy as np3 4config.tex_template = TexTemplateLibrary.ctex5config.tex_template.add_to_preamble(r"\setCJKmainfont{STSong}")6 7class StokesTheorem(ThreeDScene):8    def construct(self):9        # 创建标题10        title = Text("斯托克斯公式演示", font="STSong", font_size=48)11        self.add_fixed_in_frame_mobjects(title)12        self.play(Write(title))13        self.wait(1)14        self.play(FadeOut(title))15 16        # 创建3D坐标系17        axes = ThreeDAxes(18            x_range=[-3, 3, 1],19            y_range=[-3, 3, 1],20            z_range=[-1, 3, 1],21            x_length=6,22            y_length=6,23            z_length=424        )25 26        # 设置相机视角27        self.set_camera_orientation(28            phi=70*DEGREES,29            theta=-45*DEGREES30        )31 32        self.play(Create(axes))33        self.wait(1)34 35        # 创建曲面(抛物面)36        surface = Surface(37            lambda u, v: np.array([u, v, 0.5*(u**2 + v**2)]),38            u_range=[-1, 1],39            v_range=[-1, 1],40            resolution=(20, 20),41            fill_color=BLUE,42            fill_opacity=0.3  # 降低透明度以便看清向量场43        )44 45        # 创建边界曲线46        def param_curve(t):47            x = np.cos(t)48            y = np.sin(t)49            z = 0.5*(x**2 + y**2)50            return np.array([x, y, z])51 52        boundary = ParametricFunction(53            param_curve,54            t_range=[0, TAU],55            color=YELLOW56        )57 58        # 显示曲面和边界59        self.play(Create(surface))60        self.play(Create(boundary))61        self.wait(1)62 63        # 创建向量场 F = (-y, x, z/2)64        def vector_field_func(point):65            x, y, z = point66            return np.array([-y, x, z/2]) / 267 68        # 在曲面上创建向量场69        vector_field = VGroup()70        n_points = 6  # 每个方向上的点数71        for u in np.linspace(-0.9, 0.9, n_points):72            for v in np.linspace(-0.9, 0.9, n_points):73                if u**2 + v**2 <= 0.9:  # 只在边界内显示向量场74                    point = np.array([u, v, 0.5*(u**2 + v**2)])75                    vector = vector_field_func(point)76                    arrow = Arrow3D(77                        start=point,78                        end=point + vector,79                        color=BLUE,80                        thickness=0.0281                    )82                    vector_field.add(arrow)83 84        # 显示向量场85        self.play(Create(vector_field))86        self.wait(1)87 88        # # 添加向量场说明89        # field_text = Text("向量场 F = (-y, x, z/2)", font="STSong", color=BLUE).scale(0.6)90        # field_text.to_corner(UL)91        # self.add_fixed_in_frame_mobjects(field_text)92        # self.play(Write(field_text))93 94        # 创建移动的点和向量95        dot = Sphere(radius=0.05, color=RED)96        dot.move_to(param_curve(0))97 98        # 创建切向量99        def get_work_vector(t):100            point = param_curve(t)101            x, y, z = point102            field_vector = np.array([-y, x, z/2]) / 2103            return Arrow3D(104                start=point,105                end=point + field_vector,106                color=GREEN,107                thickness=0.02108            )109 110        work_vector = get_work_vector(0)111 112        # 添加环流说明113        circulation_text = Text("沿边界曲线的环流", font="STSong", color=GREEN).scale(0.6)114        circulation_text.to_corner(UL)  # 改为左上角115        self.add_fixed_in_frame_mobjects(circulation_text)116 117        # 显示点和向量118        self.play(Create(dot), Create(work_vector))119        self.play(Write(circulation_text))120 121        # 创建环流动画122        def update_dot_and_vector(mob, alpha):123            point = param_curve(alpha * TAU)124            dot.move_to(point)125            new_vector = get_work_vector(alpha * TAU)126            work_vector.become(new_vector)127 128        # 执行环流动画129        self.play(130            UpdateFromAlphaFunc(dot, update_dot_and_vector),131            run_time=6,132            rate_func=linear133        )134        self.wait(1)135 136        # 显示斯托克斯公式137        stokes_formula = MathTex(138            r"\oint_C \vec{F} \cdot d\vec{r} = \iint_S (\nabla \times \vec{F}) \cdot d\vec{S}"139        ).scale(0.8)140        stokes_formula.to_corner(UR)141        self.add_fixed_in_frame_mobjects(stokes_formula)142        self.play(Write(stokes_formula))143 144        # 显示旋度向量145        curl_vector = Arrow3D(146            start=np.array([0, 0, 0.5]),147            end=np.array([0, 0, 1.5]),148            color=RED,149            thickness=0.03150        )151 152        # 显示旋度153        self.play(Create(curl_vector))154        self.wait(1)155 156        # 相机旋转157        self.begin_ambient_camera_rotation(rate=0.2)158        self.wait(4)159        self.stop_ambient_camera_rotation()160        self.wait(2)161 162def main():163    import os164    os.system("manim -pql stokes_theorem.py StokesTheorem")165 166if __name__ == "__main__":167    main()

讲解

这个视频围绕「斯托克斯公式演示」展开。画面把问题、图像和公式放在同一条理解路径中,让抽象关系先被看见。

开头先建立问题背景和主要对象,让观察从标题、坐标或第一组关系进入。

画面中出现的文字「斯托克斯公式演示」给出视觉入口。随后画面通过对象创建、移动、淡入淡出和高亮,把抽象命题拆成可以跟随的步骤。

随后出现更具体的图像或公式提示,动画会把局部对象和整体结论联系起来。这里可以重点观察变量、曲线、区域或向量如何随镜头推进而变化。

观察路径

观察路径可以分三步:先锁定「斯托克斯公式演示」中的核心对象,尤其留意斯托克斯公式、环流量、旋度密度之间的联系;再跟随画面中变量、图像或向量的变化;最后回到公式或结论,判断局部变化如何支撑整体关系。

本页可以从斯托克斯公式、环流量、旋度密度、边界正方向、曲面积分这些概念进入,继续沿相邻问题观察同一类数学结构。