Умножение списков в NetLogo - PullRequest
1 голос
/ 28 мая 2020

Я моделирую распространение журчалок на зараженном тлей посевном поле с цветочными краями. У меня есть несколько списков, которые настроены как переменные патча следующим образом:

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

for il_growth взято из литературы, и я знаю, что параметры / переменные, такие как 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 должно быть число, а не список. Затем я обнаружил в Google, что это можно исправить с помощью функций 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].

1 Ответ

2 голосов
/ 29 мая 2020

Нам не нужно знать все, что вы пробовали, если попытка не помогла, достаточно просто понять код, который вы пытаетесь исправить, и описание проблемы. Вы определенно не можете просто умножать списки, как у вас, даже если они одинаковой длины. Это полная модель, которая будет генерировать то же сообщение об ошибке:

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). Если это не решит вашу проблему, отредактируйте свой вопрос, чтобы более четко определить, что вы пытаетесь решить.

UPDATE: для комментария

Хорошо, из вашего комментария, строка set il_growth (il * e ^ (g * (aphids)*(1 - (il / weight_max)))) выдает ошибку. Подобно тому, как map необходим для умножения списков, он необходим для более сложной арифметики c. Вы умножаете список il на что-то с кучей значений (e, g, aphids, weight_max) и операторами и снова со списком il.

Попробуйте заменить на это (непроверено):

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

То, что этот (своего рода) делает, - это прогоняется по списку il, передавая текущий элемент временной переменной с именем thisval, и выполняет вычисления для отдельного значения, а не для списка. Но это касается всего списка.

...