gpt4 book ai didi

wolfram-mathematica - 将某些函数与 LocatorPane 动态点一起使用时出现问题

转载 作者:行者123 更新时间:2023-12-01 01:04:12 26 4
gpt4 key购买 nike

我不明白为什么 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 包装上面对 process[p] 的调用,以传递“p”的当前值。

所以,我的问题是,为什么当我使用某些函数(例如 ZTransform)时,Dynamics 会继续更新,而其他一些函数(例如 Laplace)却没有看到这个问题。

我该怎么做才能解决这个问题?在此示例中,我确实需要使用更新后的点“p”调用 ZTransform。

这是在 windows 上的 8.01 版本。

谢谢

编辑1:

我找到了一些可能有用的东西。当我在调用 ZTransform[] 之后添加 FinishDynamic[] 时,它会阻塞。但不是用另一个调用,如拉普拉斯。这意味着,根据文档,ZTransform 生成一个尚未完成更新的 Dynamic。这是什么物体?

这是一个例子:

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[] 正在生成一些永远不会完成更新的 Dynamic 或类似的东西?

编辑2:

我找到了解决方案。添加跟踪符号。在这里

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 内问题的任何其他动态。

最佳答案

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

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

关于wolfram-mathematica - 将某些函数与 LocatorPane 动态点一起使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com