微积分教程¶
这 Sage Document是为MAA预备研讨会“SAGE:在本科生中使用开源数学软件”开发的教程之一(由国家科学基金会提供,截止日期0817071)。它是在知识共享署名-Share Alike 3.0许可证下授权的 (CC BY-SA )。
本教程有以下几个部分。前三节基于美国典型的三学期微积分序列中遇到的主题;最后一节是某种形式的检查点。
本教程假定您熟悉Sage的基础知识,如前面的教程中概述的那样。
对于刷新程序,请确保下面用于定义函数和获取值的语法有意义;然后通过单击“Evaluate”链接或通过按 Shift + Enter (按住 Shift 同时按下 Enter 键)。
sage: f(x)=x^3+1
sage: f(2)
9
在本教程中,我们将多次使用该函数,因此对其求值非常重要!
微积分1¶
微积分是令人惊讶的,不是因为它解决了相切问题,或者是这些问题的个别解之前已经知道了。这是令人惊讶的,因为它提供了一套非常全面的符号处理规则,用于在极大的一般性上解决此类问题!
因此,在这种情况下,像Sage这样的计算机系统最典型的用途只是帮助检查(或减少繁琐的)对衍生品等东西的基本符号操作。让我们首先展示一下我们的功能是什么 \(f\) 就是再来一次,然后用它去做事情。
sage: show(f)
大多数(但不是所有)第一学期微积分课程都会花相当多的时间来限制学习。
这个函数的极限是多少 \(x\) 方法 \(1\) ?
sage: lim(f,x=1)
x |--> 2
Sage给出了我们期待的答案。限制的语法非常简单,尽管它可能与其他系统略有不同。
由于即使未定义函数也可能存在限制,因此Sage使用以下语法 x=1
以显示在所有情况下接近的输入值。
sage: lim((x^2-1)/(x-1),x=1)
2
接下来,我们将返回原始函数,并检查两个方向限制。
The syntax uses the extra keyword dir
.
请注意,我们使用
dir='right'
,不是dir=right
。也可以使用
dir='+'
,就像我们使用的dir='-'
下面。
这基本上是因为,如果不这样做,我们可能会做一些类似于
right=55
更早,所以Sage-和Python-要求我们将'right'
和'-'
用引号括起来,以表明它们不是变量。
sage: lim(f,x=1,dir='-'); lim(f,x=1,dir='right'); f(1)
x |--> 2
x |--> 2
2
通过与 \(f(1)\) ,我们看到了 \(f(x)\) 是连续的 \(x=1\) 。
这个单元格还提醒我们一些其他的事情:
通过用分号分隔几个命令,我们可以告诉Sage评估所有命令,同时仍然看到它们的所有输出。
我们在微积分1中花的时间最多的是衍生品,而Sage在这里是完全有特色的。
例如,下面有三种方法可以获得的基本单变量导数 \(f(x)=x^3+1\) 。
sage: diff(f,x); derivative(f,x); f.derivative(x)
x |--> 3*x^2
x |--> 3*x^2
x |--> 3*x^2
当然,Sage知道你想要的所有衍生品。
sage: derivative(sinh(x^2+sqrt(x-1)),x)
1/2*(4*x + 1/sqrt(x - 1))*cosh(x^2 + sqrt(x - 1))
甚至可能知道那些你不想要的人。在本例中,我们将计算放在 show()
因为产量是如此之长。
sage: show(derivative(sinh(x^2+sqrt(x-1)),x,3))
一个常见的问题是,为什么Sage不会自动检查是否有一些“更简单”的版本。但是,简化一个表达式,甚至定义什么是“简单”表达式,通常被证明是一个非常困难的技术和数学问题。计算机不能解决所有问题!
作为一个简短的插曲,让我们考虑一下我们做一些基本微积分的能力的应用。
首先,作为对上一教程中绘图的提醒,尝试绘制函数 \(f(x)\) 及其切线在 \(x=1\) ,在下面的空单元格中。(如果可以,请不要查看前面的教程以获得提醒。)
你拿到了吗?
当然,一般来说,我们可能希望看到许多不同点处的切线,例如,在课堂演示中。
因此,在以下单元格中,有几个辅助元素:
我们定义了剧情
P
原始函数的。有一个参数
c=1/3
,这是 \(x\) -我们想要切线的位置的值。我们让
fprime
简单地声明它等于导数,就是导数函数。我们让
L
是由点坡度公式定义的切线 \(x=c\) 。我们做了
Q
就是这条线的情节。
最后,我们在最后一行中将所有内容一起标绘,方法是添加 \(P+Q\) 。
sage: P=plot(f,(x,-1,1))
sage: c=1/3
sage: fprime=derivative(f,x)
sage: L(x)=fprime(c)*(x-c)+f(c)
sage: Q=plot(L,(x,-1,1), color="red", linestyle="--")
sage: P+Q
Graphics object consisting of 2 graphics primitives
您可能希望通过以下方式进行试验
正在改变
c
设置为其他值,或更改功能
f
,或更改颜色,或
更改其他内容(如
linestyle
用于切线)。
理想情况下,它应该是 extremely 更改该参数很容易 \(c\) 。在下面的单元格中,我们展示了Sage“InterAct”(或“Saglet”)的第二个示例。
在本例中,拖动滑块将显示切线移动。
未来的教程将更详细地解释此过程;这里只是作为一个示例。
但是,读者会注意到这两个单元格的代码是多么相似。
sage: %auto
sage: f(x)=x^3+1
sage: @interact
sage: def _(c=(1/3,(-1,1))):
....: P=plot(f,(x,-1,1))
....: fprime=derivative(f,x)
....: L(x)=fprime(c)*(x-c)+f(c)
....: Q=plot(L,(x,-1,1),color="red", linestyle="--")
....: show(P+Q+point((c,f(c)), pointsize=40, color='red'),ymin=0,ymax=2)
一个非常敏锐的读者也会注意到前一个单元格 %auto
在最顶端,不需要评估细胞就可以使用它。
该命令
%auto
允许我们有一个细胞,特别是一个互动的细胞,我们一开始就装满了--特别适合教室的情况。这样的指令称为 percent directives 。大多数都记录在任何工作表顶部的笔记本帮助中。
微积分1的最后一个主题通常是基本积分。不定积分的语法类似于微分的语法。
sage: integral(cos(x),x)
sin(x)
我们没有得到整个不定积分,只得到了一个方便的逆导数。
(如果你想‘手工’得到不同的答案,请记住,作为一个反导数意味着答案是正确的 up to a constant 而判断两个表达式是否属于这种情况的问题与上面的“简化”问题相同。)
定积分的语法与标绘相似。
sage: integral(cos(x),(x,0,pi/2))
1
微积分2¶
第二学期的微积分通常更具挑战性。
其中一个原因是,计算问题不像计算导数和基本积分那样简单。
另一个原因是,第二学期通常是第一学期更难的问题出现的时候。
尽管如此,Sage也可以处理这一点。
SAGE包含大量的不定积分(通过最大值),尽管您不会在综合表中找到所有的不定积分。
sage: h(x)=sec(x)
sage: h.integrate(x)
x |--> log(sec(x) + tan(x))
因为我定义了 h
作为一个函数,我得到的答案也是一个函数。如果我只想要一个表达式作为答案,我可以执行以下操作。
sage: integrate(sec(x),x)
log(sec(x) + tan(x))
下面是另一个(更长的)例子。你还记得什么命令会让它在浏览器中看起来更漂亮吗?
sage: integrate(1/(1+x^5),x)
1/5*sqrt(5)*(sqrt(5) + 1)*arctan((4*x + sqrt(5) - 1)/sqrt(2*sqrt(5) + 10))/sqrt(2*sqrt(5) + 10)
+ 1/5*sqrt(5)*(sqrt(5) - 1)*arctan((4*x - sqrt(5) - 1)/sqrt(-2*sqrt(5) + 10))/sqrt(-2*sqrt(5) + 10)
- 1/10*(sqrt(5) + 3)*log(2*x^2 - x*(sqrt(5) + 1) + 2)/(sqrt(5) + 1)
- 1/10*(sqrt(5) - 3)*log(2*x^2 + x*(sqrt(5) - 1) + 2)/(sqrt(5) - 1)
+ 1/5*log(x + 1)
当然,有些积分有点棘手。Sage努力尝试使用Maxima、Giac和Sympy::
sage: integral(1/(1+x^10),x)
...1/20*(sqrt(5) + 1)*arctan((4*x + sqrt(-2*sqrt(5) + 10))/(sqrt(5) + 1))
+ 1/20*(sqrt(5) + 1)*arctan((4*x - sqrt(-2*sqrt(5) + 10))/(sqrt(5) + 1))
+ 1/20*(sqrt(5) - 1)*arctan((4*x + sqrt(2*sqrt(5) + 10))/(sqrt(5) - 1))
+ 1/20*(sqrt(5) - 1)*arctan((4*x - sqrt(2*sqrt(5) + 10))/(sqrt(5) - 1))
+ 1/40*sqrt(2*sqrt(5) + 10)*log(x^2 + 1/2*x*sqrt(2*sqrt(5) + 10) + 1)
- 1/40*sqrt(2*sqrt(5) + 10)*log(x^2 - 1/2*x*sqrt(2*sqrt(5) + 10) + 1)
+ 1/40*sqrt(-2*sqrt(5) + 10)*log(x^2 + 1/2*x*sqrt(-2*sqrt(5) + 10) + 1)
- 1/40*sqrt(-2*sqrt(5) + 10)*log(x^2 - 1/2*x*sqrt(-2*sqrt(5) + 10) + 1)
+ 1/5*arctan(x)
如果您特别要求最大值,结果可能是部分的::
sage: integral(1/(1+x^10),x, algorithm='maxima')
1/5*arctan(x)
- 1/5*integrate((x^6 - 2*x^4 + 3*x^2 - 4)/(x^8 - x^6 + x^4 - x^2 + 1), x)
如果未找到任何反导数,则结果仅为输入::
sage: result = integral(sinh(x^2+sqrt(x-1)),x) # long time (15s on sage.math, 2012)
...
sage: result # long time
integrate(sinh(x^2 + sqrt(x - 1)), x)
这最后一个也难倒了其他系统。
然而,如果有一个特殊的函数来帮助计算积分,Sage会寻找它。在下面的情况下,没有初等的反导数,但 erf
函数可以帮助我们解决问题。
sage: integral(e^(-x^2),x)
1/2*sqrt(pi)*erf(x)
不要忘记,如果您对此函数不熟悉(对于尝试此积分的学生来说可能是这样),Sage的上下文帮助系统会提供帮助。
sage: erf?
在Sage中有几种求定积分的方法。
最明显的一个就是简单地把
vt.进入,进入
正如微积分I部分所示。
sage: integral(cos(x),(x,0,pi/2))
1
首选语法将变量和端点放在括号中。
就像使用导数一样,我们可以使用绘图教程中的一些绘图选项来可视化这个积分。
sage: plot(cos(x),(x,0,pi/2),fill=True,ticks=[[0,pi/4,pi/2],None],tick_formatter=pi)
Graphics object consisting of 2 graphics primitives
在进行整合时,完全有可能是象征性的。如果你这样做,你必须确保你定义的是一个符号变量,当然包括常量。
sage: var('a,b')
(a, b)
sage: integral(cos(x),(x,a,b))
-sin(a) + sin(b)
在数值方面,有时从微积分基本定理得到的答案并不完全有帮助。回想一下 \(h\) 是正割函数。
sage: integral(h,(x,0,pi/7))
1/2*log(sin(1/7*pi) + 1) - 1/2*log(-sin(1/7*pi) + 1)
在这里,仅仅是一个数字可能会更有帮助。SAGE有几种数值计算积分的方法。
用符号表示定积分,然后用数值逼近它
这个
numerical_integral
功能那就是。
nintegrate
方法
第一种方法是使用n或N函数进行数值逼近,在入门教程中也有提到。
sage: N(integral(h,(x,0,pi/8)))
0.403199719161511
第二个功能, numerical_integral
,使用一个强大的数值程序(GNU科学类库)。
遗憾的是,该函数的语法与Sage的其余部分并不一致。
幸运的是,输出有两个元素--您想要的答案和它的容错性。
sage: numerical_integral(h,0,pi/8)
(0.4031997191615114, 4.476416117355069e-15)
要只访问数字,需要提供该项目序列的第零个元素。这是用下面的括号表示法完成的。
sage: numerical_integral(h,0,pi/8)[0]
0.4031997191615114
请注意,我们从零开始计数。这在计算机程序中相当典型(尽管肯定不是通用的)。
为了提高可读性(比人们想象的更重要),我们通常将数值积分赋给一个变量,然后取该变量的第0个元素。
sage: ni = numerical_integral(h,0,pi/8)
sage: ni[0]
0.4031997191615114
最后, .nintegrate()
Maxima的方法提供了更多的额外信息。
再次注意使用它所需的句点/点。
只有可能使用
h(x)
;正在做h.nintegrate()
引发错误。
sage: h(x).nintegrate(x,0,pi/8)
(0.4031997191615114, 4.47641611735507e-15, 21, 0)
第二学期的微积分通常也包括各种主题的总和。圣人可以将许多抽象的数列相加,记法类似于标绘和积分。
sage: var('n') # Do not forget to declare your variables
n
sage: sum((1/3)^n,n,0,oo)
3/2
当然,这是几何级数。
第二个是著名的结果,即一排帕斯卡三角形是2的幂
它有许多令人愉快的组合解释。
sage: k = var('k') # We already declared n, so now we just need k
sage: sum(binomial(n,k), k, 0, n)
2^n
你还记得要怎么做才能看到我们是如何在上面的文本中打出漂亮的金额的吗?没错,我们可以双击文本区/单元格来查看。
SAGE还可以计算泰勒多项式。
泰勒展开式依赖于很多东西。只要有几个输入,保持语法简洁就很重要。以下是我们的输入:
该函数,
变量,
我们围绕其扩展函数的点,以及
学位。
在下一个单元格中,我们调用 \(g(x)\) 所讨论的泰勒多项式。
sage: g(x)=taylor(log(x),x,1,6); g(x)
-1/6*(x - 1)^6 + 1/5*(x - 1)^5 - 1/4*(x - 1)^4 + 1/3*(x - 1)^3 - 1/2*(x - 1)^2 + x - 1
请注意,在此间隔内,近似值与函数是多么接近!
sage: plot(g,(x,0,2))+plot(log(x),(x,0,2),color='red')
Graphics object consisting of 2 graphics primitives
微积分3¶
我们已经看到了三维绘图,所以Sage支持各种多变量微积分问题也就不足为奇了。
警告
我们通常需要定义所有变量,而不是 \(x\) 。
sage: var('y')
y
sage: f(x,y)=3*sin(x)-2*cos(y)-x*y
在上面,我们定义了一个典型的两个变量的函数。
下面,我们使用分号来演示使用这样的函数可以做的几件事,包括:
所有对象的梯度向量 \(\frac{\partial f}{\partial x_i}\)
所有可能的二阶导数的黑森
A double partial derivative of \(f\) with respect to \(x\), then \(y\) (that is, \(\frac{\partial f}{\partial y\partial x}\))
sage: f.gradient(); f.hessian(); f.diff(x,y)
(x, y) |--> (-y + 3*cos(x), -x + 2*sin(y))
[(x, y) |--> -3*sin(x) (x, y) |--> -1]
[ (x, y) |--> -1 (x, y) |--> 2*cos(y)]
(x, y) |--> -1
为了使语法更简单,还可以通过请求全导数来获得梯度和黑森。我们还要求再次提高产量。
sage: show(f.diff()); show(f.diff(2))
如果我们取黑森的行列式,我们就可以得到一些有用的东西来计算(二维)临界点 \(f\) 。
sage: show(f.diff(2).det())
如果要绘制向量场,这些想法特别有用。
以下是渐变的示例。下面单元格中绘制的矢量是方向上的单位矢量 \((1,2)\) 。
sage: P=plot_vector_field(f.diff(), (x,-3,3), (y,-3,3))
sage: u=vector([1,2])
sage: Q=plot(u/u.norm())
sage: P+Q
Graphics object consisting of 2 graphics primitives
与实际计算该方向上的单位向量相比,让Sage通过将向量除以其范数来计算它更容易。
方向导数本身(在该方向上,在原点处)也可以用这种方式计算。
sage: (f.diff()*u/u.norm())(0,0)
3/5*sqrt(5)
在这些情况下,另一种有用的绘图类型是等高线绘图。
请注意,下面的选项使用了几个选项。尝试将选项与图形的特征相关联。
sage: y = var('y')
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi),\
....: contours=[-8,-4,0,4,8], colorbar=True, labels=True, label_colors='red')
Graphics object consisting of 1 graphics primitive
在本示例中,我们使用了以下选项:
明确列出我们想要显示的轮廓,
标记这些等高线,
在边上放置一个颜色条以显示不同的级别。
(顺便说一句, True
和 False
有价值的期权是为数不多的几种非数值期权 not 需要引用。)
这是另一个提醒我们必须明确要求的好时机 \(y\) 在这里成为一个变量,再过几次也是这样。
随着您获得Sage的经验,我们将在这些教程中慢慢地越来越少地解释命令的语法。你可以把不是所有事情都解释为迷你小测验的地方想一想。
例如,下一个示例显示了当前如何进行多重积分。我们在这里做了什么?
sage: integrate(integrate(f,(x,0,pi)),(y,0,pi))
6*pi - 1/4*pi^4
回答:请注意 integrate(f,(x,0,pi))
已将其本身作为函数放置在 integrate(...,(y,0,pi))
。
我们可以使用3D绘图来帮助将其可视化;这些已经在符号和绘图教程中提到过。
sage: plot3d(f,(x,0,pi),(y,0,pi),color='red')+plot3d(0,(x,0,pi),(y,0,pi))
Graphics3d Object
除多元微积分外,微积分3通常还包括单变量的参数微积分。SAGE可以用相当自然的语法绘制任意的参数图。
此图显示了与最基本的李萨如曲线的切线在 \(t=1\) 。这些命令应该与本教程开头的命令非常相似。
sage: t = var('t')
sage: my_curve(t)=(sin(t), sin(2*t))
sage: PP=parametric_plot( my_curve, (t, 0, 2*pi), color="purple" )
sage: my_prime=my_curve.diff(t)
sage: L=my_prime(1)*t+my_curve(1) # tangent line at t=1
sage: parametric_plot(L, (t,-2,2))+PP
Graphics object consisting of 2 graphics primitives
小技巧
过了一段时间,你会发现,给事物起其他的名字
f
和g
在区分事物方面变得很有帮助。使用描述性名称!我们在这里已经尝试过这样做。如果您喜欢冒险,可以尝试按照前面的单变量示例将其转换为交互式单元格!
“Exam”¶
在走出微积分世界之前,最好进行一次小型考试。
在下面的单元格中,我们绘制并给出了:
微分方程式的斜率场,
一个初值问题的解,
以及这个解决方案的象征性公式。
我们假设您以前从未见过其中的几个命令。尽管如此,您能找出哪些命令在执行每个部分,以及它们的语法是什么吗?你会如何寻求帮助以了解更多信息?
sage: y = var('y')
sage: Plot1=plot_slope_field(2-y,(x,0,3),(y,0,20))
sage: y = function('y',x) # declare y to be a function of x
sage: h = desolve(diff(y,x) + y - 2, y, ics=[0,7])
sage: Plot2=plot(h,0,3)
sage: show(expand(h)); show(Plot1+Plot2)
准备好看答案了吗?在你真正试过之前,不要偷看。
在此单元格中,我们执行以下操作:
确保
y
确实是第一个情节的一个变量。为DE创建坡度字段,以输入适当的 \(x\) 和 \(y\) ,并将该地块命名为
Plot1
。使用Function命令的形式为DE做好准备。
请注意,我们在这里再次使用
#
表示评论。在这种情况下,为了使用通用术语,我们现在告诉Sage
y
不再是变量,而是变量的函数(抽象x
。
使用微分方程解命令, I 初始 C 条件 S 两个和两个。
绘制解决方案并为其命名
Plot2
。显示解决方案的符号版本的简化(这是我们事先不知道的!)以及两个图的和--相对于斜率场的解。
随着经验的积累,你会知道如何收集 you 是从文档中的示例中寻找的,这是这些教程的真正目标之一。
祝贺你!现在,您已经掌握了在微积分序列中部署Sage的基础知识。