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() 讲解
这个视频围绕「斯托克斯公式演示」展开。画面把问题、图像和公式放在同一条理解路径中,让抽象关系先被看见。
开头先建立问题背景和主要对象,让观察从标题、坐标或第一组关系进入。
画面中出现的文字「斯托克斯公式演示」给出视觉入口。随后画面通过对象创建、移动、淡入淡出和高亮,把抽象命题拆成可以跟随的步骤。
随后出现更具体的图像或公式提示,动画会把局部对象和整体结论联系起来。这里可以重点观察变量、曲线、区域或向量如何随镜头推进而变化。
观察路径
观察路径可以分三步:先锁定「斯托克斯公式演示」中的核心对象,尤其留意斯托克斯公式、环流量、旋度密度之间的联系;再跟随画面中变量、图像或向量的变化;最后回到公式或结论,判断局部变化如何支撑整体关系。
本页可以从斯托克斯公式、环流量、旋度密度、边界正方向、曲面积分这些概念进入,继续沿相邻问题观察同一类数学结构。