【问题标题】:List multiplication in NetLogoNetLogo 中的列表乘法
【发布时间】:2020-05-28 16:58:25
【问题描述】:

我正在模拟蚜虫在有花缘的农田中的分布情况。我有几个列表设置为补丁变量,如下所示:

set nl n-values 20 [0];; number of larvae per age (in days)    
set il n-values 20 [0.0001];; individual larvae growth per age (in days)    
set il_growth n-values 20 [0];; growth of larvae per age (in days)

我给出的值是 0.0001 而不是 0,因为之前我收到了关于 0 的错误。

每个时间戳都会发生以下情况:

to time
  set nl fput item 3 peggs nl ;every day the amount of 4 days old eggs are added to the number of larvae
  set il fput ((item dtl peggs) * weight_hatch) il ;the weight of the larvae that just hatched are calculated by multiplying nl by the weight they have when they hatch
  set il_growth (il * e ^ (g * (aphids)*(1 - (il / weight_max))));;growth individual predator larvae in every age class 
  set larvae nl * il_growth; the total biomass of al larvae in a patch
end

il_growth 的 for 来自文献,我知道 e、g、aphids 和 weight_max 等参数/变量不是问题,因为在我介绍 il 之前这个公式可以正常工作。

我还不确定生物质的方法是否是最好的方法(因为我将在下面描述 il 的错误),但我认为乘法是可能的,因为 nl 和 il 都是长度相同。

当我对代码进行语法检查时,它不会给出任何错误。但是当我运行它时,它会显示以下内容: * 预期输入是一个数字,但得到了列表 [0 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E -4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4] 代替。 它指向的 * 是 il_growth 公式中的第一个。

我认为这可能是因为代码需要 il 是数字而不是列表。然后我在谷歌上发现这可以通过函数'foreach'或'map'来解决。

用 foreach 我试过这个:

set il_growth foreach il (il * e ^ (g * (aphids)*(1 - (il / weight_max))))

这给出了错误“设置预期的 2 个输入”。我还用foreach 尝试了许多其他配置,但都没有成功。

用地图我试过这个:

set il_growth map report_il il

to-report report_il 
  report (il * e ^ (g * (aphids)*(1 - (il / weight_max))))
end

这给了我与以前相同的错误:* 预期输入是一个数字,但得到了列表 [0 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4]

【问题讨论】:

  • 我试图让您的问题可读。我格式化了代码并将一些冗长的评论移到了文本区域,以便代码可读。请检查问题是否仍然是您想要的。

标签: netlogo


【解决方案1】:

如果尝试没有帮助,我们不需要知道您尝试过的所有内容,只需了解您尝试修复的代码和问题描述即可。即使它们的长度相同,您也绝对不能简单地将列表相乘。这是一个完整的模型,会产生同样的错误信息:

to testme1
  let list1 [1 2 3]
  let list2 [4 5 6]
  print list1 * list2
end

如果您尝试将两个列表逐项相乘,那么您需要map。这是等效模型:

to testme2
  let list1 [1 2 3]
  let list2 [4 5 6]
  print (map * list1 list2)
end

所以,如果我理解了您的问题,请将set larvae nl * il 替换为set larvae (map nl * il)。如果这不能解决您的问题,请编辑您的问题以更清楚地确定您要解决的问题。

更新:供评论

好的,从您的评论来看,set il_growth (il * e ^ (g * (aphids)*(1 - (il / weight_max)))) 行抛出了错误。就像map 是乘法列表所必需的一样,它对于更复杂的算术也是必需的。您正在将列表 il 乘以具有一堆值(例如,g,蚜虫,weight_max)和运算符的东西,然后再次将列表 il 相乘。

尝试用这个替换(未经测试):

set il_growth map [ thisval -> thisval * e ^ (g * (aphids)*(1 - (thisval / weight_max)))) ] il

这个(有点)的作用是遍历列表 il,将当前项目提供给名为“thisval”的临时变量,并对单个值而不是列表进行计算。但它适用于整个列表。

【讨论】:

  • 感谢您的回复!您的解决方案肯定会防止将来计算幼虫时出现错误。但是我在计算 il_growth 时仍然遇到同样的问题。运行该模型会导致 il_growth ''* 预期输入为数字但得到列表 [0 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E- 4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0E-4 1.0 E-4] 代替。''。顺便说一句,我编辑了我原来的帖子,因为我看到我在那里犯了一个错误:larvae should be set larvae nl * il_growth
  • 同样的问题,稍微复杂一点的答案。查看更新以回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多