2011-09-07 6 views
5

私は自分がしたいことをするための構文を得ることができませんし、今でも可能であるかどうかはわかりません。Manipulateの内部で制御変数を設定する際に、Dynamicの第2引数を使用することは可能ですか?

小さなレビュー: 一つは、これを行うことができます:今、毎回

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

をし、スライダーが移動すると、 'B' が変化し、その罪[]自動的にプリントされ

enter image description here

しかし、スライダがどこにあるか計算(Sin [])を直接行い、Sin []の最終結果のみを表示したいとしたら、このようにDynamicの2番目の引数を使用できます:

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

enter image description here

今、私が操作する利用したい、と同じことを行います。私はこのような上記の最初の例と同じ操作を行うことができます、上記で

Manipulate[ 
Sin[b], 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] 
] 

enter image description here

操作し、[B]いつでも「がB」変更を「動的」なものの世話をした、と罪を更新。

は今、私が操作し使用して、第2のケースを行うことができるかどうかを確認したいので、私は書くことができます:

Manipulate[ 
a, 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*) 
] 

(「」初期表示のためのいくつかの値に初期化する必要があります)。

しかし、私は上記の 'b'に2番目の引数を使用する方法を理解できません。構文を理解することはできませんが、今できるかどうかは確かですか?

もちろん、一つはちょうどこれは、コントロールを操作するのにも有効な構文ではありません

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

書き込むことはできません。

質問:マニピュレートコントロールの設定でダイナミックの第2引数を使用することはできますか?

私が求めているのは、制御変数が変更されている場所で計算を 'ローカライズ'することが容易になり、最終結果のみを他の場所に表示できることです。途中でローカルコールバック関数のように、各コントロールの変更に関連する計算がコントロールのすぐ隣にあります。

おかげ

更新9/16/11

はまあ、闘争のヶ月後、最終的には私が稼働してMathematicaのCDFを持っています。

私はこのCDF(Leonid、Heike、WReach、Belisariusなど)をやっている間に、Simonと私の質問に答えた他の人たちの助けを借りてくれてありがとう。

私はここで学んだいくつかのトリックは、ここでは、このデモを終える助けた誰かがそれを試してみたい場合linkです。

enter image description here

このCDFのデザインは、私が前にやったすべてのものと異なっています。それは有限状態機械に基づいている。 CDF全体には1つの追跡記号しかありません。ダイナミクスの第2引数を使用して、イベント名が記録され、有限状態マシンを実行するManipulateのメイン式には5つの状態があり、8つのイベントがあります。現在の状態と発生した現在のイベントに応じて、新しい状態に切り替わります(または、同じ状態のままでもかまいません)。メインディスプレイが更新されます。トリガは必要ありません。ステートマシンは、許可するだけ速く実行され、タイムステップサイズだけが制御されます。

これは非常にロジックを簡素化し、すべてが今も制御された方法で実行し、すべてのロジックが一つの場所にあるため、はるかに高度なUIと相互依存のロジックを作る扱うことが可能となります。

力学の第2引数を使用して、イベントを設定できず、この全体のアプローチは不可能でした。

私はそれがより明確にするために、この方法でノートを作成する必要があります。

ので、ちょうどここに皆に感謝したいです。私は今、このメソッドを使用して別のCDFを完成させています.3重振り子シミュレーションです。

+0

うわー、最終結果は本当に素晴らしいです!私のマシンでは動作が遅くなりますが、ほとんどの場合は...ブラウザプラグインを使用できない人にはダウンロードリンクを提供できるといいですね。 – Simon

+1

@Simon、CDFとノートブック自体に2つのリンクを追加しました。 http://12000.org/my_notes/mma_demos/simple_pendulum_damped_driven/index.htm可能な限り速く実行され、追跡される動的以外のクロックはありません。 – Nasser

+0

私は今、「遅さ」の問題についてより良いアイデアを持っています。より多くのものが表示されると、画面の更新に時間がかかるようになり、ループ全体が遅くなり、毎回画面が描画されるのを待っています。 CDFデモでは、より高いfpsを得ることが私にとっては問題でした。これをより効率的にするかどうかを決めるトリックがあるかどうかはわかりません。しかし、これは間違いなくこれによると思われます。私が表示するグラフィックス/プロットの数を減らすと、シミュレーションはより速く実行されます。クロックは使用されず、Show [Graphics [..]]を含むループのみが使用されます。最新のCDFがこの問題を非常にはっきりと示しました。 – Nasser

答えて

7

最初の1の後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}変数はローカルですが、厳密には必要ではないことを確認してください。

+0

ニースのトリックSimon!これは新しい可能性を開く:)。 Btw、上記のDynamic before Rowを追加した理由は分かりません。これは、次のように動作します:Row [{"b ="、 Slider [Dynamic [b、(b =#; a = Sin [b];#)&]、{-2 Pi、2 Pi}]} ]、余分なダイナミックは必要ではないようです。再度、感謝します! – Nasser

+0

@Nasser:ありがとう、私はその余分な '動的'を削除しました。 – Simon

+0

私はこの方法を試しており、とてもうまくいっています。私はロジックを単純化しました。さて、私は、マニピュレート式のステートマシンを持っています。コントロールが変わるたびにステートを変更することができます。複雑なダイナミック/リフレッシュコードをコントロールの各場所、またはコントロールのセットで使用してコントロールを変更する前に、そのコントロールを変更する必要がありました。しかし、今では、メインの操作式でDynamic [Refresh [..]]を使用せずに、ただ簡単に状態を切り替えることができます。メイン式の操作で[]を使うと、私はいつ私がいるのか知っています。 – Nasser

関連する問題