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,即三摆模拟.
并非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}确保变量是局部的,但并非绝对必要.