多元微积分可视化

二重积分的换元法

围绕二重积分的换元法,观察换元法、二重积分、极坐标之间的关系与推理路径。

打开原视频

integral_substitution.py
1from manim import *2import numpy as np3 4class IntegralSubstitution(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        # 创建两个坐标系,左边xy平面,右边rθ平面13        xy_axes = Axes(14            x_range=[-2, 2],15            y_range=[-2, 2],16            axis_config={"color": GREY},17            x_length=4,18            y_length=4,19        ).shift(LEFT * 4)20 21        rt_axes = Axes(22            x_range=[0, 1.2],  # r的范围23            y_range=[0, 2*np.pi],  # θ的范围24            axis_config={"color": GREY},25            x_length=4,26            y_length=4,27        ).shift(RIGHT * 4)28 29        # 添加坐标轴标签30        xy_labels = VGroup(31            xy_axes.get_x_axis_label("x", direction=DOWN),32            xy_axes.get_y_axis_label("y")33        )34        rt_labels = VGroup(35            rt_axes.get_x_axis_label("r", direction=DOWN),36            rt_axes.get_y_axis_label(r"\theta")37        )38 39        # 显示坐标系和标签40        self.play(41            Create(xy_axes), Create(rt_axes),42            Write(xy_labels), Write(rt_labels)43        )44        self.wait(1)45 46        # 添加坐标值标注47        xy_axes.add_coordinates()  # 添加xy平面的坐标值48        49        # 为rθ平面添加自定义坐标值50        r_numbers = VGroup()51        r_values = [0, 0.5, 1]52        53        for value in r_values:54            tex = MathTex(str(value), font_size=24)55            tex.next_to(rt_axes.x_axis.n2p(value), DOWN)56            r_numbers.add(tex)57        58        # 为θ轴添加特殊标注59        theta_numbers = VGroup()60        theta_values = [0, np.pi, 2*np.pi]61        theta_labels = ["0", r"\pi", r"2\pi"]62        63        for value, label in zip(theta_values, theta_labels):64            tex = MathTex(label, font_size=24)65            tex.next_to(rt_axes.y_axis.n2p(value), LEFT)66            theta_numbers.add(tex)67        68        self.play(Write(VGroup(r_numbers, theta_numbers)))69 70        # 在xy平面创建一个圆形区域71        xy_region = Circle(radius=1, color=BLUE, fill_opacity=0.3)72        xy_region.move_to(xy_axes.c2p(0, 0))73 74        # 添加圆的范围标注75        radius_line = Line(76            xy_axes.c2p(0, 0),77            xy_axes.c2p(1, 0),78            color=WHITE79        )80        radius_label = MathTex("r=1", font_size=24).next_to(radius_line, DOWN, buff=0.1)81        82        # 显示区域和标注83        self.play(Create(xy_region))84        self.play(Create(radius_line), Write(radius_label))85        self.wait(1)86 87        # 创建网格点来显示变换88        n_r = 8  # r方向的点数89        n_theta = 16  # θ方向的点数90        dots_xy = VGroup()91        dots_rt = VGroup()92        93        for i in range(n_r + 1):94            r = i / n_r95            for j in range(n_theta):96                theta = j * 2 * np.pi / n_theta97                # xy平面上的点98                x = r * np.cos(theta)99                y = r * np.sin(theta)100                dot_xy = Dot(101                    xy_axes.c2p(x, y),102                    color=BLUE,103                    radius=0.02104                )105                dots_xy.add(dot_xy)106                107                # rθ平面上的点108                dot_rt = Dot(109                    rt_axes.c2p(r, theta),110                    color=RED,111                    radius=0.02112                )113                dots_rt.add(dot_rt)114 115        self.play(Create(dots_xy))116        self.wait(1)117 118        # 在rθ平面创建变换后的矩形区域119        # 计算矩形的实际尺寸120        r_range = rt_axes.x_range[1] - rt_axes.x_range[0]  # r的范围长度121        theta_range = rt_axes.y_range[1] - rt_axes.y_range[0]  # θ的范围长度122        123        # 创建矩形,使用坐标轴的比例124        rt_region = Rectangle(125            width=rt_axes.get_x_axis().get_unit_size() * 1,  # r从0到1126            height=rt_axes.get_y_axis().get_unit_size() * 2*np.pi,  # θ从0到2π127            color=RED,128            fill_opacity=0.3129        )130        131        # 将矩形的左下角对齐到原点,然后向右移动到r=0的位置132        rt_region.align_to(rt_axes.c2p(0, 0), DL)133        134        # 添加范围标注(不使用花括号)135        r_text = MathTex("0 \leq r \leq 1", font_size=24).next_to(136            rt_region, 137            DOWN, 138            buff=0.5  # 增加下方间距139        )140        theta_text = MathTex("0 \leq \\theta \leq 2\pi", font_size=24).next_to(141            rt_region, 142            RIGHT143        )144 145        # 显示变换过程和标注146        self.play(147            Transform(dots_xy.copy(), dots_rt),148            Create(rt_region)149        )150        self.play(151            Write(r_text),152            Write(theta_text)153        )154        self.wait(1)155 156        # 添加变换公式157        transform_formula = MathTex(158            r"\begin{cases} x &= r\cos\theta \\ y &= r\sin\theta \end{cases}",159            font_size=32160        ).next_to(title, DOWN)161        162        self.play(Write(transform_formula))163        self.wait(1)164 165        # 添加雅可比行列式166        jacobian = MathTex(167            r"J = \begin{vmatrix} \cos\theta & -r\sin\theta \\ \sin\theta & r\cos\theta \end{vmatrix} = r",168            font_size=32169        ).next_to(transform_formula, DOWN)170        171        self.play(Write(jacobian))172        self.wait(1)173 174        # 添加换元公式175        integral_formula = MathTex(176            r"\iint_D f(x,y)dxdy = \iint_{D'} f(r\cos\theta,r\sin\theta)r\,drd\theta",177            font_size=32178        ).to_edge(DOWN)179        180        self.play(Write(integral_formula))181        self.wait(2)

讲解

这个视频围绕「二重积分的换元法」展开。画面把问题、图像和公式放在同一条理解路径中,让抽象关系先被看见。

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

画面中出现的文字「二重积分的换元法(极坐标变换)」给出视觉入口。随后画面通过对象创建、移动、淡入淡出和高亮,把抽象命题拆成可以跟随的步骤。

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

核心公式可以写成:

r=1r=1

这类公式可以和画面中的符号一一对应。

观察路径

观察路径可以分三步:先锁定「二重积分的换元法」中的核心对象,尤其留意换元法、二重积分、极坐标之间的联系;再跟随画面中变量、图像或向量的变化;最后回到公式或结论,判断局部变化如何支撑整体关系。

本页可以从换元法、二重积分、极坐标、雅可比行列式这些概念进入,继续沿相邻问题观察同一类数学结构。