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

Nas*_*ser 5 wolfram-mathematica

我无法得到我想要的语法,我现在不确定它是否可能.

小评:一个人可以这样做:

{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}
Run Code Online (Sandbox Code Playgroud)

现在每次滑块移动时,'b'都会改变,并且会自动打印它的Sin []

在此输入图像描述

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

{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}], 
 Dynamic[a]}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Manipulate[
 Sin[b],
 Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}]
 ]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

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

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

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

当然,不能只写

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

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

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

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

谢谢

更新9/16/11

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

感谢Simon在这里展示的技巧的帮助,以及在我做这个CDF(Leonid,Heike,WReach,Belisarius等人)时回答我问题的其他人.

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

在此输入图像描述

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

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

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

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

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

Sim*_*mon 7

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

Manipulate[a, {a, None}, {b, None}, 
 Row[{"b= ",Slider[Dynamic[b, (b = #; a = Sin[b]; #)&], {-2 Pi, 2 Pi}]}]]
Run Code Online (Sandbox Code Playgroud)

其中{a, None}{b, None}确保变量是局部的,但并非绝对必要.