【问题标题】:How to avoid individual patch updates如何避免个别补丁更新
【发布时间】:2014-09-22 14:42:46
【问题描述】:

我在我的模型中对扩散进行建模,但我认为由于 NetLogo 顺序更新各个补丁,我得到了一个计算工件。我不会使用 diffuse 命令(由于扩散不准确)。然而,就像这个命令的工作原理一样,我想同时更新补丁的所有计算,而不是按顺序更新。我稍微记得看到一些在 tick 开头使用值的示例代码,但是我现在似乎找不到它。

具体来说,我需要帮助编程一种方法,以便在每次滴答时存储补丁值,然后根据这些存储的值进行同时计算。

【问题讨论】:

  • 出于好奇,您对diffuse 有哪些不准确之处?
  • 嗨,Bryan,感谢您提供的这个漂亮的编码技巧。我自己没有测试过diffuse命令的不准确性。我已经看到声称自己和邻居之间的非同质距离(角落补丁比非角落补丁更远)导致不准确。然而,就像我说的我自己没有测试过这个,只是简单地接受了另一个研究小组的声明。相反,可以使用有限差分方案来逼近菲克斯定律中的偏微分方程。这是我的做法。如果您有兴趣获取代码,请告诉我,我很乐意分享。
  • 请注意diffuse4 不存在非均匀距离问题。
  • 这提出了一个很好的观点,我没有t thought of this. In fact my model is simulating diffusion, however between boundry conditions with fixed concentrations, I need a bi-linear interpolation to calculate concentrations between some fixed nodes. I cant 弄清楚为什么使用neighbors4 的平均值没有给出正确的插值。然而,如果重复使用diffuse4 进行插值,则会给出正确的双线性插值。我使用diffuse4 的问题是我必须在特定平面内插值(所以我使用patch-at)。也许我应该提出这个问题以使问题更清楚?
  • 我已将我的问题作为一个新问题发布。我似乎无法找出我需要的双线性插值过程。感谢您提供帮助的 cmets 和代码。

标签: netlogo


【解决方案1】:

很好的问题。正如您所指出的,基本上您想在一个 ask 块中计算变量的新值,但将其存储在一个单独的变量中,然后在第二个 ask 块中更新变量的实际值,如下所示:

turtles-own [
  value
  new-value
]

...
to go
  ask patches [
    ;; Change this line to however you want the diffusion to work
    set new-value 0.5 * value + sum [  0.5 * value / 4 ] of neighbors4
  ]
  ask patches [
    set value new-value
  ]
end

这样,所有补丁都根据相同的信息计算它们的更新值,然后实际上同时更新这些值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2015-01-15
    相关资源
    最近更新 更多