符号学和绘图教程

Sage Document是为MAA预备研讨会“SAGE:在本科生中使用开源数学软件”开发的教程之一(由国家科学基金会提供,截止日期0817071)。它是在知识共享署名-Share Alike 3.0许可证下授权的 (CC BY-SA )。

本教程包含以下各节:

它假设一个人熟悉Sage中的函数和求值的绝对基础。我们提供(非常)简短的复习课程。

  1. 确保下面定义函数和获取值的语法有意义。

  2. 然后,通过单击“评估”链接或通过按 Shift + Enter (按住 Shift 同时按下 Enter 键)。

sage: f(x)=x^3+1
sage: f(2)
9

符号表达式

在第一个教程中,我们定义了 functions 使用类似于微积分课程中使用的符号。

在这个定义上有一个有用的变种 expressions 涉及到变数。这将使我们有机会指出几个重要的、有时是微妙的事情。

在下面的单元格中,我们定义了一个表达式 \(FV\) 这是一项100美元的投资的未来价值,持续复合。然后我们将值替换为 \(r\)\(t\) 来计算未来的值 \(t=5\) 年和 \(r=5\%\) 名义利息。

sage: var('r,t')
(r, t)
sage: FV=100*e^(r*t)
sage: FV(r=.05,t=5)
128.402541668774

前面的单元格指出了在使用符号表达式时需要记住的几点。有些是相当标准的。

  • 一个星号 (* )表示乘法。这应该是你总是做乘法的方法。

  • 虽然允许隐式乘法是可能的,但这很容易导致歧义。

  • 我们可以访问最重要的常量;例如, \(e\) 代表着恒定 \(2.71828...\) 。同样, pi (或 \(\pi\) )和 \(I\) (考虑复数)也被定义。

  • 当然,如果你重新定义 \(e\) 要想成为另一种人,所有的赌注都取消了!

然而,另外两个可能不熟悉,特别是如果你以前不太使用数学软件的话。

  • 在符号表达式中使用变量之前,您必须告诉Sage变量是什么。

  • 我们在上面通过输入以下命令完成了该操作 var('r,t')

  • 这是通过使用 \(f(x)\) 记号,但如果没有记号,它是必要的,这样Sage就知道自己的意图 t (例如)是一个符号变量,而不是一个数字或其他东西。

  • 如果您随后希望将一些值替换到表达式中,则必须显式地告诉Sage哪些变量被赋予了哪些值。

  • 例如,上面我们使用了 FV(r=.05,t=5) 表示的精确值 \(r\)\(t\)

请注意,当我们定义函数时,我们不需要指定哪个变量具有哪个值。在下面定义的函数中,我们已经指定了顺序。

sage: FV2(r,t)=100*e^(r*t)
sage: FV2(.05,5)
128.402541668774

在这种情况下,很明显 \(r\) 是第一个并且 \(t\) 是第二名。

但有了 FV=100*e^(r*t) ,没有特别的原因 \(r\)\(t\) 应该是第一个。

sage: FV(r=.05,t=5); FV(t=5,r=.05)
128.402541668774
128.402541668774

还要记住,当我们不使用函数表示法时,我们将需要定义变量。

我们可以对表情做的一件伟大的事情就是操纵它们。让我们来做一个典型的表达。

sage: z = (x+1)^3

在下面的单元格中,您会注意到一些新的东西:字符 # 。在Sage(和在 Python ),单行上数字/磅符号( octothorp )被忽略。我们这么说 # 是一个注释字符。我们在下面用它来提到做同样事情的其他方法。

sage: expand(z) # or z.expand()
x^3 + 3*x^2 + 3*x + 1
sage: y = expand(z)
sage: y.factor() # or factor(y)
(x + 1)^3

在前一个单元格中,我们 assigned 是的扩展的表达式 \(z\) 添加到变量 \(y\) 第一行。在那之后,我们想要做的任何事情都是为了 \(z\) 可以通过这样做来完成 \(y\)

还有更多这样的命令。请注意, \(z\) 将不再是 \((x+1)^3\) 在计算完该单元格之后,因为我们已经分配了 \(z\) 转换成一个(复杂得多的)表达式。

sage: z = ((x - 1)^(3/2) - (x + 1)*sqrt(x - 1))/sqrt((x - 1)*(x + 1))
sage: z.simplify_full()
-2*sqrt(x - 1)/sqrt(x^2 - 1)

这是一个很好的地方,可以提醒你一些基本的帮助。

  • 您可以看到通过使用制表符完成来简化表达式的各种方法。将光标放在下一个单元格的末尾(在 simplify )并按Tab键以查看许多不同的方法。

  • 还请记住,您可以使用问号(例如, z.simplify_rational? )以获得有关特定方法的帮助。

sage: z.simplify
<built-in method simplify of sage.symbolic.expression.Expression object at ...>

最后,回想一下,您可以通过几种方式获得排版精美的输出。

  • 一种选择是点击顶部的“排版”按钮。

  • 另一个不需要滚动的-是使用 show 指挥部。

sage: show(z.simplify_rational())
\[-\frac{2 \, \sqrt{x - 1}}{\sqrt{x^{2} - 1}}\]

在此上下文中另一个有用的Sage命令是 solve

在这里,我们解一个简单的方程 \(x^2=-1\)

sage: solve(x^2==-1,x) # solve x^2==-1 for x
[x == -I, x == I]
  • solve 命令,则在公式中键入等号,如下所示 two 等号。

  • 这是因为单等号表示赋值给变量,正如我们在上面所做的那样,因此Sage(与Python一起)使用双等号来表示符号相等。

  • 我们还在逗号后面包含了要求解的变量。

也可以同时求解多个表达式。

sage: solve([x^2==1,x^3==1],x)
[[x == 1]]

基本二维绘图

数学软件的另一个基本用途是易于绘图。在这里,我们将简要介绍几种作图方法,为我们在微积分中使用Sage做好准备。(将有一个单独的教程介绍更高级的绘图技术。)

回想一下,我们可以使用相当简单的语法生成一个图。在这里,我们定义一个函数 \(x\) 并将其绘制在 \(-1\)\(1\)

sage: f(x)=x^3+1
sage: plot(f,(x,-1,1))
Graphics object consisting of 1 graphics primitive

我们可以给绘图命名,这样以后如果我们想要对绘图做些什么,我们就不需要输入整个绘图命令了。记住,这叫做 assigning 名称/变量的绘图。

在下一个单元格中,我们将地块命名为 \(P\)

sage: P=plot(f,(x,-1,1))

一个情节很好,但也可能想要叠加情节。例如,切线到 \(f\) 在… \(x=0\) 就是这条线 \(y=1\) ,我们可能想要将这一点与情节一起展示。

让我们用不同的颜色绘制这条线,用不同的线条样式,但在相同的间隔上。

sage: Q=plot(1,(x,-1,1),color="red", linestyle="--")
sage: Q
Graphics object consisting of 1 graphics primitive

因为我们把 \(Q\) 在最后的一行中,它显示出。我们只能用一个细胞来定义 \(Q\) 并通过将每个命令放在同一输入单元格的单独行中来显示它。

现在,为了显示相互叠加的情节,我们只需将它们相加。

sage: P+Q
Graphics object consisting of 2 graphics primitives

假设我们想要查看这方面的详细信息。

  • 我们可以创建另一个具有不同端点的情节。

  • 另一种方法是保留当前创建的绘图,但使用 show 命令,如下所示。

sage: (P+Q).show(xmin=-.1,xmax=.1,ymin=.99,ymax=1.01)

由于轴在参照系中不再相交,Sage在水平轴和垂直轴之间显示了一个很短的间隙。

有许多选项可以传递给不同的目的。

  • 有些要求用引号将值引起来。

  • 例如 color 选项时,我们做了一个 "red" 排队。

  • 有些人则不这么认为。

  • 例如 xmin 在前面的曲线图中,最小x值仅为 \(-.1\)

通常(尽管并不总是),作为单词或字符串的选项值需要引号,而对于数值则不是必需的。

这些选项中最有用的两个选项有助于标记图表。

  • 这个 axes_labels 选项为轴添加标签。

  • 就像文字处理器一样,我们可以使用美元符号(就像LaTeX中的符号)来使标签排版得很好。

  • 在这里,我们需要引号和方括号才能获得正确的语法,因为有两个轴要标记,而标签实际上不是数字。

sage: plot(f,(x,-1,1),axes_labels=['$x$','$y$'],legend_label='$f(x)$',show_legend=True)
Graphics object consisting of 1 graphics primitive
  • 这个 legend_label 选项对于多个打印特别有用。

  • Latex 符号在这里也适用。

  • 在上图中,我们需要明确要求显示标签。对于多个图表,这应该不是必需的。

sage: P1 = plot(f,(x,-1,1),axes_labels=['$x$','$y$'],legend_label='$f(x)$')
sage: P2 = plot(sin,(x,-1,1),axes_labels=['$x$','$y$'],legend_label=r'$\sin(x)$',color='red')
sage: P1+P2
Graphics object consisting of 2 graphics primitives

另一个有用的注意是,具有垂直渐近线的函数的曲线图可能需要手动设置其垂直查看范围;否则,渐近线可能真的会变得无限大!

sage: plot(1/x^2,(x,-10,10),ymax=10)
Graphics object consisting of 1 graphics primitive

请记住,您可以使用命令 plot? 以了解上面演示的大多数选项。

在下面,您可以尝试几个打印选项。

  • 只需评估单元格并使用滑块、按钮、颜色选择器等,即可更改绘图选项。

  • 用户可以访问低级别选项,如绘图点的初始数量,或访问高级选项,如是否显示轴。

  • 这使用了Sage的一项名为“互动”的功能,这是一种非常强大的让学生参与探索问题的方式。

sage: x = var('x')
sage: @interact
sage: def plot_example(f=sin(x^2),r=range_slider(-5,5,step_size=1/4,default=(-3,3)),
....:                  color=color_selector(widget='colorpicker'),
....:                  thickness=(3,(1..10)),
....:                  adaptive_recursion=(5,(0..10)), adaptive_tolerance=(0.01,(0.001,1)),
....:                  plot_points=(20,(1..100)),
....:                  linestyle=['-','--','-.',':'],
....:                  gridlines=False, fill=False,
....:                  frame=False, axes=True
....:                  ):
....:     show(plot(f, (x,r[0],r[1]), color=color, thickness=thickness,
....:                  adaptive_recursion=adaptive_recursion,
....:                  adaptive_tolerance=adaptive_tolerance, plot_points=plot_points,
....:                  linestyle=linestyle, fill=fill if fill else None),
....:                  gridlines=gridlines, frame=frame, axes=axes)

基本3D打印

在Sage中有几种查看三维曲线图的机制,但我们将坚持笔记本界面中的默认选项,即通过程序中的Java脚本小程序 Jmol/JSmol

绘制3D绘图类似于绘制2D绘图,但我们需要为两个变量而不是一个变量指定范围。

sage: g(x,y)=sin(x^2+y^2)
sage: plot3d(g,(x,-5,5),(y,-5,5))
Graphics3d Object

使用3D绘图可以做很多事情。

  • 尝试通过在绘图内部单击并拖动鼠标来旋转上面的绘图。

  • 此外,在绘图右侧右击(如果只有一个鼠标按键,则按Control键)可查看菜单中的其他选项。

  • 如果您的鼠标或多点触摸触控板上有滚轮,则可以滚动以进行缩放。

  • 您也可以右击查看其他选项,例如

  • 把情节编织起来,

  • 改变各种颜色,

  • 甚至使情节适合通过3D眼镜观看(在“风格”下,然后是“立体”子菜单下),

在使用 plot3d 命令时,指定的第一个变量范围将沿着通常的“x”轴绘制,而指定的第二个变量范围将沿着通常的“y”轴绘制。

上面的曲线图有点粗糙,因为函数的采样次数不够多。毕竟,这是一个变化很快的函数。我们可以通过告诉Sage使用300 x 300点的网格来采样函数,从而使绘图更流畅。然后,Sage以90,000点对该函数进行采样!

sage: plot3d(g,(x,-5,5),(y,-5,5),plot_points=300)
Graphics3d Object

与2D打印一样,我们可以通过将3D打印添加到一起来叠加3D打印。

请注意,在本教程中,我们不定义函数,而是只使用表达式(请参阅本教程中的第一组主题),因此最明智的做法是提前定义变量。

sage: var('x,y')
(x, y)
sage: b = 2.2
sage: P=plot3d(sin(x^2-y^2),(x,-b,b),(y,-b,b), opacity=.7)
sage: Q=plot3d(0, (x,-b,b), (y,-b,b), color='red')
sage: P+Q
Graphics3d Object

像往常一样,笔记本中只显示最后一条命令,尽管显然所有命令都经过了评估。这也说明了许多相同的选项适用于3D打印和2D打印。

我们用我们定义的一个很酷的情节来结束本教程 implicitly 作为3D等高线绘制。

sage: var('x,y,z')
(x, y, z)
sage: T = golden_ratio
sage: p = 2 - (cos(x + T*y) + cos(x - T*y) + cos(y + T*z) + cos(y - T*z) + cos(z - T*x) + cos(z + T*x))
sage: r = 4.78
sage: implicit_plot3d(p, (x, -r, r), (y, -r, r), (z, -r, r), plot_points=50, color='yellow')
Graphics3d Object

下一教程将使用您所学到的有关Sage基础知识、符号知识以及在特定数学场所进行绘图的所有知识 calculus sequence 好了!