Netlogo中的表函数/插值

Netlogo中的表函数/插值,netlogo,Netlogo,我正在Netlogo中将一些系统动力学模型(即股票和流动模型)与基于代理的模型相结合并重写 系统动力学模型通常包括用于描述非线性关系的表函数。如果我们有两个连续变量x和y,并且我们知道近似关系是(x=0,y=100;x=1,y=50;x=2,y=45,x=3,y=40;x=4,y=35),我们可以使用插值来找到x的任何值的y值。例如,在R中,可以使用appoxfun()函数 在不了解因果机制并在模型中对其进行编码的情况下,是否有办法在Netlogo中解决这些关系?我在网上搜索了很多资源,但没有找

我正在Netlogo中将一些系统动力学模型(即股票和流动模型)与基于代理的模型相结合并重写

系统动力学模型通常包括用于描述非线性关系的表函数。如果我们有两个连续变量x和y,并且我们知道近似关系是(x=0,y=100;x=1,y=50;x=2,y=45,x=3,y=40;x=4,y=35),我们可以使用插值来找到x的任何值的y值。例如,在R中,可以使用appoxfun()函数

在不了解因果机制并在模型中对其进行编码的情况下,是否有办法在Netlogo中解决这些关系?我在网上搜索了很多资源,但没有找到多少


谢谢你的帮助

没有现有的函数。但是,构造一个可以调用的插值函数很简单。此版本执行线性插值,并通过报告适当的结束y值来处理指定x值范围之外的值。在列表函数(如reduce)方面比我更好的人可能会找到一种更优雅的方法

to-report calc-piecewise [#xval #xList #yList]
  if not (length #xList = length #ylist)
  [ report "ERROR: mismatched points"
  ]
  if #xval <= first #xList [ report first #yList ]
  if #xval >= last #xList [ report last #yList ]
  ; iterate through x values to find first that is larger than input x
  let ii 0
  while [item ii #xlist <= #xval] [ set ii ii + 1 ]
  ; get the xy values bracketing the input x
  let xlow item (ii - 1) #xlist
  let xhigh item ii #xlist
  let ylow item (ii - 1) #ylist
  let yhigh item ii #ylist
  ; interpolate
  report ylow + ( (#xval - xlow) / (xhigh - xlow) ) * ( yhigh - ylow )  
end

to testme
  let xs [0 1 2 3 4]
  let ys [100 50 30 20 15]
  print calc-piecewise 1.5 xs ys
end
逐段报告计算[#xval#xList#yList]
如果不是(长度#xList=长度#ylist)
[报告“错误:不匹配的点”
]
如果#xval=last#xList[报告last#yList]
; 迭代x值以查找第一个大于输入x的值
让我们0

虽然[第二项]列出了谢谢,但我要试一试!