Izhikevich神经元是一种简单而有效的生物神经元模型,用于离散时间步进模拟。在这个高尔夫挑战中,你将实现这个模式。
该模型只涉及7个变量组织成2个微分方程,相比之下,几十个参数的生理精确模型。
v和u是神经元的两个状态变量。在这里,v是表示细胞电位随时间变化的“快速”变量,而u是表示某些膜特性的“慢”变量。v变量是最重要的变量,因为这是仿真的输出。a、b、c和d是描述神经元性质的固定常数。不同类型的神经元有不同的常数,这取决于所期望的行为。值得注意的是,c是复位电位,这是细胞膜电位后,细胞返回到尖峰。I表示神经元的输入电流。在网络模拟中,这将随着时间的推移而改变,但为了我们的目的,我们将I视为一个固定常数。模型
该模型具有非常简单的伪码。首先,我们获取abcd的常量值,并使用它们初始化v和u:
v = c
u = b * c接下来,我们按需要循环多次地遍历仿真代码。每次迭代代表1毫秒的时间。
for 1..t:
if v >= 30: # reset after a spike
v = c
u = u + d
v += 0.04*v^2 + 5*v + 140 - u + I
u += a * (b*v - u)
print v某些现实世界的实现包括额外的步骤,以提高数值的准确性,但我们这里不包括这些步骤。
作为输入,您的程序/函数应该采用a、b、c、d、I和t (模拟时间步骤的数量)的值。一旦设置,这些参数都不会在我们简单的模拟过程中改变。输入的顺序无关紧要:您可以指定程序接受这些参数的顺序。
输出将是在模拟过程中表示细胞膜电位(由变量v给出)的数字列表。列表可以是任何适当的格式。
您可以选择是否在输出中包含模拟的第0值(任何时间之前的初始配置)。例如,对于0.02 0.2 -50 2 10 6的输入(对于a b c d I t),输出的
-50
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068或
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068是可以接受的。
您的值不必与上面的值完全相同,这取决于您的语言处理浮动的方式。
下面是我用Perl编写的演示模型的TIO实现。这些参数是上述论文中的“抖振”神经元的参数,这说明了这个模型如何能够重现神经元的一些更复杂的特性,例如在高和低活动状态之间的交替。如果您查看输出,您可以看到神经元在哪里立即上升了几次,但随后等待了一段时间,然后再上升几次(尽管单元输入电压I始终是恒定的)。
发布于 2018-02-08 06:13:53
发布于 2018-02-08 04:56:19
发布于 2018-02-09 06:15:41
_a;_b;_3:b~*u;_d;_I;_'[3:\.04*5+*140+u~-+I~++4:\
.`30<!b~*u~-+a~*u~+[d~+]u;[#2:]]在网上试试!,Esolangs页面
_a;_b;_3:b~*u;_d;_I;_'[ ... ]程序的这一部分需要输入。它将常量a、b、d和I存储到变量中。c的输入从不存储在变量中,而是在整个执行过程中保持在主堆栈上。复制了三个副本:一个在顶部用于初始化u,一个在中间作为初始v,另一个在底部作为常量c。t的输入将立即抛到控制堆栈上,作为围绕程序其余部分的for循环( [...])的基础。
3:\.04*5+*140+u~-+I~++4:程序的这一部分获取v的当前值并计算新值,然后生成四份新的v值。
\
.`v的第一份副本附加了一个新行并打印出来。
30<!v的第二份拷贝用于测试神经元是否有尖峰。此测试的结果将放在控制堆栈上,供以后使用。
b~*u~-+a~*u~+这一部分计算“增量u",意思是要添加到u中的金额。
[d~+]如果神经元处于尖峰状态,则此IF块将d添加到上述和中。这将通常是两个任务合并成一个单独的任务。
u;这将存储u的更新值。
[#2:]此IF块是上述IF块的延续。如果神经元处于尖峰状态,请删除v的当前值(该值现在位于主堆栈的顶部),并将其替换为c的副本(该副本一直位于主堆栈的底部)。
这基本上就是全部了。一个次要的注意是,这个东西漏出了内存:在每个循环迭代之后,需要一个额外的"#来删除控制堆栈的顶部(评估的IF条件)。
虽然我不认为元素是最优雅的高尔夫语言,但这个挑战确实让我展示了一个有趣的特性:由于主堆栈和控制堆栈之间的分隔,我可以使用一个IF语句,将条件和身体分割成多个部分,并与无条件代码交织在一起。
https://codegolf.stackexchange.com/questions/155195
复制相似问题