使用Manipulate和变量依赖的Multipanels

时间:2011-07-23 14:12:03

标签: wolfram-mathematica

是否可以更改Manipulate中变量的值?假设我有Manipulate个变量xy,我们会显示这些值。我想要做的是以这样的方式制作:当我更改x的值时,y会更新为x * x。当我更改y的值时,x会更新为y的平方根。

另一个问题是,我可以在Manipulate中设置多个面板吗?我想在每个滑块下面都有一个白色面板。

Manipulate[
 Row[{x, y}, "    "],
 Row[{
   Control[{{x, 0, Style["x", "TI", 14]}, 0, 4 , Appearance -> "Labeled"}],
   Control[{{y, 0, Style["y", "TI", 14]}, 0, 16, Appearance -> "Labeled"}]
 }]
] 

Example

在上面的情节中,我将x设为3,将y设为9.再次,我想将y移至4并让x移动到2。同样,我想将x移至4并将y移至16。 有可能吗?或者我刚遇到鸡肉或鸡蛋问题?

3 个答案:

答案 0 :(得分:5)

有点黑客但是要把滑块耦合并得到两个面板,你也可以做这样的事情

Panel[DynamicModule[{x, y, width = 250},
  Grid[{{
     Labeled[Slider[Dynamic[x, (x = #; y = #^2) &], {0, 5}],
      {Style["x", "TI", 14], Dynamic[x]}, {Left, Right}],
     Labeled[Slider[Dynamic[y, (y = #; x = Sqrt[#]) &], {0, 25}],
      {Style["y", "TI", 14], Dynamic[y]}, {Left, Right}]},

    Framed[Pane[#, width, Alignment -> Center], FrameMargins -> 10,
       Background -> White, FrameStyle -> {Gray}] & /@ 
     {Row[{"x=", Dynamic[x]}], Row[{"y=", Dynamic[y]}]}}, Alignment -> Left]]]

<强>截图:

Double panel

答案 1 :(得分:3)

怎么样

DynamicModule[{x = 0},
  {Slider[Dynamic[x], {0, 1}],
  Slider[Dynamic[x^2, (x = Sqrt@#) &], {0, 1}]}]

enter image description here

这是我在docstutorial/IntroductionToDynamic中找到的代码段的一个简单修改?

编辑:您可以按如下方式添加面板等:

DynamicModule[{x = 0},
  Row[{Column[{Slider[Dynamic[x], {0, 1}], Panel@Dynamic@x}],
  Column[{Slider[Dynamic[x^2, (x = Sqrt@#) &], {0, 1}],
    Panel@Dynamic@Sqrt[x]}]}]]

enter image description here

答案 2 :(得分:2)

将每个问题分开可能会更好。很难在同一个地方回答2个问题。

对于第一个问题,您可以使用自己的Dynamics来获得更好的控制。这是一种方式:

Manipulate[
  Row[{
      Dynamic[Refresh[Text@Row[{"x=",x," y=",y}],TrackedSymbols->{event}]],
      Dynamic[Refresh[event=Date[];y=x*x;"",TrackedSymbols->{x}]],
      Dynamic[Refresh[event=Date[];x=Sqrt[y];"",TrackedSymbols->{y}]]
     }],
  {{x,2,"x"},0,100,1},
  {{y,2,"y"},0,1000,1},
  {{event,0},ControlType->None},
  TrackedSymbols:>{None}
]

enter image description here

对于你的第二个问题,一个Manipulate,有一个'panel',输出到达。所以,你不能用一个Manipulate真正做到这一点。但是你可以嵌套Manipulates,所以你可以通过在一个Manipulate下使用自己的控件进行每个操作来实现这一点。

UPDATE1:

要在2个内部Manipulate之间共享变量,所以当一个Manipulate更新自己的变量时,另一个Manipulate会看到最新的更新,这是一种可能的方法。当您移动一个Manipulate滑块时,第二个Manipulate会自动使用新值更新。

Manipulate[

   Grid[{{

    Manipulate[( gx=x; Row[{"x=",x," y=",gy}]),
               {{x,1,"x="},0,10,1}],
    Manipulate[( gy=y; Row[{"x=",gx," y=",y}]),
               {{y,1,"y="},0,10,1}]
   }}],

{{gx,0},ControlType->None},
{{gy,0},ControlType->None},

ControlPlacement->Bottom
]

enter image description here