动态交互问题

acl*_*acl 17 frontend wolfram-mathematica interactive dynamic

我试图有两个面板,左边显示一个图形和两个定位器,右边一个是定位器定义的区域中的放大版本.

我试过了

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

并做

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],
        Dynamic@{x, p1[[1]], p2[[1]]}, Dynamic@{y, p1[[2]], p2[[2]]},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"]}}],
 {{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]
Run Code Online (Sandbox Code Playgroud)

右侧面板不起作用: 在此输入图像描述

我的问题是,为什么会这样呢?正如你所看到的,它抱怨"DensityPlot :: pllim:Range specification {x,-1,0}不是{x,xmin,xmax}的形式."我觉得这很令人费解.事实上我一般都很困惑.到底是怎么回事?某种范围问题?评估问题?我怎样才能让它发挥作用?这可能很简单,但我从来没有真正理解这个前端的东西.

编辑:事实证明,这个问题是由于我的愚蠢(希望是短暂的)急剧增加.正如西蒙在一篇评论中指出的那样,删除这两个Dynamics (我已经盲目地努力使这项工作添加)使一切正常.那是,

    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}]
Run Code Online (Sandbox Code Playgroud)

做对了:

在此输入图像描述

所以,谁知道为什么我在前几次做了以至于它不起作用.

另一方面,原始案例中的消息,即"DensityPlot :: pllim:Range specification {x,-1,0}不具有{x,xmin,xmax}的形式."更令人费解.我认为这是由Leonid解释的,也是在评论中(简而言之,ClearAttributes[Dynamic, ReadProtected]然后尝试??Dynamic,你可以看到有一个定义Dynamic/:MakeBoxes[BoxForm`x$_Dynamic,StandardForm]:=等).由于我对前端编程的理解可以忽略不计,所以我不会在这里解释它,所以如果有人发布解释的答案,那将不胜感激.

Sim*_*mon 5

正如对问题的评论中所讨论的,如果Dynamics从第二个范围中移除,则代码可以正常工作DensityPlot.的Dynamics的情况下不需要在的主体Manipulate,因为它被自动包装在一个动态构建体.虽然为了更精细地控制表达式的哪些部分更新,但Dynamic在内部Manipulate使用它可能很有用.

在创建了一个错误的原因是因为一个阴谋的范围应该是这样的形式{x, xmin, xmax}x一个Symbolxminxmax数字.环绕Dynamic列表会改变头部并破坏情节.

发现错误的原因并不明显,因为错误消息有点令人困惑:

范围规范{x,-1,0}不是{x,xmin,xmax}的形式.

从表面看起来很疯狂,但是一旦你意识到(正如Leonid所指出的那样)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>>}
Run Code Online (Sandbox Code Playgroud)

并且ControlToBoxes反过来,创建一个DynamicBox对象.通过输入Dynamic[x]和使用单元格菜单或快捷方式显示生成的输出单元格的表达式,也可以看到这一点- 您还可以查看错误消息的基础表达式并查看其中的DynamicBox构造.它也可以Unprotect删除MakeBoxes定义Dynamic,但是它破坏了Mathematica中的大部分动态功能......


最后,这是我的代码版本:

mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
   Module[{z = c, iters = 0.0},
    While[(iters < maxiter) && (Abs@z < 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}]
Run Code Online (Sandbox Code Playgroud)

以上的输出