使用LocatorPane动态点的一些函数的问题

时间:2011-07-09 14:08:30

标签: wolfram-mathematica

我无法弄清楚Mathematica为何如此表现,可能有人可以看到问题。我不是动力学的专家,所以我可能会忽略一些东西。

我首先显示代码,然后说出问题所在。

Clear[t, s, n, z]; 
Grid[{
 {LocatorPane[Dynamic[p], Graphics[Circle[{0, 0}, 1], ImageSize -> 200],{{-1, -1}, {1, 1}}]}, 
 {Dynamic[{Print@Date[]; Print[ZTransform[n^2/2^n, n, z]]; p}]}}
]

运行上述内容时,您会看到它一直循环,因为它会继续打印。您将看到打印消息没有对LocatorPane或移动鼠标做任何事情。

但是当我将上面的函数ZTransform改为其他东西时,比如拉普拉斯,那么循环停止了:

Clear[t, s, n, z]; 
Grid[{
 {LocatorPane[Dynamic[p], Graphics[Circle[{0, 0}, 1], ImageSize -> 200],{{-1, -1}, {1, 1}}]}, 
 {Dynamic[{Print@Date[]; Print[LaplaceTransform[t^4*Sin[t], t, s]]; p}]}}
]

似乎功能相关的傅立叶导致了这一点,因为我也尝试了这个,它也有同样的问题:

Clear[t, s, n, z,w]; 
Grid[{
 {LocatorPane[Dynamic[p], Graphics[Circle[{0, 0}, 1], ImageSize -> 200],{{-1, -1}, {1, 1}}]}, 
 {Dynamic[{Print@Date[]; Print[FourierSequenceTransform[(1/2)^n UnitStep[n], n, w]]; p}]}}
]

另一种方法是使用模块:

process[p_] := Module[{n, z, t, s, w},
  Print[Date[]];
  ZTransform[n^2 2^(-n), n, z];
  p
  ]

Grid[{
  {LocatorPane[Dynamic[p], 
    Graphics[Circle[{0, 0}, 1],ImageSize -> 200], {{-1, -1}, {1, 1}}]},
  {Dynamic[process[p]]}
  }]

同样的问题,我再次看到了循环。我必须使用Dynamics包含对上面的[p]进程的调用,以传递'p'的当前值。

所以,我的问题是为什么当我使用一些函数如ZTransform时,Dynamics会继续更新,但是其他一些功能如拉普拉斯,我没有看到这个问题。

我该怎么做才能解决这个问题?我需要在这个例子中使用更新的点'p'来调用ZTransform。

这是在Windows上的8.01版本。

感谢

EDIT1:

我发现了一些可能有用的东西。当我在调用ZTransform []之后添加FinishDynamic []时,它会阻塞。但不是拉普拉斯这样的另一个电话。根据文档,这意味着ZTransform生成一个尚未完成更新的动态。这是什么对象?

以下是一个例子:

process[p_] := Module[{n, z},
  Print[Date[]];
  ZTransform[n^2 2^(-n), n, z];  (*bad*)
  FinishDynamic[]; (*BLOCKS*)
  p
  ]

Grid[{
  {LocatorPane[Dynamic[p], 
    Graphics[Circle[{0, 0}, 1], 
     ImageSize -> 200], {{-1, -1}, {1, 1}}]},
  {Dynamic[process[p]]}
  }]

再次,将ZTransform []更改为其他一些调用,例如Laplace []没有这个问题。

所以,在我看来,ZTransform []正在生成一些永远不会完成更新的动态或其他类似的东西?

EDIT2:

我找到了解决方案。添加trackedSymbols。这是

process[p_] := Module[{n, z},
  Print[Date[]];
  ZTransform[n^2 2^(-n), n, z];(*bad*)
  p]

Grid[{
  {LocatorPane[Dynamic[p], Graphics[Circle[{0, 0}, 1],ImageSize -> 200], {{-1, -1}, {1, 1}}]},
  {Dynamic[process[p], TrackedSymbols :> {p}]
   }
  }]

在调用ZTransform时不确定为什么需要它,而不需要其他功能。我的猜测是这样的:ZTransform在内部生成了一个永远不会完成'更新'的动态(这就是为什么它按照上面的EDIT1阻止了)。

通过仅在LocatorPane变量'p'上显式添加TrackedSymbols,它现在可以正常工作,因为现在没有跟踪导致ZTrasnform内部问题的任何其他动态。

1 个答案:

答案 0 :(得分:2)

您是否尝试关闭SynchronousUpdating? (见documentation

我不完全确定为什么某些函数正在执行此操作而不是其他函数,但可能是您正在执行的特定类型的转换未在Dynamic尝试更新之前完成评估。如果是这样,尝试的另一件事是将SynchronousInitialization选项的值更改为False(默认为True)。然后,即使在DynamicManipulate构造正在更新时,转换也会排队,而不是(根据documentation),等待初始化表达式的评估完成后再继续。< / p>