符号和绘图教程¶
这个 Sage 该文件是为MAA预习班“Sage:在本科生中使用开源数学软件”开发的教程之一(NSF提供资金,到期日:0817071)。它是根据Creative Commons Attribution -ShareLiked 3.0许可证授权的 (CC BY-SA )
本教程包含以下部分:
它假设一个人熟悉Sage中函数和评估的绝对基础。我们提供(非常)简短的复习。
确保下面定义函数和获取值的语法是有意义的。
然后通过单击“评估”链接或按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())
另一个在这种情况下有用的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 你说什么?