如何在 NetLogo 中绘制直方图上的分布曲线?

How do I plot a distribution curve over a histogram in NetLogo?

我正在用 NetLogo 编写一个简单的蜜蜂食物交换模型。我绘制了一个直方图来显示蜜蜂在每个滴答声中具有不同食物量的分布。现在我想绘制一条覆盖直方图的正态分布曲线,每次我 运行 我的模型,即适合直方图条的曲线。我用一支笔和这个命令来绘制直方图:histogram [food] of turtles 并且还写了一个这样的函数来添加另一支笔:

to draw-PDF
  set-current-plot "OVERALL FOOD DISTRIBUTION"
  create-temporary-plot-pen "normal"
  set-plot-pen-color red
  plot-pen-down
  let distsd sqrt ( variance ([food] of turtles) )
  let distmean mean [food] of turtles
  let multconst Number_of_bees / distsd / sqrt(2 * pi)
  let expconst 2 * distsd ^ 2
  let b 0
  while [ b < Number_of_bees]
  [
    let f foodofeachbee b
    let exparg (- ((f - distmean) ^ 2)) / expconst
    let y multconst * exp(exparg)
    plotxy f  y ]
end

foodofeachbee是我单独定义的reporter。但是运行宁这个,我得到了说"your model is too large to run!"

的错误

有什么建议吗?

您将不得不针对您的特定变量等修改此代码,但这里有一个完整的模型,演示了如何执行我认为您想要的操作。将此代码复制到一个空白模型中,并使用具有 histogram [ value ] of turtles 且间隔为 0.05 的笔创建一个名为 Test 的绘图。该代码添加了第二支笔,其中 pdf 由变量的均值和方差构建并针对海龟的数量进行了调整。

您正在尝试为每只蜜蜂构建一个值。 pdf 与单个蜜蜂无关,因此绘图过程可以完全忽略它们,除了提取均值和方差所需的值之外。

turtles-own [value]

to testme
  clear-all
  create-turtles 100
  [ set value random-normal 0.5 0.1 ]
  plot-normalised
  reset-ticks
end

to plot-normalised
  let meanPlot mean [value] of turtles
  let varPlot variance [value] of turtles
  let mult (count turtles / 20)  / sqrt (2 * pi * varPlot)
  set-current-plot "Test"
  create-temporary-plot-pen "normal"
  set-plot-pen-color red
  plot-pen-down
  let stepper 0.025
  while [ stepper <= 1 ]
  [ plotxy stepper (mult * exp ( - ((stepper - meanPlot) ^ 2) / (2 * varPlot) ) )
    set stepper stepper + 0.05
  ]
end

基本上,此代码计算所绘制变量的均值和方差,并将步进器的特定值(即 x 坐标)提供给正态分布 pdf 函数以计算绘图的 y 值。

你必须为你的代码做的是用你想要绘制的变量的 minmax 之类的东西替换这段代码逐步通过的间隔 [0,1]。在mult值的计算中,可以看到count turtles / 20。这也需要更换。 20 是绘图间隔的长度(在本例中为 1)除以每个直方图条的宽度(在本例中为 0.05)。

因此代码的最后一点必须类似于:

let mymin min [value] of turtles
let mymax max [value] of turtles
let stepper mymin + 0.025
while [ stepper <= mymax ]
[ plotxy stepper (mult * exp ( - ((stepper - meanPlot) ^ 2) / (2 * varPlot) ) )
  set stepper stepper + 0.05
]