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]
andzoom[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())