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

Wolfram mathematica 是否可以使用Dynamic的第二个参数在Operate中设置控制变量?,wolfram-mathematica,Wolfram Mathematica,我不能得到语法来做我想做的事情,我现在甚至不确定这是否可能 小型审查: 我们可以这样做: {Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]} 现在,每次滑块移动,“b”都会改变,它的Sin[]会自动打印出来 但是假设我想直接在滑块所在的位置进行计算(Sin[]),并且只显示Sin[]的最终结果,那么我可以像这样使用Dynamic的第二个参数: {Slider[Dynamic[b, (b = #; a = Sin[b]; #) &]

我不能得到语法来做我想做的事情,我现在甚至不确定这是否可能

小型审查: 我们可以这样做:

{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}
现在,每次滑块移动,“b”都会改变,它的Sin[]会自动打印出来

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

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

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

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

在上面的例子中,操纵处理“动态”内容,并在“b”发生变化时更新Sin[b]

现在,我想看看是否可以使用Operate处理第二种情况,以便编写:

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}]}
 ]
这甚至不是操纵控件的有效语法

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

我提出这个问题的原因是,在控制变量发生变化的地方,它可以使计算更容易“本地化”,并且只在其他地方显示最终结果。在某种程度上类似于本地回调函数,其中与每个控件的更改相关的计算正好位于控件所在位置的旁边

谢谢

2011年9月16日更新

经过一个月的努力,我终于让Mathematica CDF启动并运行了

多亏了Simon和其他人的帮助,他们在我做CDF时回答了我的问题(Leonid、Heike、Florach、Belisarius和其他人)

我在这里学到的几个技巧帮助我完成了这个演示,下面是一个例子,如果有人想尝试它

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

这大大简化了逻辑,并使处理更高级的UI和相互依赖的逻辑成为可能,因为现在一切都以一种受控的方式运行,所有逻辑都在一个地方

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

我需要写一篇关于这个方法的笔记,让它更清楚


所以,我只想感谢这里的每一个人。现在,我正在使用此方法完成另一个CDF,即三摆模拟。

在第一个CDF之后的
操纵
的参数并非都必须是
控制
对象。你可以把任何你喜欢的东西放在那里,包括完全定制的动态控件。那么,像这样的东西怎么样

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

其中
{a,None}
{b,None}
确保变量是局部变量,但不是严格必需的。

好把戏!这打开了新的可能性:)。顺便说一句,我不知道为什么你在上面的行之前添加了动态。它在没有它的情况下工作,如下所示:行[{“b=,Slider[Dynamic[b,(b=#;a=Sin[b];#)&],{-2pi,2pi}],似乎不需要额外的动态。再次感谢@纳赛尔:谢谢,我已经删除了无关的
Dynamic
。我一直在尝试这种方法,而且效果很好。我简化了很多逻辑。现在,在操纵表达式中有一个状态机,我可以在任何控件容易更改时更改状态。在此之前,我必须在每个控件或控件集的所有位置使用复杂的动态/刷新代码,以检测控件何时更改。但是现在我可以非常简单地切换状态,而不用在主表达式中使用Dynamic[Refresh[…]]。使用主表达式中的Which[],我总是知道我处于哪个状态。哇,最终结果看起来真不错!在我的机器上运行速度很慢,但大多数情况下。。。如果你能为那些不能使用浏览器插件的人提供一个下载链接,那就太好了。@Simon,我刚刚为CDF和笔记本本身添加了两个链接。它以最快的速度运行,除了被跟踪的动态之外,没有时钟。我现在对“慢度”问题有了更好的想法。当显示更多的内容时,屏幕更新开始需要更多的时间,整个循环减慢,等待每次绘制屏幕。在CDF演示中,获得更高的fps对我来说是个问题。我不知道是否有技巧使这更有效。但这显然是由于这个原因。当我减少要显示的图形/绘图数量时,模拟运行得更快。不使用时钟,只使用一个循环,循环中显示[图形[…]]。我刚刚完成的最新CDF非常清楚地说明了这个问题。