SAGE InterAct快速入门

Sage 快速入门教程是为MAA预备研讨会“SAGE:在本科生中使用开源数学软件”开发的(由美国国家科学基金会提供,截止日期0817071)。

无价的资源是Sage维基 http://wiki.sagemath.org/interact (在Google中输入“Sage InterAct”), UTMOST Sage Cell Repository (贡献的互动的集合)。

从一条命令开始

人们将如何创建交互单元?首先,让我们专注于一件新的事情去做!也许我们只需要一个有一些选项的绘图仪。

因此,让我们从获取您想要的输出的命令开始。这里我们只想要一个简单的情节。

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

然后抽象出你想要改变的部分。我们将允许用户更改函数,因此让我们将其设置为变量 f

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

这一点很重要,因为它让你可以退后一步,思考你真正要做的事情。

现在是技术部分。我们把这件事当做 def 功能-请参阅 programming tutorial

sage: def myplot(f=x^2):
....:     show(plot(f,(x,-3,3)))

让我们来测试一下 def 功能 myplot 只要叫它就行了。

sage: myplot()

如果我们用不同的值调用它 f ,我们应该得到一个不同的情节。

sage: myplot(x^3)

到目前为止,我们只定义了一个新函数,所以这是回顾。要创建一个允许用户交互地进入该函数的“控件”,我们只需在该函数前面加上 @interact

sage: @interact
sage: def myplot(f=x^2):
....:     show(plot(f,(x,-3,3)))

备注

从技术上讲 @interact 确实是对函数进行包装,因此上面的代码相当于::

def myplot(..): ...
myplot=interact(myplot)

注意,我们仍然可以调用我们的函数,即使我们使用 @interact 。这在调试它时通常很有用。

sage: myplot(x^4)

增加复杂性

我们可以继续,用变量替换表达式的其他部分。请注意 _ 是现在的函数名。这是丢弃我们不在乎的名字的一个公正的惯例。

sage: @interact
sage: def _(f=x^2, a=-3, b=3):
....:     show(plot(f,(x,a,b)))

如果我们通过了 ('label', default_value) 对于一个控件,则该控件在打印时获取标签。在这里,我们为这三个人都输入了一些文本。记住,文本必须用引号括起来!否则,Sage会认为您在引用(例如)某个名为“LOWER”的变量,它会认为您忘记了定义该变量。

sage: @interact
sage: def _(f=('$f$', x^2), a=('lower', -3), b=('upper', 3)):
....:     show(plot(f,(x,a,b)))

我们可以显式指定控件的类型以及选项。看见 below 以了解更多有关可能性的详细信息。

sage: @interact
sage: def _(f=input_box(x^2, width=20, label="$f$")):
....:     show(plot(f,(x,-3,3)))

在这里,我们演示了一系列选择。请注意新的控件:

  • range_slider, which passes in two values, zoom[0] and zoom[1]

  • True/False 转换为最终用户的复选框

sage: @interact
sage: def _(f=input_box(x^2,width=20),
....: color=color_selector(widget='colorpicker', label=""),
....: axes=True,
....: fill=True,
....: zoom=range_slider(-3,3,default=(-3,3))):
....:     show(plot(f,(x,zoom[0], zoom[1]), color=color, axes=axes,fill=fill))

还有一种按钮类型可用于 disable automatic updates

之前的交互有点难看,因为所有的控件都堆叠在一起。控件控制小部件控件在网格中的布局(在顶部、底部、左侧或右侧)。 layout 参数。

sage: @interact(layout=dict(top=[['f', 'color']],
....: left=[['axes'],['fill']],
....: bottom=[['zoom']]))
sage: def _(f=input_box(x^2,width=20),
....: color=color_selector(widget='colorpicker', label=""),
....: axes=True,
....: fill=True,
....: zoom=range_slider(-3,3, default=(-3,3))):
....:     show(plot(f,(x,zoom[0], zoom[1]), color=color, axes=axes,fill=fill))

控件类型

有许多潜在类型的小部件可能需要用于交互控制。Sage具备以下所有功能:

  • 方盒

  • 滑块

  • 范围滑块

  • 复选框

  • 选择器(下拉列表或按钮)

  • 方框网格

  • 颜色选择器

  • 纯文本

下面我们将说明其中的更多内容。

sage: @interact
sage: def _(frame=checkbox(True, label='Use frame')):
....:     show(plot(sin(x), (x,-5,5)), frame=frame)
sage: var('x,y')
sage: colormaps=sage.plot.colors.colormaps.keys()
sage: @interact
sage: def _(cmap=selector(colormaps)):
....:     contour_plot(x^2-y^2,(x,-2,2),(y,-2,2),cmap=cmap).show()
sage: var('x,y')
sage: colormaps=sage.plot.colors.colormaps.keys()
sage: @interact
sage: def _(cmap=selector(['RdBu', 'jet', 'gray','gray_r'],buttons=True),
sage: type=['density','contour']):
....:     if type=='contour':
....:         contour_plot(x^2-y^2,(x,-2,2),(y,-2,2),cmap=cmap, aspect_ratio=1).show()
....:     else:
....:         density_plot(x^2-y^2,(x,-2,2),(y,-2,2),cmap=cmap, frame=True,axes=False,aspect_ratio=1).show()

默认情况下,范围是将范围划分为50个步长的滑块。

sage: @interact
sage: def _(n=(1,20)):
....:     print(factorial(n))

例如,您可以将步长设置为仅获取整数值。

sage: @interact
sage: def _(n=slider(1,20, step_size=1)):
....:     print(factorial(n))

或者,您可以显式指定滑块值。

sage: @interact
sage: def _(n=slider([1..20])):
....:     print(factorial(n))

而且滑块值甚至不一定是数字!

sage: @interact
sage: def _(fun=('function', slider([sin,cos,tan,sec,csc,cot]))):
....:     print(fun(4.39293))

矩阵会自动转换为输入框的网格。

sage: @interact
sage: def _(m=('matrix', identity_matrix(2))):
....:     print(m.eigenvalues())

下面是如何从方框网格中获取矢量的方法。

sage: @interact
sage: def _(v=('vector', input_grid(1, 3, default=[[1,2,3]], to_value=lambda x: vector(flatten(x))))):
....:     print(v.norm())

不更新选项

作为最后一个问题,当控件变得如此复杂,以至于看到要进行的每个更改的交互更新将适得其反时,会发生什么?例如,考虑更改三重积分的端点和积分顺序,或者考虑下面的示例,其中可能会更改整个矩阵。

在这种情况下,在明确说明之前不需要任何更新,我们可以使用 auto_update=False 选择。这将创建一个按钮,使用户能够在他或她准备好后立即进行更新。

sage: @interact
sage: def _(m=('matrix', identity_matrix(2)), auto_update=False):
....:     print(m.eigenvalues())