這個是以前計算二重積分時動畫,只是說明了計算順序是不影響結果的,在解題時,看哪個好計算就先計算哪個。接下來是具體看兩種積分方式所要表達的細節,題目也是求曲頂立體的體積,顧名思義就是頂部是曲面的立體圖形:其中曲面方程如下,那么微積分的思想就是用無數的左邊這樣的小立方體來填滿這個大的立方體,因為對于常規的長方體我們是知道體積公式的。底面積乘以高嘛,所以對于這個小的立方體(微分),它的底面積就是長乘以寬(dx·dy),只不過它的長和寬屬于無窮小量,理解上沒有區別,看成是常規的長方體就好了。高就是z,是一個變化的量,就是曲面方程,所以小的立體的體積就很容易計算出來了。而這樣的小立體在x和y軸方向都非常多,所以將兩個方向的小立體都加起來就組成了這個曲頂立體的體積,也就是二重積分:那么如何來計算這個曲頂立體的體積的具體值呢?使用二次積分。先計算關于x的定積分,然后再計算關于y的定積分,計算完畢之后就是曲頂立體的體積了這里我們可以看到,是垂直于y方向對曲頂立體進行切片,這樣的話,截面面積就是平時我們熟悉的定積分:∫f(x)dx ,只不過這里的f(x)變成了f(x,y)而已,計算的時候,我們將除了x之外的變量看成是常量就好了,所以在計算關于x積分的時候,我們是將y看成了常量。這樣積分之后的結果就只留下了y。然后往y軸方向進行積分,也就是乘以高度(厚度的累計)這樣不就得到了曲頂體積了嗎?現在反過來,先計算y方向再計算x,那么這里的切片就是垂直于x方向了,截面面積就變成了關于y的定積分,同樣的將x看成是常量即可,計算定積分之后的結果就只剩下x,接著就是計算關于x的定積分了。這里的厚度也發生了變化,是沿著x軸方向進行積分,所以厚度是dx了。可以看到最終計算的結果,肯定是一樣的,不同的積分順序,表達的思維方式是不一樣的。 from manimlib import * class A1(Scene): def construct(self): info1 = Tex(r'\text{三維空間中存在一個曲面',r'\text{C為頂部}',r'\text{,陰影區域矩形}',r'\text{D為底部}',r'\text{,形成一個空間中的立體區域}',font='SimSun',font_size=25).to_edge(UP) info1[1].set_color(BLUE) info1[3].set_color('#00FF00') self.play(FadeIn(info1)) self.wait(3) info2 = Tex(r'\text{曲面方程為:}',r'z = f(x,y) = \frac{x^2}{2} + \frac{y^2}{3} + \frac{xy}{4},(0\leq x \leq 3,0\leq y \leq 2)',r'\text{,求該立體區域的體積V?}',font='SimSun',font_size=25).next_to(info1,DOWN) info2[1].set_color(BLUE) self.play(FadeIn(info2)) self.wait(6) ax = Axes(x_range=[-10, 10], y_range=[-1, 9], axis_config={'stroke_color': GREY,'stroke_width':1,'include_tip': True,'tip_config': {'length': 0.1, 'width': 0.1}},width=10,height=5) #self.add(ax) z = Arrow(ax.c2p(0,0),ax.c2p(0,7),color=BLUE_B,buff=0) z_label = Tex('z',font_size=30,color=BLUE_B).move_to(ax.c2p(-0.3,7)) y = Arrow(ax.c2p(0,0),ax.c2p(-4,2),color=RED_A,buff=0) y_label = Tex('y',font_size=30,color=RED_A).move_to(ax.c2p(-4,2.3)) x = Arrow(ax.c2p(0,0),ax.c2p(8,0),color=GREEN_A,buff=0) x_label = Tex('x',font_size=30,color=GREEN_A).move_to(ax.c2p(8,-0.3)) self.play(FadeIn(z),FadeIn(x),FadeIn(y),FadeIn(z_label),FadeIn(x_label),FadeIn(y_label)) cb1 = CubicBezier(ax.c2p(0,0),ax.c2p(2,0),ax.c2p(4,0),ax.c2p(6,2)) cb2 = CubicBezier(ax.c2p(6,2),ax.c2p(5,3),ax.c2p(4,4),ax.c2p(4,5)) cb3 = CubicBezier(ax.c2p(4,5),ax.c2p(3,4),ax.c2p(1,2),ax.c2p(-2,2)) cb4 = CubicBezier(ax.c2p(-2,2),ax.c2p(-2,1),ax.c2p(0,0),ax.c2p(0,0)) points1 = [cb1.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points2 = [cb2.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points3 = [cb3.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points4 = [cb4.point_from_proportion(t) for t in np.linspace(0, 1, 100)] C = Polygon(*points1,*points2,*points3,*points4,fill_color=BLUE,fill_opacity=0.5,stroke_width=1) self.play(ShowCreation(C)) dl1 = DashedLine(ax.c2p(4,5),ax.c2p(4,1),stroke_width=1) dl2 = DashedLine(ax.c2p(4,1),ax.c2p(6,0),stroke_width=1) dl3 = DashedLine(ax.c2p(4,1),ax.c2p(-2,1),stroke_width=1) line1 = Line(ax.c2p(6,2),ax.c2p(6,0),stroke_width=2) line1_txt = Tex('3',font_size=30,color=GREEN_A).move_to(ax.c2p(6,-0.4)) line2 = Line(ax.c2p(-2,2),ax.c2p(-2,1),stroke_width=2) line2_txt = Tex('2',font_size=30,color=RED_A).move_to(ax.c2p(-2.3,0.7)) self.play(ShowCreation(VGroup(dl1,dl2,dl3,line1,line2)),FadeIn(line1_txt),FadeIn(line2_txt)) # 底部區域 D = Polygon(ax.c2p(-2,1),ax.c2p(4,1),ax.c2p(6,0),ax.c2p(0,0),fill_color='#00FF00',fill_opacity=0.5,stroke_width=0) self.bring_to_back(D) self.play(FadeIn(D)) # 兩個小區域 r1 = Polygon(*points1,ax.c2p(6,2),ax.c2p(6,0),ax.c2p(0,0),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) r2 = Polygon(*points4,ax.c2p(0,0),ax.c2p(-2,1),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) self.play(FadeIn(VGroup(r1,r2))) self.wait(3) # 小長方體(微元) a = ax.c2p(0,3.5) b = ax.c2p(-0.5,3) c = ax.c2p(0.2,3) d = ax.c2p(0.7,3.5) e = ax.c2p(0,0) f = ax.c2p(-0.5,-0.5) g = ax.c2p(0.2,-0.5) h = ax.c2p(0.7,0) rect1 = Polygon(a,b,c,d,fill_color=PINK,color=PINK,fill_opacity=0.6).set_stroke(width=1) rect2 = Polygon(e,f,g,h,fill_color='#00FF00',color='#00FF00',fill_opacity=0.6).set_stroke(width=1) ae = DashedLine(a,e,color=PINK).set_stroke(width=1) ef = DashedLine(e,f,color=PINK).set_stroke(width=1) eh = DashedLine(e,h,color=PINK).set_stroke(width=1) bf = Line(b,f,color=PINK).set_stroke(width=1) cg = Line(c,g,color=PINK).set_stroke(width=1) dh = Line(d,h,color=PINK).set_stroke(width=1) rect3 = Polygon(b,f,g,c,fill_color=PINK,fill_opacity=0.3).set_stroke(width=0) rect4 = Polygon(c,g,h,d,fill_color=PINK,fill_opacity=0.3).set_stroke(width=0) VG = VGroup(rect1,rect2,rect3,rect4,ae,ef,eh,bf,cg,dh).move_to(ax.c2p(-6,4)) self.play(FadeIn(VG)) self.wait(3) ds = Tex(r'\text{底面積:}\textddthvnjxjdtx\textddthvnjxjdty',font='SimSun',font_size=20,color='#00FF00').move_to(ax.c2p(-6.5,1.5)) self.play(FadeIn(ds)) self.wait(3) brace = Brace(bf,LEFT,color=BLUE,buff=0.1) dh = Tex(r'z=f(x,y)',font='SimSun',font_size=20,color=BLUE).next_to(brace,LEFT) self.play(GrowFromCenter(brace),FadeIn(dh)) self.wait(6) V = Tex(r'V = \iint_{D} f(x,y) \textddthvnjxjdtx\textddthvnjxjdty',font='SimSun',font_size=40,color='#00FF00').move_to(ax.c2p(0,-2.5)) self.play(FadeIn(V)) self.wait(3) sr = SurroundingRectangle(V,color='#00FF00',buff=0.2,stroke_width=1) self.play(ShowCreation(sr)) self.wait(6) class A2(Scene): def construct(self): t1 = Tex(r'\text{二次積分}',font='SimSun',font_size=100).shift(UP) self.play(FadeIn(t1)) self.wait(1) t2 = Tex(r'\text{先x后y}',r'\text{ 以及}',r'\text{ 先y后x}',font='SimSun',font_size=60).next_to(t1,DOWN*2) t2[0].set_color(BLUE) t2[2].set_color(RED) self.play(FadeIn(t2)) self.wait(3) self.play(FadeOut(t1),FadeOut(t2)) ax = Axes(x_range=[-10, 10], y_range=[-1, 9], axis_config={'stroke_color': GREY,'stroke_width':1,'include_tip': True,'tip_config': {'length': 0.1, 'width': 0.1}},width=10,height=5) #self.add(ax) z = Arrow(ax.c2p(0,0),ax.c2p(0,7),color=BLUE_B,buff=0) z_label = Tex('z',font_size=30,color=BLUE_B).move_to(ax.c2p(-0.3,7)) y = Arrow(ax.c2p(0,0),ax.c2p(-4,2),color=RED_A,buff=0) y_label = Tex('y',font_size=30,color=RED_A).move_to(ax.c2p(-4,2.3)) x = Arrow(ax.c2p(0,0),ax.c2p(8,0),color=GREEN_A,buff=0) x_label = Tex('x',font_size=30,color=GREEN_A).move_to(ax.c2p(8,-0.3)) cb1 = CubicBezier(ax.c2p(0,0),ax.c2p(2,0),ax.c2p(4,0),ax.c2p(6,2)) cb2 = CubicBezier(ax.c2p(6,2),ax.c2p(5,3),ax.c2p(4,4),ax.c2p(4,5)) cb3 = CubicBezier(ax.c2p(4,5),ax.c2p(3,4),ax.c2p(1,2),ax.c2p(-2,2)) cb4 = CubicBezier(ax.c2p(-2,2),ax.c2p(-2,1),ax.c2p(0,0),ax.c2p(0,0)) points1 = [cb1.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points2 = [cb2.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points3 = [cb3.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points4 = [cb4.point_from_proportion(t) for t in np.linspace(0, 1, 100)] C = Polygon(*points1,*points2,*points3,*points4,fill_color=BLUE,fill_opacity=0.5,stroke_width=1) dl1 = DashedLine(ax.c2p(4,5),ax.c2p(4,1),stroke_width=1) dl2 = DashedLine(ax.c2p(4,1),ax.c2p(6,0),stroke_width=1) dl3 = DashedLine(ax.c2p(4,1),ax.c2p(-2,1),stroke_width=1) line1 = Line(ax.c2p(6,2),ax.c2p(6,0),stroke_width=2) line1_txt = Tex('3',font_size=30,color=GREEN_A).move_to(ax.c2p(6,-0.4)) line2 = Line(ax.c2p(-2,2),ax.c2p(-2,1),stroke_width=2) line2_txt = Tex('2',font_size=30,color=RED_A).move_to(ax.c2p(-2.3,0.7)) # 底部區域 D = Polygon(ax.c2p(-2,1),ax.c2p(4,1),ax.c2p(6,0),ax.c2p(0,0),fill_color='#00FF00',fill_opacity=0.5,stroke_width=0) # 兩個小區域 r1 = Polygon(*points1,ax.c2p(6,2),ax.c2p(6,0),ax.c2p(0,0),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) r2 = Polygon(*points4,ax.c2p(0,0),ax.c2p(-2,1),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) self.play(ShowCreation(VGroup(C,dl1,dl2,dl3,line1,line2)),FadeIn(VGroup(z,y,x,z_label,y_label,x_label,line1_txt,line2_txt,D,r1,r2))) self.bring_to_back(D) self.wait(3) info = Tex(r'\text{沿著垂直于y軸的方式進行切片,立體區域就可以理解為一個個薄片的體積的疊加}',font='SimSun',font_size=25).to_edge(UP) self.play(Write(info)) self.wait(3) # 切片 cb1 = CubicBezier(ax.c2p(-1,0.7),ax.c2p(2,1),ax.c2p(4,2),ax.c2p(5,3.1),stroke_width=2) line1 = Line(ax.c2p(5,3.1),ax.c2p(5,0.5),stroke_width=2) line2 = Line(ax.c2p(5,0.5),ax.c2p(-1,0.5),stroke_width=2) line3 = Line(ax.c2p(-1,0.5),ax.c2p(-1,0.7),stroke_width=2) cb2 = CubicBezier(ax.c2p(-1.2,0.8),ax.c2p(2,1.3),ax.c2p(4,2.3),ax.c2p(4.8,3.3),stroke_width=2) line4 = Line(ax.c2p(4.8,3.3),ax.c2p(4.8,0.6),stroke_width=2) line5 = Line(ax.c2p(4.8,0.6),ax.c2p(-1.2,0.6),stroke_width=2) line6 = Line(ax.c2p(-1.2,0.6),ax.c2p(-1.2,0.8),stroke_width=2) line7 = Line(ax.c2p(-1.2,0.8),ax.c2p(-1,0.7),stroke_width=2) line8 = Line(ax.c2p(-1.2,0.6),ax.c2p(-1,0.5),stroke_width=2) line9 = Line(ax.c2p(4.8,0.6),ax.c2p(5,0.5),stroke_width=2) line10 = Line(ax.c2p(4.8,3.3),ax.c2p(5,3.1),stroke_width=2) VG = VGroup(cb1,line1,line2,line3,cb2,line4,line5,line6,line7,line8,line9,line10).set_color('#FF0000') self.play(ShowCreation(VG)) self.wait(1) t1 = Tex(r'\text{切成薄片}',font='SimSun',font_size=30).move_to(ax.c2p(6,4)) self.play(FadeIn(t1)) self.wait(3) VG1 = VG.copy() self.play(VG1.animate.shift(LEFT*5)) self.wait(1) dl_1 = DashedLine(ax.c2p(-7,1),ax.c2p(-7,5),stroke_width=1) dl_1_txt = Tex(r'\text{截面面積:}',r'\int_0^3 f(x,y)\textddthvnjxjdtx', font_size=20,font='SimSun',color=BLUE).move_to(ax.c2p(-7,5.6)) self.play(ShowCreation(dl_1),FadeIn(dl_1_txt)) self.wait(1) info1 = Tex(r'\int_0^3 \left(\frac{x^2}{2} + \frac{y^2}{3} + \frac{xy}{4}\right)\textddthvnjxjdtx = \left(\frac{1}{6}x^3 + \frac{y^2}{3}x + \frac{y}{8}x^2\right) \bigg|_0^3 = \frac{9}{2} + y^2 + \frac{9}{8}y', font_size=20,font='SimSun',color=BLUE).next_to(dl_1_txt,UP) self.play(FadeIn(info1)) self.wait(3) dl_2 = DashedLine(ax.c2p(-11.2,0.7),ax.c2p(-11.5,0.7),stroke_width=1) dl_3 = DashedLine(ax.c2p(-11.5,0.7),ax.c2p(-11.5,3),stroke_width=1) dl_2_txt = Tex(r'\text{厚度:}',r'\textddthvnjxjdty', font_size=20,font='SimSun').move_to(ax.c2p(-11.5,3.5)) self.play(ShowCreation(dl_2),ShowCreation(dl_3),FadeIn(dl_2_txt)) self.wait(3) info2 = Tex(r'V = \int_0^2 \left(',r'\frac{9}{2} + y^2 + \frac{9}{8}y',r'\right)\textddthvnjxjdty = \left(\frac{9}{2}y + \frac{1}{3}y^3 + \frac{9}{16}y^2\right)\bigg|_0^2',font='SimSun',font_size=20).move_to(ax.c2p(0,-1)) info2[1].set_color(BLUE) self.play(FadeIn(info2)) self.wait(3) info3 = Tex(r'V = \frac{167}{12}',font='SimSun',font_size=30,color='#00FF00').next_to(info2,DOWN*1.5) self.play(FadeIn(info3)) self.wait(1) sr = SurroundingRectangle(info3,buff=0.2,stroke_width=1,stroke_color='#00FF00') self.play(ShowCreation(sr)) self.wait(3) class A3(Scene): def construct(self): ax = Axes(x_range=[-10, 10], y_range=[-1, 9], axis_config={'stroke_color': GREY,'stroke_width':1,'include_tip': True,'tip_config': {'length': 0.1, 'width': 0.1}},width=10,height=5) #self.add(ax) z = Arrow(ax.c2p(0,0),ax.c2p(0,7),color=BLUE_B,buff=0) z_label = Tex('z',font_size=30,color=BLUE_B).move_to(ax.c2p(-0.3,7)) y = Arrow(ax.c2p(0,0),ax.c2p(-4,2),color=RED_A,buff=0) y_label = Tex('y',font_size=30,color=RED_A).move_to(ax.c2p(-4,2.3)) x = Arrow(ax.c2p(0,0),ax.c2p(8,0),color=GREEN_A,buff=0) x_label = Tex('x',font_size=30,color=GREEN_A).move_to(ax.c2p(8,-0.3)) cb1 = CubicBezier(ax.c2p(0,0),ax.c2p(2,0),ax.c2p(4,0),ax.c2p(6,2)) cb2 = CubicBezier(ax.c2p(6,2),ax.c2p(5,3),ax.c2p(4,4),ax.c2p(4,5)) cb3 = CubicBezier(ax.c2p(4,5),ax.c2p(3,4),ax.c2p(1,2),ax.c2p(-2,2)) cb4 = CubicBezier(ax.c2p(-2,2),ax.c2p(-2,1),ax.c2p(0,0),ax.c2p(0,0)) points1 = [cb1.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points2 = [cb2.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points3 = [cb3.point_from_proportion(t) for t in np.linspace(0, 1, 100)] points4 = [cb4.point_from_proportion(t) for t in np.linspace(0, 1, 100)] C = Polygon(*points1,*points2,*points3,*points4,fill_color=BLUE,fill_opacity=0.5,stroke_width=1) dl1 = DashedLine(ax.c2p(4,5),ax.c2p(4,1),stroke_width=1) dl2 = DashedLine(ax.c2p(4,1),ax.c2p(6,0),stroke_width=1) dl3 = DashedLine(ax.c2p(4,1),ax.c2p(-2,1),stroke_width=1) line1 = Line(ax.c2p(6,2),ax.c2p(6,0),stroke_width=2) line1_txt = Tex('3',font_size=30,color=GREEN_A).move_to(ax.c2p(6,-0.4)) line2 = Line(ax.c2p(-2,2),ax.c2p(-2,1),stroke_width=2) line2_txt = Tex('2',font_size=30,color=RED_A).move_to(ax.c2p(-2.3,0.7)) # 底部區域 D = Polygon(ax.c2p(-2,1),ax.c2p(4,1),ax.c2p(6,0),ax.c2p(0,0),fill_color='#00FF00',fill_opacity=0.5,stroke_width=0) # 兩個小區域 r1 = Polygon(*points1,ax.c2p(6,2),ax.c2p(6,0),ax.c2p(0,0),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) r2 = Polygon(*points4,ax.c2p(0,0),ax.c2p(-2,1),fill_color=YELLOW,fill_opacity=0.5,stroke_width=0) self.play(ShowCreation(VGroup(C,dl1,dl2,dl3,line1,line2)),FadeIn(VGroup(z,y,x,z_label,y_label,x_label,line1_txt,line2_txt,D,r1,r2))) self.bring_to_back(D) self.wait(3) info = Tex(r'\text{沿著垂直于x軸的方式進行切片,立體區域就可以理解為一個個薄片的體積的疊加}',font='SimSun',font_size=25).to_edge(UP) self.play(Write(info)) self.wait(3) # 切片 cb1 = CubicBezier(ax.c2p(3,4.1),ax.c2p(3.5,1),ax.c2p(3.5,1),ax.c2p(4,0.6),stroke_width=2) L1 = Line(ax.c2p(4,0.6),ax.c2p(4,0),stroke_width=2) L2 = Line(ax.c2p(4,0),ax.c2p(3,1),stroke_width=2) L3 = Line(ax.c2p(3,1),ax.c2p(3,4.1),stroke_width=2) cb2 = CubicBezier(ax.c2p(3.1,4.2),ax.c2p(3.5,2.5),ax.c2p(3.5,1),ax.c2p(4.2,0.7),stroke_width=2) L4 = Line(ax.c2p(4.2,0.7),ax.c2p(4.2,0),stroke_width=2) L5 = Line(ax.c2p(4.2,0),ax.c2p(4,0),stroke_width=2) L6 = Line(ax.c2p(3,4.1),ax.c2p(3.1,4.2),stroke_width=2) L7 = Line(ax.c2p(4,0.6),ax.c2p(4.2,0.7),stroke_width=2) VG = VGroup(cb1,L1,L2,L3,cb2,L4,L5,L6,L7).set_color('#ff0000') self.play(ShowCreation(VG)) self.wait(3) t1 = Tex(r'\text{切成薄片}',font='SimSun',font_size=30).move_to(ax.c2p(2,5)) self.play(FadeIn(t1)) self.wait(3) VG1 = VG.copy() self.play(VG1.animate.shift(LEFT*5)) self.wait(1) dl_1 = DashedLine(ax.c2p(-6.5,0.7),ax.c2p(-7.5,0.7),stroke_width=1) dl_2 = DashedLine(ax.c2p(-7.5,0.7),ax.c2p(-7.5,5),stroke_width=1) dl_1_txt = Tex(r'\text{截面面積:}',r'\int_0^2 f(x,y)\textddthvnjxjdty', font_size=20,font='SimSun',color=BLUE).move_to(ax.c2p(-7.5,5.6)) self.play(ShowCreation(dl_1),ShowCreation(dl_2),FadeIn(dl_1_txt)) self.wait(1) info1 = Tex(r'\left(\frac{x^2}{2}y + \frac{y^3}{9} + \frac{xy^2}{8}\right)\bigg|_0^2', font_size=20,font='SimSun',color=BLUE).next_to(dl_1_txt,UP) self.play(FadeIn(info1)) self.wait(3) dl_3 = DashedLine(ax.c2p(-5.9,0.3),ax.c2p(-5.5,0.3),stroke_width=1) dl_3_txt = Tex(r'\text{厚度:}',r'\textddthvnjxjdtx', font_size=20,font='SimSun').move_to(ax.c2p(-4.5,0.3)) self.play(ShowCreation(dl_3),FadeIn(dl_3_txt)) self.wait(3) info2 = Tex(r'V = \int_0^3 \left(x^2 + \frac{8}{9} + \frac{x}{2}\right)\textddthvnjxjdtx',font='SimSun',font_size=20).move_to(ax.c2p(0,-1)) self.play(FadeIn(info2)) self.wait(3) info3 = Tex(r'V = \frac{167}{12}',font='SimSun',font_size=30,color='#00FF00').next_to(info2,DOWN*1.5) self.play(FadeIn(info3)) self.wait(1) sr = SurroundingRectangle(info3,buff=0.2,stroke_width=1,stroke_color='#00FF00') self.play(ShowCreation(sr)) self.wait(3) 代碼比較適合已經能夠初步熟悉ManimGL動畫的朋友們用來進階,主要是貝塞爾曲線的用法,以及在曲線上取若干點,然后將這些點連接成一個幾何形狀,可以進行填充顏色之類,這樣方便畫很多不同的圖形或者動物,汽車之類等等。來自于《簡明實用高等數學》,主打一個干貨,沒有廢話,實用至上,都是經典例子,一分耕耘就有一分收獲!對于高中生想要提前了解大學的數學是什么內容的,或者是想掌握高數的大學生都很適合入手閱讀,干貨。
|