2011-07-17 9 views
17

私は2つのパネルを持っているようにしています。左側はグラフィックと2つのロケータを示し、右側はズームインしたバージョンをロケータによって定義された領域に示します。動的対話性の問題

私は

ClearAll[mndpt]; 
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}}, 
    Module[{z, iters}, 
     iters = 0.; 
     z = c; 
      While[(iters < maxiter) && ([email protected] < 2), 
       iters++; 
       z = z^2 + c]; 
     Sqrt[iters/maxiter]], 
    {{z, _Complex}}, 
    CompilationTarget \[Rule] "C", 
    RuntimeOptions \[Rule] "Speed"]; 

を試してみたと

Manipulate[ 
Grid[ 
    {{DensityPlot[mndpt[x + y*I, 200], 
     {x, -2, 1}, {y, -1.5, 1.5}, 
     PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
    ColorFunction \[Rule] "Rainbow"], 
    DensityPlot[mndpt[x + y*I, 200], 
     [email protected]{x, p1[[1]], p2[[1]]}, [email protected]{y, p1[[2]], p2[[2]]}, 
     PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
    ColorFunction \[Rule] "Rainbow"]}}], 
{{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}] 

は、右のパネルは、その後動作しないん enter image description here

なぜそうなのか私の質問は、ありますか?ご覧のように、「DensityPlot :: pllim:Range specification {x、-1,0}は{x、xmin、xmax}の形式ではありません」と不平を言っています。実際、私は一般的に困惑しています。何が起こっている?スコープの問題のいくつかの並べ替え?評価の問題?そして、どうすればそれを動かすことができますか?これはおそらく単純ですが、私はこのフロントエンドのものを本当に理解したことはありません。

EDIT:この質問は、私の愚かさが急激に(願わくは瞬時に)急増していることが判明しました。コメントの中でSimonが指摘しているように、この2つを取り除くと(この作業をするために私は盲目的に追加した)Dynamics はすべて正常に動作します。それがうまくいかなかったように、私は最初の数回をした理由を他の誰もが知っている、

enter image description here

ので:つまり、

Manipulate[ 
Grid[ 
    {{DensityPlot[mndpt[x + y*I, 200], 
     {x, -2, 1}, {y, -1.5, 1.5}, 
     PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
    ColorFunction \[Rule] "Rainbow"], 
    DensityPlot[mndpt[x + y*I, 200], 
     {x, p1[[1]], p2[[1]]},{y, p1[[2]], p2[[2]]}, 
     PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
    ColorFunction \[Rule] "Rainbow"]}}], 
{{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}] 

は正しいことを行います。

一方、「DensityPlot :: pllim:範囲指定{x、-1,0}は{x、xmin、xmax}の形式ではありません。困惑する。私はそれがレオニードによって説明されていると思います。(簡潔に言えば、ClearAttributes[Dynamic, ReadProtected]を入力して??Dynamicを参照してください。定義はDynamic/:MakeBoxes[BoxForm`x$_Dynamic,StandardForm]:=などです)。フロントエンドプログラミングについての私の理解は無視できるので、私はここで説明しようとしないので、誰かがそれを説明する答えを投稿しても、それは認められるだろう。

+5

2つの「ダイナミック」を削除しても問題ありません。 – Simon

+1

@imimああ、ありがとう!私は実際にそこに置いていました。なぜなら、「うまくいきませんでした」。誰が私がやったことを知っている...私はそれを受け入れることができる答えとしてあなたのコメントを入れてください。また、なぜ「ダイナミック」が混乱しているのか分かっていれば知りたいです。 – acl

+0

@ Simon OK、それはおそらく 'Dynamic'が属性' HoldFirst'を持っているからです。または? – acl

答えて

5

Dynamicを2番目のDensityPlotの範囲から削除すると、問題のコメントで説明したように、コードは正常に機能します。 Dynamicは、Manipulateの本文には通常は必要ありません。自動的に動的構造でラップされるためです。ただし、式の更新部分を細かく制御するには、Dynamic inside of a Manipulateを使用すると便利です。プロットの範囲はxSymbolxminxmax数値でフォーム{x, xmin, xmax}でなければならないため、エラーが生成された

理由がありました。リストの周りにDynamicを配置すると、先頭が変わり、プロットが分割されます。

エラーメッセージが少し混乱だったため、エラーが見つけることが明らかではなかったことが理由である:

範囲指定{X、-1,0}は、フォーム{X、XMINではありませんxmax}である。表面に狂ったように見えますが、あなたはDynamicは、ノートブックに出力したときにそれが見えなくなりますMakeBoxesに定義されているラッパーであること(レオニードで指摘したように)を実現一度理にかなって、

。この、順番に

In[1]:= FormatValues[Dynamic] 
Out[1]= {HoldPattern[MakeBoxes[BoxForm`x$_Dynamic, StandardForm]] :> (DynamicModule; 
      DynamicDump`ControlToBoxes[BoxForm`x$, StandardForm]), 
     <<snip: same but for TraditionalForm>>} 

ControlToBoxes見を表示するには、DynamicBoxオブジェクトを作成します。これは、Dynamic[x]と入力して表示され、セルメニューまたは生成された出力セルのShow Expressionへのショートカットを使用すると表示されます。エラーメッセージの基礎となる表現を見て、DynamicBoxの構造を参照することもできます。それはUnprotectすることも可能だとDynamicMakeBoxes定義を削除するが、それはほとんどのMathematicaで動的な機能のを壊し...


は最後に、ここではコードの私のバージョンです:

mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}}, 
    Module[{z = c, iters = 0.0}, 
    While[(iters < maxiter) && ([email protected] < 2), iters++; z = z^2 + c]; 
    Sqrt[iters/maxiter]], CompilationTarget -> "C", 
    RuntimeOptions -> "Speed"]; 

opts = Sequence[PlotPoints -> 80, ColorFunction -> "Rainbow", 
    ImageSize -> Medium, ImagePadding -> {{30, 5}, {20, 5}}]; 

fixed = DensityPlot[mndpt[x + y*I, 200], {x, -2, 1}, {y, -1.5, 1.5}, 
    PlotPoints -> 120, Evaluate[opts]]; 

Manipulate[Grid[{{fixed, DensityPlot[mndpt[x + y*I, 200], 
    {x, p[[1, 1]], p[[2, 1]]}, {y, p[[1, 2]], p[[2, 2]]}, Evaluate[opts]]}}], 
{{p, {{-1, -1}, {0, 1}}}, Locator, ContinuousAction -> False}] 

output of the above

+1

偶然にも、私はあなたがそれを提出した直後にこれを見ました。あなたがそれを提出してから14秒後にあなたの答えをアップフォートして受け入れたようです。 – acl

+1

@acl:これはちょうど私に[Revival Badge](http://stackoverflow.com/badges/837/revival?userid=421225)を手に入れました - それは怠け者です! – Simon

関連する問題