符号和绘图教程

这个 Sage 该文件是为MAA预习班“Sage:在本科生中使用开源数学软件”开发的教程之一(NSF提供资金,到期日:0817071)。它是根据Creative Commons Attribution -ShareLiked 3.0许可证授权的 (CC BY-SA

本教程包含以下部分:

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

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

  2. 然后通过单击“评估”链接或按Shift -Enter(按住Shift同时按Enter键)来计算单元格。

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

符号表达式

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

有一个有用的变体来定义 表达 涉及变量。这将使我们有机会指出一些重要的,有时是微妙的事情。

在下面的单元格中,我们定义了一个表达式 \(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

这就是为什么我们在尝试执行此操作时会收到一条弃用错误消息 \(FV\) 没有明确提到变量。

sage: FV(5,.05)
doctest:...: DeprecationWarning: Substitution using function-call syntax and unnamed arguments is deprecated and will be removed from a future release of Sage; you can use named arguments instead, like EXPR(x=..., y=...)
See http://trac.sagemath.org/5930 for details.
128.402541668774

在这种情况下,结果是一样的,因为 \(rt=tr\) ! 当然,在大多数表达式中,一个人不会那么幸运,正如下面的例子所示。

sage: y = var('y')
sage: G = x*y^2
sage: G(1,2); G(2,1)
4
2

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

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

sage: z = (x+1)^3

在下面的单元格中,你会注意到一些新的东西:字符 # . 在Sage(和 Python ),任何在数字/磅符号(the 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

在上一个牢房里,我们 分配 这个表达式是 \(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())
\[-分形{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

我们可以给plot一个名字,这样以后如果我们想对plot做些什么,就不必输入整个plot命令。记住,这叫做 分配 名称/变量的绘图。

在下一个单元格中,我们给绘图命名 \(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 notation works here too.

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

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)

基本三维绘图

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

绘制三维打印与绘制二维打印类似,但我们需要指定两个变量的范围,而不是一个变量。

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

有很多你可以做的三维绘图。

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

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

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

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

  • 旋转情节,

  • 变换各种颜色,

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

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

上面的曲线图有些粗糙,因为函数没有足够的采样次数,毕竟这是一个快速变化的函数。我们可以让Sage用300×300点的网格对函数进行采样,从而使绘图更加平滑。然后Sage在90000点对函数进行采样!

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

与二维图一样,我们可以通过将三维图叠加在一起。

注意,在这篇文章中,我们不定义函数,只使用表达式(请参阅本教程的第一组主题),因此最好提前定义变量。

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

像往常一样,只有最后一个命令会出现在笔记本中,尽管很明显所有命令都是经过计算的。这也说明了许多相同的选项适用于三维打印和二维打印。

我们用我们定义的一个很酷的图来结束本教程 隐含地 作为三维等高线图。

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 你说什么?