NetLogo中的列表乘法

NetLogo中的列表乘法,netlogo,Netlogo,我正在用花缘模拟蚜虫出没的农田中气垫蝇的分布。我有几个列表设置为补丁变量,如下所示: 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)

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

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_生长的公式来自于文献,我知道参数/变量,如e、g、aphids和weight_max不是问题,因为在我介绍il之前,这个公式运行良好

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

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

我认为这可能是因为代码需要il是一个数字而不是一个列表。然后我在谷歌上发现,这可以通过函数“foreach”或“map”来修复

我用foreach试过这个:

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

to-report report_il 
  report (il * e ^ (g * (aphids)*(1 - (il / weight_max))))
end
这导致错误“设置预期的2个输入”。我还使用
foreach
尝试了许多其他配置,但都不起作用

使用map,我尝试了以下方法:

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

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

这给了我和以前一样的错误:*预期输入是一个数字,但得到了列表
[01.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-411.0E-41.0E-4]
如果您没有尝试过,我们不需要帮助的话,我们可以尝试一下,只需理解您试图修复的代码和问题的描述即可。即使列表长度相同,也不能简单地按现有方式进行乘法。这是一个完整的模型,将生成相同的错误消息:

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
因此,如果我理解了您的问题,请将
设置幼虫nl*il
替换为
设置幼虫(映射nl*il)
。如果这不能解决您的问题,请编辑您的问题,以更清楚地确定您正试图解决的问题

更新:请发表评论

好的,从你的评论来看,
set-il\u-growth(il*e^(g*(蚜虫)*(1-(il/weight\u-max))
一行抛出了错误。就像列表相乘需要
map
一样,更复杂的算法也需要它。您将列表il乘以一组值(例如,aphids、weight_max)和运算符,然后再次乘以列表il

尝试用以下内容替换(未测试):


这(排序)是通过列表il运行的,将当前项赋予名为“thisval”的临时变量,并对单个值而不是列表进行计算。但它适用于整个列表。

我试图让你的问题更具可读性。我格式化了代码,并将一些冗长的注释移到了文本区域中,这样代码才可读。请检查问题是否仍然是您想要的。谢谢您的回复!您的解决方案肯定会防止在计算过程中出现错误。然而,我在计算il_增长时仍然存在同样的问题。运行该模型会导致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.0E-4 1.0E-4 1.0E-4 1.0E-4”。顺便说一句,我编辑了我的原始帖子,因为我发现我在那里犯了一个错误:幼虫应该被设置为幼虫nl*il_生长同样的问题,答案稍微复杂一些。请参阅更新以获得答案