我无法获得做我想做的事的语法,我现在不确定它是否可能。
小评论:
可以这样做:
{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}
现在每次 slider 移动时,'b'都会改变,它的Sin[]会自动打印出来
但是假设我想直接在 slider 所在的位置进行计算(Sin[])并且只显示 Sin[] 的最终结果,那么我可以像这样使用 Dynamic 的第二个参数:
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}],
Dynamic[a]}
现在我想使用 Manipulate,并做同样的事情。我可以像上面的第一个示例一样执行以下操作:
Manipulate[
Sin[b],
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}]
]
在上面,Manipulate 处理了 'Dynamic' 的东西,并在 '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 的第二个参数?
我问的原因是,它可以更容易地在控制变量发生变化的地方“本地化”计算,并且只在其他地方显示最终结果。在某种程度上,就像本地回调函数一样,与每个控件的更改相关的计算就位于控件所在的位置旁边。
谢谢
2011 年 9 月 16 日更新
好吧,经过一个月的努力,我终于让 Mathematica CDF 启动并运行了。
感谢 Simon 在这里展示的技巧的帮助,以及在我做这个 CDF 时回答我问题的其他人(Leonid、Heike、WReach、Belisarius 和其他人)。
我在这里学到的一些技巧帮助完成了这个演示,这里是 link如果有人想试试。
这个 CDF 的设计与我之前所做的一切都不同。它基于有限状态机。整个 CDF 中只有一个跟踪符号。使用 dynamics 的第二个参数,记录事件名称,并且在运行有限状态机的 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}]}]]
{a, None}
和 {b, None}
确保变量是本地的,但不是绝对必要的。
关于wolfram-mathematica - 是否可以使用 Dynamic 的第二个参数在 Manipulate 中设置控制变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7328797/