我无法弄清楚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内部问题的任何其他动态。
答案 0 :(得分:2)
您是否尝试关闭SynchronousUpdating
? (见documentation)
我不完全确定为什么某些函数正在执行此操作而不是其他函数,但可能是您正在执行的特定类型的转换未在Dynamic
尝试更新之前完成评估。如果是这样,尝试的另一件事是将SynchronousInitialization
选项的值更改为False
(默认为True
)。然后,即使在Dynamic
或Manipulate
构造正在更新时,转换也会排队,而不是(根据documentation),等待初始化表达式的评估完成后再继续。< / p>