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

标签 wolfram-mathematica

我无法获得做我想做的事的语法,我现在不确定它是否可能。

小评论:
可以这样做:

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

现在每次 slider 移动时,'b'都会改变,它的Sin[]会自动打印出来

enter image description here

但是假设我想直接在 slider 所在的位置进行计算(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 处理了 '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如果有人想试试。

enter image description here

这个 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/

相关文章:

wolfram-mathematica - 如何将值映射到mathematica中的函数列表上?

c# - Mathematica 语法的解析器?

wolfram-mathematica - 计算与谓词匹配的元素的最快方法

parsing - 可以区分 foo[.2] 和 foo[.20] 的 Mathematica 函数 foo

wolfram-mathematica - 当ContentSize不适合Manipulate中的内容时,如何不显示滚动条?

wolfram-mathematica - 具有带下标和上标的参数

wolfram-mathematica - 如何用权重标记图形边缘

graphics - 适合笔记本宽度 Mathematica 中的 ImageSize

pdf - 优化 Mathematica 生成的 eps/pdf 文件的大小

wolfram-mathematica - 在 Mathematica 中向半对数图添加图例