在Manipulate中设置控制变量是否可以使用Dynamic的第二个参数?

时间:2011-09-07 04:15:39

标签: wolfram-mathematica

我无法使用我想要的语法,现在我不确定它是否可能。

小评论: 人们可以这样做:

{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}

现在每次滑块移动时,'b'改变,其Sin []自动打印

enter image description here

但是假设我想直接在滑块所在的位置进行计算(Sin [])并且只显示Sin []的最终结果,那么我可以像这样使用Dynamic的第二个参数:

{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}], 
 Dynamic[a]}

enter image description here

现在我想使用Manipulate,并做同样的事情。我可以像上面第一个例子那样做:

Manipulate[
 Sin[b],
 Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}]
 ]

enter image description here

在上面,Manipulate负责处理'动态'的东西,并在'b'改变时更新Sin [b]。

现在,我想知道我是否可以使用Manipulate进行第二种情况,所以我可以写一下:

Manipulate[
 a,
 Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*)
 ]

('a'必须初始化为初始显示的某个值)。

但我无法弄清楚如何在上面使用'b'的第二个参数。无法弄清楚语法,现在确定是否可能?

当然,不能只写

Manipulate[
 a,
 {Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}]}
 ]

这甚至不是Manipulate控件的有效语法。

问题是:在设置Manipulate控件时是否可以使用Dynamic的第二个参数?

我之所以要问的原因是它可以让控制变量更改的位置更容易“本地化”计算,并且只能在其他位置显示最终结果。就像某种方式的本地回调函数一样,与每个控件的更改相关的计算位于控件所在的位置旁边。

感谢

更新9/16/11

好吧,经过一个月的奋斗,我终于开始运行Mathematica CDF了。

感谢Simon和其他在我做CDF(Leonid,Heike,WReach,Belisarius等人)时回答我问题的人的帮助。

我在这里学到的一些技巧帮助完成了这个演示,如果有人想尝试的话,这里是link

enter image description here

这张CDF的设计与我之前所做的一切不同。它基于有限状态机。整个CDF中只有一个跟踪符号。使用动态的第二个参数,记录事件名称,并且在运行有限状态机的Manipulate的主表达式中,它有5个状态,并且有8个事件。根据当前状态和刚刚发生的当前事件,它会切换到新状态(或者可以保持相同的状态,具体取决于),并且主显示屏会更新。无需触发器。状态机运行速度与您允许的速度一样快,仅受时间步长控制。

这极大地简化了逻辑,并且可以处理更高级的UI和相互依赖的逻辑,因为现在所有内容都以良好控制的方式运行,并且所有逻辑都在一个地方。

如果无法使用动力学的第二个参数设置事件,那么整个方法就不可能实现。

我需要写一个关于这种方法的说明,以使其更清晰。

所以,我想在此感谢大家。我现在正在使用这种方法完成另一个CDF,即三摆模拟。

1 个答案:

答案 0 :(得分:7)

并非Manipulate之后的所有参数都必须是Control个对象。你可以在那里放任何你喜欢的东西 - 包括完全自定义的动态控件那么,像

这样的东西呢
Manipulate[a, {a, None}, {b, None}, 
 Row[{"b= ",Slider[Dynamic[b, (b = #; a = Sin[b]; #)&], {-2 Pi, 2 Pi}]}]]

{a, None}{b, None}确保变量是本地变量,但并非绝对必要。