经营性网站备案电子标识/河北seo诊断培训

经营性网站备案电子标识,河北seo诊断培训,搜索网站的浏览器,东营网站建设公司 网络易Hindmarsh-Rose 模型 目录 0. 写在前面 1. Hindmarsh-Rose 模型的定义 2. Hindmarsh-Rose 模型簇发放的动力学机制 3. Hindmarsh-Rose 模型的其他发放模式 4. 分析过程所用到的一系列 BrainPy 代码 0. 写在前面 前面介绍了: Hodgkin-Huxley Model 简化神经元模型1 – LIF M…

Hindmarsh-Rose 模型

目录

0. 写在前面
1. Hindmarsh-Rose 模型的定义
2. Hindmarsh-Rose 模型簇发放的动力学机制
3. Hindmarsh-Rose 模型的其他发放模式
4. 分析过程所用到的一系列 BrainPy 代码

0. 写在前面

前面介绍了:
Hodgkin-Huxley Model
简化神经元模型1 – LIF Model
简化神经元模型2 – QIF Model
简化神经元模型3 – ExpIF Model
简化神经元模型4 – AdEx Model
简化神经元模型5 – Izhikevich Model

下面继续介绍简化神经元模型,本篇博客主要是介绍 Hindmarsh-Rose 模型,并用BrainPy实现模型的定义、模拟和分析。

之前我们讨论了 AdEx 模型Izhikevich 模型,它们在原先单变量模型的基础上增加了一个变量,使得模型的动力学表征能力大大增强,能够模拟多种发放模式。不过,以上所有简化模型都需要在神经元发放动作电位后显式地将膜电位 V V V 重置,这破坏了变量的连续性。接下来我们将介绍一种神经元模型,它通过三个变量刻画神经元的动力学特征,且不再需要显示地重置膜电位。

HindMarsh 和 Rose 于 1984 年提出了 Hindmarsh-Rose 模型。他们在前人研究的双变量模型基础上增加了一个变量来模拟缓慢流入细胞的电流,以丰富神经元的动力学性质。Hindmarsh 和 Rose 最初希望利用该模型来解释簇发放现象,但他们发现这一模型也能产生适应、反弹簇发放等多种模式,因此可以将其视为一个较为通用的神经元模型。

资料参考 : 《神经计算建模实战》 吴思等 著

1. Hindmarsh-Rose 模型的定义

Hindmarsh-Rose 模型存在三个变量,分别为 x x x y y y z z z。它的数学表达形式如下: d x d t = y − a x 3 + b x 2 − z + I (1) \frac{dx}{dt} = y - ax^3 + bx^2 - z + I \tag{1} dtdx=yax3+bx2z+I(1) d y d t = c − d x 2 − y (2) \frac{dy}{dt} = c - dx^2 - y \tag{2} dtdy=cdx2y(2) d z d t = r [ s ( x − V r e s t ) − z ] (3) \frac{dz}{dt} = r [s (x - V_{rest}) - z] \tag{3} dtdz=r[s(xVrest)z](3)式中,变量 x x x 表示膜电位, y y y z z z 是两个门控变量, y y y 为快变量, z z z 为慢变量, z z z 的时间常数被 r r r 调节。参数 a a a b b b c c c d d d r r r s s s 均为正数。直观上看,Hindmarsh-Rose 模型方程中各项的意义不甚明确,但我们大致能看出 y y y x x x 起促进作用, x x x y y y 起抑制作用,从而形成了一个负反馈调节;此外, x x x z z z 之间也存在类似的反馈行为。在下文我们将详细讨论模型各个参数对神经元发放模式的影响。

模型定义好后,我们首先利用 BrainPy 构建一个 Hindmarsh-Rose 模型:

import brainpy as bp
import brainpy.math as bmclass HindmarshRose(bp.dyn.NeuDyn):def __init__(self, size, a=1., b=3., c=1., d=5., r=0.001, s=4., x_r=-1.6,theta=1.0, **kwargs):# 初始化父类super(HindmarshRose, self).__init__(size=size, **kwargs)# 初始化参数self.a = aself.b = bself.c = cself.d = dself.r = rself.s = sself.theta = thetaself.x_r = x_r# 初始化变量self.x = bm.Variable(bm.random.randn(self.num) + x_r)self.y = bm.Variable(bm.ones(self.num) * -10.)self.z = bm.Variable(bm.ones(self.num) * 1.7)self.input = bm.Variable(bm.zeros(self.num))self.spike = bm.Variable(bm.zeros(self.num, dtype=bool))  # 脉冲发放状态# 定义积分器self.integral = bp.odeint(f=self.derivative, method='exp_auto')def dx(self, x, t, y, z, Iext):return y - self.a * x * x * x + self.b * x * x - z + Iextdef dy(self, y, t, x):return self.c - self.d * x * x - ydef dz(self, z, t, x):return self.r * (self.s * (x - self.x_r) - z)# 将两个微分方程联合为一个,以便同时积分@propertydef derivative(self):return bp.JointEq([self.dx, self.dy, self.dz])def update(self,):t = bp.share['t']dt = bp.share['dt']x, y, z = self.integral(self.x, self.y, self.z, t, self.input, dt)  # 更新变量x, y, zself.spike.value = bm.logical_and(x >= self.theta, self.x < self.theta)  # 判断神经元是否发放脉冲self.x.value = xself.y.value = yself.z.value = zself.input[:] = 0.  # 重置外界输入

在构建好上述模型之后,我们首先来简单的可视化一下上述模型:

def run_HindmarshRose():group = HindmarshRose(10)runner = bp.DSRunner(group, monitors=['x', 'y', 'z'], inputs=('input', 2.), dt=0.01)runner(20)runner(1000)  # 再运行100msplt.figure(figsize=(6, 4))bp.visualize.line_plot(runner.mon.ts, runner.mon.x, legend='x', show=False)bp.visualize.line_plot(runner.mon.ts, runner.mon.y, legend='y', show=False)bp.visualize.line_plot(runner.mon.ts, runner.mon.z, legend='z', show=True)

可视化结果如下:
在这里插入图片描述
图3.25不仅展示了代码的运行结果(图3.25(a)),还将神经元动作电位集中发放阶段(20-200 ms)各个变量的变化情况放大显示了出来(图3.25(b))。

在簇发放模式下,神经元在短时间内快速多次发放动作电位,然后在较长时间内停止发放,并如此周期性重复。从图3.25中可以发现,在一个发放簇中, x x x y y y 都随时间快速大幅度变化;相比之下, z z z 的时间常数 1 / r 1/r 1/r 很大,变化也要平缓很多。正是由于快变量 y y y 和慢变量 z z z 的存在,神经元的膜电位才能在某一段时间内快速变化,在另一段时间内缓慢变化。我们将在下节通过动力学分析来探究 Hindmarsh-Rose 模型产生簇发放的原因。

2. Hindmarsh-Rose 模型簇发放的动力学机制

在探究 Hindmarsh-Rose 模型产生簇发放的原因之前,我们先讨论另一个问题:为什么 Hindmarsh-Rose 模型不需要显示地重置膜电位,膜电位自己就能快速上升和下降?

相平面分析无疑是一个很好的用于分析神经元发放模式的工具。当我们想观察两个变量在向量场中的运动时,我们可以把它们可视化到二维相平面图中。但 Hindmarsh-Rose 模型存在三个变量,可视化为三维相平面图并不够直观。有没有办法利用二维相平面来分析 Hindmarsh-Rose 模型呢?

在图3.25中我们已经发现,相对于 x x x y y y z z z 的变化非常平缓。即使在一个发放簇中, z z z 也没有明显的起伏。这让我们想到,在集中发放阶段,可以将 z z z 近似为一个恒定值,这样三变量模型就退化为双变量模型,我们就能进行二维相平面分析了。这种分析方法被称为快慢变量分离法,即根据变量的时间常数将它们分为快变量和慢变量,然后将慢变量作为分岔参数,进而研究慢变量的不同取值如何影响快系统的分岔行为。

固定 z = 1.8 z = 1.8 z=1.8,我们可以画出 x x x y y y 的相平面分析图:

  # 定义分析器model = HindmarshRose(1)phase_plane_analyzer = bp.analysis.PhasePlane2D(model=model,target_vars={'x': [-2, 3], 'y': [-13., 2.]},  # 待分析变量fixed_vars={'z': 1.8},  # 固定变量pars_update={'Iext': 2.},  # 需要更新的变量resolutions=0.01)# 画出向量场phase_plane_analyzer.plot_vector_field(plot_style=dict(color='lightgrey'))# 画出V, y的零增长曲线phase_plane_analyzer.plot_nullcline()# 画出固定点phase_plane_analyzer.plot_fixed_point()# 画出V, y的变化轨迹phase_plane_analyzer.plot_trajectory({'x': [1.], 'y': [0.]}, duration=100.,color='darkslateblue', linewidth=2, alpha=0.9)

在这里插入图片描述
相平面分析图如图3.26(b)所示,为后续分析,我们还额外添加了一些数字标记。图中,变量 x x x y y y 构成的轨迹在向量场中形成了一个封闭的圆环,轨迹点沿顺时针方向在环上运动。这种环被称为“极限环”(limit cycle),它表明变量在发生周期性的变化。对应到 Hindmarsh-Rose 模型, x x x y y y 在一个发放簇中反复升高和降低。和 AdEx 模型的相平面图相比,Hindmarsh-Rose 模型中膜电位的下降是极限环的一部分,而并非人为的重置

再来分析在一个极限环中 x x x y y y 随时间的变化为何能够产生尖峰。在 x x x y y y 随时间的变化图(图3.26(a))中,我们将一次发放分为三个阶段,起始点分别用“1”、“2”、“3”标记,并用虚线标示了 x x x y y y 在何处对齐。同时,我们也可以根据 x x x y y y 的值将这些标记点对应到相平面图上(图3.26(b))。在 1 → 2 阶段, x x x y y y 的轨迹十分靠近 x x x y y y 的零增长等值线,这使得轨迹点运动缓慢,因此 x x x y y y 的变化也较为平缓。当轨迹到达 2 时, y y y 达到最大值,形成尖峰。同时由于方程 (1) 中 y y y x x x 有促进作用,这在相平面图中表现为向量场的水平分量变大, x x x 也开始快速上升。此后向量场不断增强(图中表现为灰色箭头变粗),轨迹点移动速度变快, x x x 急速上升并达到最大值;与此同时, y y y 迅速下降,几乎在同时达到最小值,即图中的标记点 3。 x x x 的增加使得方程 (1) 中 − a x 3 + b x 2 -ax^3 + bx^2 ax3+bx2 的三次方项越发显著, d x / d t dx/dt dx/dt 由正转负,相平面图中膜电位快速下降至 1,同时伴随着 y y y 有一个小幅度的急速上升。由此,神经元完成了一个完整的发放。

值得注意的是,轨迹在 1 处有一个较大的转折,这不仅表现为方向的突变,也表现为速度大小的突变:轨迹点在越过近 x x x-零增长等值线前速度很大,越过之后速度迅速变小。这样一个由急到缓的突变构成了神经元在发放动作电位后的快速复极化和缓慢去极化的转折,在不人为重置的情况下非常好地模拟了真实神经元的膜电位变化。

在了解了 Hindmarsh-Rose 模型产生快速连续发放的原因之后,我们再来研究其在两个发放簇之间产生间隔的原因。根据图3.25(a),在变量 z z z 增加到一定值后,神经元就会停止快速发放,进入间隔期。 z z z 的增加会通过方程 (1) 影响 x x x 的微分,而不会影响 y y y 的微分。具体而言, x x x-零增长等值线的表达式为: − a x 3 + b x 2 + y − z + I = 0. (4) -ax^3 + bx^2 + y - z + I = 0. \tag{4} ax3+bx2+yz+I=0.(4) x x x 保持不变时, z z z 增大会使 y y y 也增大时,对应 x x x- y y y 相平面图中 x x x-零增长等值线上移。我们可以画出 z = 2.05 z = 2.05 z=2.05 的相平面图,并对比 z = 1.80 z = 1.80 z=1.80 的相平面图,观察 z z z 的上升会对系统的动力学性质带来怎样的影响。

图3.27显示, x x x-零增长等值线上移后,两条等值线由一个交点变为了三个,即系统出现了三个奇点。其中,除去原有的不稳定焦点 U U U 之外,系统多了一个鞍点 S S S 和稳定结点 E E E。当 z = 1.8 z = 1.8 z=1.8 时,轨迹点在越过 x x x-零增长等值线时并没有越过 y y y-零增长等值线,因此轨迹点速度的竖直分量仍然向上,轨迹能够围绕 U U U 形成极限环。但当鞍点 S S S 出现后,如果轨迹从 S S S 下方经过,则其越过了过 y y y-零增长等值线,速度的竖直分量变为向下,于是轨迹离开鞍点 S S S 并被稳定结点 E E E 吸引。这时神经元膜电位不再上升,也不会发放动作电位,于是形成了两个发放簇之间的间隔。如果 z z z 保持不变,则 ( x , y ) (x, y) (x,y) 将在点 E E E 趋于稳定;但由于间隔期 z z z 在不断下降,当 z z z 下降到足够低时,鞍点和稳定结点消失,轨迹点速度的竖直分量又变为朝上,极限环再次形成。只不过此时轨迹点的运动速度很小,所以需要一个较长的时间才能进入极限环并产生动作电位。所以,两次簇发放之间会有较长时间的间隔期。在这里插入图片描述

3. Hindmarsh-Rose 模型的其他发放模式

上节我们提到,Hindmarsh-Rose 模型最初被用来解释簇发放现象,但它也能模拟出其他的发放模式,如适应性发放,反弹簇发放等等。除此以外,Hindmarsh-Rose 还能产生一种独特的发放模式:触发簇发放(triggered repetitive firing)。该发放模式是指神经元在接受到一个脉冲电流之后,即使没有外部输入也能够重复多次发放的模式。它的 x , y , z − t x, y, z-t x,y,zt 图如图3.28所示。在这里插入图片描述
在理解了 Hindmarsh-Rose 簇发放的动力学原因后,触发簇发放也就不难理解了。在脉冲电流前后,外部电流输入都为 0,且作为慢变量的 z z z 在接收脉冲电流的这一段很短时间内的变化可以忽略不计,因此 x − y x-y xy 相平面图并不会发生改变。脉冲电流改变的是变量 x x x y y y 的值,我们可以理解为轨迹的起始点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 在相平面图中发生了平移(图3.29(a)和(b))。由于不稳定焦点、鞍点和稳定结点同时存在,轨迹既可能落入极限环,也可能被稳定结点吸引。在接收脉冲电流之前, ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 位于鞍点下方,落在稳定结点的吸引域,因此会朝稳定结点运动,最终稳定在稳定结点处。虽然图3.29(a)中轨迹的起始点的取值并不等于图3.28中 t < 40 m s t < 40ms t<40ms x x x y y y 的值,但轨迹仍朝向稳定结点运动,这说明较小的脉冲电流不足以触发动作电位的产生。而当脉冲电流足够大时, ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 移动到了鞍点上方(图3.29(b)中轨迹的起始点),轨迹能像簇发放一样形成一个极限环,使得神经元重复发放动作电位。在这里插入图片描述
当然,这里的相平面分析没有考虑 z z z 的变化。随着 z z z 的增大, x x x-零增长等值线上移,鞍点也将缓慢上移。某一次极限环的过程中,鞍点上升到了轨迹转折点的上方,则轨迹将在越过 y y y-零增长等值线后向下朝着稳定结点运动,神经元不再发放动作电位,簇发放停止。

4. 分析过程所用到的一系列 BrainPy 代码

将上述一系列定义模型代码和可视化代码全部给出:

import brainpy as bp
import brainpy.math as bm
import matplotlib.pyplot as pltplt.rcParams.update({"font.size": 15})
plt.rcParams['font.sans-serif'] = ['Times New Roman']class HindmarshRose(bp.dyn.NeuDyn):def __init__(self, size, a=1., b=3., c=1., d=5., r=0.001, s=4., x_r=-1.6,theta=1.0, **kwargs):# 初始化父类super(HindmarshRose, self).__init__(size=size, **kwargs)# 初始化参数self.a = aself.b = bself.c = cself.d = dself.r = rself.s = sself.theta = thetaself.x_r = x_r# 初始化变量self.x = bm.Variable(bm.random.randn(self.num) + x_r)self.y = bm.Variable(bm.ones(self.num) * -10.)self.z = bm.Variable(bm.ones(self.num) * 1.7)self.input = bm.Variable(bm.zeros(self.num))self.spike = bm.Variable(bm.zeros(self.num, dtype=bool))  # 脉冲发放状态# 定义积分器self.integral = bp.odeint(f=self.derivative, method='exp_auto')def dx(self, x, t, y, z, Iext):return y - self.a * x * x * x + self.b * x * x - z + Iextdef dy(self, y, t, x):return self.c - self.d * x * x - ydef dz(self, z, t, x):return self.r * (self.s * (x - self.x_r) - z)# 将两个微分方程联合为一个,以便同时积分@propertydef derivative(self):return bp.JointEq([self.dx, self.dy, self.dz])def update(self,):t = bp.share['t']dt = bp.share['dt']x, y, z = self.integral(self.x, self.y, self.z, t, self.input, dt)  # 更新变量x, y, zself.spike.value = bm.logical_and(x >= self.theta, self.x < self.theta)  # 判断神经元是否发放脉冲self.x.value = xself.y.value = yself.z.value = zself.input[:] = 0.  # 重置外界输入def run_HindmarshRose():group = HindmarshRose(10)runner = bp.DSRunner(group, monitors=['x', 'y', 'z'], inputs=('input', 2.), dt=0.01)runner(20)runner(1000)  # 再运行100msplt.figure(figsize=(6, 4))bp.visualize.line_plot(runner.mon.ts, runner.mon.x, legend='x', show=False)bp.visualize.line_plot(runner.mon.ts, runner.mon.y, legend='y', show=False)bp.visualize.line_plot(runner.mon.ts, runner.mon.z, legend='z', show=True)def bursting_firing():duration = 1200group = HindmarshRose(1)runner = bp.DSRunner(group, monitors=['x', 'y', 'z'], inputs=('input', 2.), dt=0.01)runner(duration)  # 再运行100msdef visualize(mon, duration, xim, text_pos):fig, gs = bp.visualize.get_figure(3, 1, 1.5, 6)ax = fig.add_subplot(gs[0, 0])plt.plot(mon.ts, mon.x, label='x')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.set_xticks([])plt.text(text_pos, (mon.x.max() + mon.x.min()) / 2, r'$x$')ax.set_xlim(*xim)ax = fig.add_subplot(gs[1, 0])plt.plot(mon.ts, mon.y, label='y')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.set_xticks([])plt.text(text_pos, (mon.y.max() + mon.y.min()) / 2, r'$y$')ax.set_xlim(*xim)ax = fig.add_subplot(gs[2, 0])plt.plot(mon.ts, mon.z, label='z')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)plt.text(text_pos, (mon.z.max() + mon.z.min()) / 2, r'$z$')ax.set_xlim(*xim)ax.set_xlabel(r'$t$ (ms)')visualize(runner.mon, duration=duration, xim=(-1, duration + 50), text_pos=duration)plt.savefig('HindmarshRoseModel_output1.pdf', transparent=True, dpi=500)from jax.tree_util import tree_mapvisualize(tree_map(lambda a: a[2000:20000], runner.mon), duration=200,xim=(19, 200 + 8), text_pos=25)plt.savefig('HindmarshRoseModel_output2.pdf', transparent=True, dpi=500)plt.show()def phase_plane_analysis():bp.math.enable_x64()group = HindmarshRose(1)group.x[:] = 1.runner = bp.DSRunner(group, monitors=['x', 'y', 'z'], inputs=('input', 2.), dt=0.01)runner(80)runner(80)  # 再运行100msfig, gs = bp.visualize.get_figure(2, 1, 2.25, 6)ax = fig.add_subplot(gs[0, 0])ax.set_ylabel(r'$x$')ax.set_xlim(80, 160)plt.plot(runner.mon.ts, runner.mon.x, color='tab:blue')plt.axvline(117.8, linestyle='--', color='gray')plt.axvline(135.05, linestyle='--', color='gray')plt.axvline(136.07, linestyle='--', color='gray')plt.text(118.1, -0.85, '1')plt.text(136.57, 1.608, '3')plt.text(137.34, -0.85, "1'")ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax = fig.add_subplot(gs[1, 0])plt.plot(runner.mon.ts, runner.mon.y, color='tab:orange')ax.set_ylabel(r'$y$')ax.set_xlim(80, 160)plt.axvline(117.8, linestyle='--', color='gray')plt.axvline(135.05, linestyle='--', color='gray')plt.axvline(136.07, linestyle='--', color='gray')plt.text(118.1, -4.32, '1')plt.text(132.1, 0.22, '2')plt.text(136.72, -6.21, '3')plt.text(137.34, -4.32, "1'")ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)plt.savefig('HindmarshRose_output123.pdf', transparent=True, dpi=500)fig, gs = bp.visualize.get_figure(1, 1, 4.5, 6)ax = fig.add_subplot(gs[0, 0])# 定义分析器model = HindmarshRose(1)phase_plane_analyzer = bp.analysis.PhasePlane2D(model=model,target_vars={'x': [-2, 3], 'y': [-13., 2.]},  # 待分析变量fixed_vars={'z': 1.8},  # 固定变量pars_update={'Iext': 2.},  # 需要更新的变量resolutions=0.01)# 画出向量场phase_plane_analyzer.plot_vector_field(plot_style=dict(color='lightgrey'))# 画出V, y的零增长曲线phase_plane_analyzer.plot_nullcline()# 画出固定点phase_plane_analyzer.plot_fixed_point()# 画出V, y的变化轨迹phase_plane_analyzer.plot_trajectory({'x': [1.], 'y': [0.]}, duration=100.,color='darkslateblue', linewidth=2, alpha=0.9)ax.get_legend().remove()plt.text(-1.185, -3.96, '1')plt.text(0.135, 0.92, '2')plt.text(1.836, -6.48, '3')plt.text(1.846, -0.78, 'x nullcline')plt.text(1.676, -10.9, 'y nullcline')plt.text(-0.805, -6.07, 'Trajectory')plt.annotate('unstable focus', xy=(0.6703567413201327, -1.246890802266034),xytext=(-0.415, -3), arrowprops=dict(arrowstyle="->"))ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)plt.savefig('HindmarshRose_ppa123.pdf', transparent=True, dpi=500)plt.show()def phase_plane_analysis_v2():bp.math.enable_x64()def analysis(x_range, y_range, z, extra_f=None, name=None):fig, gs = bp.visualize.get_figure(1, 1, 4.5, 6)ax = fig.add_subplot(gs[0, 0])# 定义分析器model = HindmarshRose(1)phase_plane_analyzer = bp.analysis.PhasePlane2D(model=model,target_vars={'x': x_range, 'y': y_range},  # 待分析变量fixed_vars={'z': z},  # 固定变量pars_update={'Iext': 2.},  # 需要更新的变量resolutions=0.01)# 画出向量场phase_plane_analyzer.plot_vector_field(plot_style=dict(color='lightgrey'))# 画出V, y的零增长曲线phase_plane_analyzer.plot_nullcline()# 画出固定点phase_plane_analyzer.plot_fixed_point()# 画出V, y的变化轨迹phase_plane_analyzer.plot_trajectory({'x': [1.], 'y': [0.]}, duration=100.,color='darkslateblue', linewidth=2, alpha=0.9)ax.get_legend().remove()if extra_f: extra_f()ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)if name:plt.savefig(name, transparent=True, dpi=500)def f():plt.text(1.846, -0.78, 'x nullcline')plt.text(1.676, -10.9, 'y nullcline')plt.text(-0.805, -6.07, 'Trajectory')plt.annotate('unstable focus', xy=(0.6703567413201327, -1.246890802266034),xytext=(-0.415, -3), arrowprops=dict(arrowstyle="->"))analysis(x_range=[-2, 3], y_range=[-15., 2.], z=1.8, extra_f=f)plt.show()def f():plt.text(-1.0334, -3.441, 'y nullcline')plt.text(-1.05, -4.863, 'x nullcline')plt.text(-0.9539, -4.355, 'Trajectory')analysis(x_range=[-1.2, -0.8], y_range=[-5., -3.], z=1.8, extra_f=f,name='HindmarshRose_I=1.8-v2.pdf')plt.show()def f():plt.text(1.846, -0.78, 'x nullcline')plt.text(1.676, -10.9, 'y nullcline')plt.text(-0.805, -6.07, 'Trajectory')plt.annotate('unstable focus', xy=(0.6040054794020179, -0.8241129286685903),xytext=(-0.415, -3), arrowprops=dict(arrowstyle="->"))plt.annotate('saddle node', xy=(-0.9521776294506809, -3.5332112027188076),xytext=(-1.856, -2.07), arrowprops=dict(arrowstyle="->"))plt.annotate('stable node', xy=(-1.6518281033863245, -12.642680671164262),xytext=(-1.125, -11.58), arrowprops=dict(arrowstyle="->"))analysis(x_range=[-2, 3], y_range=[-15., 2.], z=2.05, extra_f=f,name='HindmarshRose_I=2.05-v1.pdf')plt.show()def f():plt.text(-0.9831, -3.209, 'y nullcline')plt.text(-1.178, -4.863, 'x nullcline')plt.text(-0.9530, -4.095, 'Trajectory')plt.annotate('saddle node', xy=(-0.9521957298446758, -3.5333742767571485),xytext=(-0.9179, -3.755), arrowprops=dict(arrowstyle="->"))analysis(x_range=[-1.2, -0.8], y_range=[-5., -3.], z=2.05, extra_f=f,name='HindmarshRose_I=2.05-v2.pdf')plt.show()def bifurcation_analysis():bp.math.enable_x64()model = HindmarshRose(1)bif = bp.analysis.Bifurcation2D(model=model,target_vars={'x': [-2, 2], 'y': [-20, 5]},fixed_vars={'z': 1.8},target_pars={'Iext': [0., 2.5]},resolutions={'Iext': 0.01})bif.plot_bifurcation(show=True)def bursting_analysis():group = HindmarshRose(1)group.x[:] = -1.6046805group.y[:] = -11.875047group.z[:] = -0.01800228inputs, duration = bp.inputs.section_input([0., 2., 0.], [40, 10, 200], return_length=True)runner = bp.DSRunner(group, monitors=['x', 'y', 'z'], inputs=('input', inputs, 'iter'), dt=0.01)runner.run(duration)fig, gs = bp.visualize.get_figure(3, 1, 1.5, 6)ax = fig.add_subplot(gs[0, 0])plt.plot(runner.mon.ts, runner.mon.x, color='tab:blue')ax.set_ylabel(r'$x$')ax = fig.add_subplot(gs[1, 0])plt.plot(runner.mon.ts, runner.mon.y, color='tab:orange')ax.set_ylabel(r'$y$')ax = fig.add_subplot(gs[2, 0])plt.plot(runner.mon.ts, runner.mon.z, color='tab:brown')ax.set_ylabel(r'$z$')plt.show()def triggered_bursting():I, duration = bp.inputs.section_input([0, 2., 0], [40, 5, 400], return_length=True, dt=0.01)model = HindmarshRose(1, s=0.5)model.x[:] = model.x_rmodel.y[:] = -12.model.z[:] = 0.runner = bp.DSRunner(model, inputs=(model.input, I, 'iter'), monitors=list('xyz'), dt=0.01)runner.run(duration)fig, gs = bp.visualize.get_figure(3, 1, 1.5, 8)ax = fig.add_subplot(gs[0:2, 0])plt.plot(runner.mon.ts, runner.mon.x, label='x')plt.plot(runner.mon.ts, runner.mon.y, linestyle='dashed', label='y')plt.plot(runner.mon.ts, runner.mon.z, linestyle='dotted', label='z')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)plt.legend()plt.xlim(-1, duration + 1)ax = fig.add_subplot(gs[2, 0])plt.plot(runner.mon.ts, bm.as_numpy(I))plt.xlim(-1, duration + 1)plt.ylabel(r'$I$')plt.xlabel(r'$t$ (ms)')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)plt.savefig('HindmarshRose_triggered_bursting.pdf', transparent=True, dpi=500)plt.show()def triggered_bursting_ppa():bp.math.enable_x64()def analysis(x_range, y_range, z, init_xy=None, extra_f=None, name=None):fig, gs = bp.visualize.get_figure(1, 1, 4.5, 6)ax = fig.add_subplot(gs[0, 0])# 定义分析器model = HindmarshRose(1, s=0.5)phase_plane_analyzer = bp.analysis.PhasePlane2D(model=model,target_vars={'x': x_range, 'y': y_range},  # 待分析变量fixed_vars={'z': z},  # 固定变量pars_update={'Iext': 0.},  # 需要更新的变量resolutions=0.01)# 画出向量场phase_plane_analyzer.plot_vector_field(plot_style=dict(color='lightgrey'))# 画出V, y的零增长曲线phase_plane_analyzer.plot_nullcline()# 画出固定点phase_plane_analyzer.plot_fixed_point()# 画出V, y的变化轨迹if init_xy is not None:phase_plane_analyzer.plot_trajectory({'x': [init_xy[0]], 'y': [init_xy[1]]},duration=100., color='darkslateblue',linewidth=2, alpha=0.9, dt=0.01)ax.get_legend().remove()if extra_f:extra_f()ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)if name:plt.savefig(name, transparent=True, dpi=500)def f():plt.text(1.5, -9.8, 'y nullcline')plt.text(1.13, -2, 'x nullcline')plt.text(-0.575, -7.76, 'Trajectory')plt.annotate('stable node', xy=(-1.6320958395541862, -12.318684344410208),xytext=(-1, -12.318684344410208), arrowprops=dict(arrowstyle="->"))plt.annotate('saddle node', xy=(-0.9803837299517475, -3.8057584936177298),xytext=(-0.485, -2.5), arrowprops=dict(arrowstyle="->"))plt.annotate('unstable focus', xy=(0.6124732604697042, -0.8756173672185038),xytext=(0.8, 0.6), arrowprops=dict(arrowstyle="->"))analysis([-2, 3], [-13., 2.], z=0.02, extra_f=f, init_xy=(1.4, -10.),name='HindmarshRose_triggered_bursting_ppa1.pdf')def f():plt.text(1.5, -9.8, 'y nullcline')plt.text(1.73, -2, 'x nullcline')plt.text(-0.145, -3.5, 'Trajectory')plt.annotate('stable node', xy=(-1.6320958395541862, -12.318684344410208),xytext=(-1, -12.318684344410208), arrowprops=dict(arrowstyle="->"))plt.annotate('saddle node', xy=(-0.9803837299517475, -3.8057584936177298),xytext=(-0.685, -6.3), arrowprops=dict(arrowstyle="->"))plt.annotate('unstable focus', xy=(0.6124732604697042, -0.8756173672185038),xytext=(0.8, 0.6), arrowprops=dict(arrowstyle="->"))analysis([-2, 3], [-13., 2.], z=0.02, extra_f=f, init_xy=(-0.7, -3),name='HindmarshRose_triggered_bursting_ppa2.pdf')plt.show()if __name__ == '__main__':run_HindmarshRose()bursting_firing()phase_plane_analysis()phase_plane_analysis_v2()bifurcation_analysis()bursting_analysis()triggered_bursting()triggered_bursting_ppa()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六届电气、电子信息与通信工程国际学术会议 (EEICE 2025)

重要信息 官网&#xff1a;www.eeice.net&#xff08;点击了解参会投稿等&#xff09; 时间&#xff1a;2025年4月18-20日 地点&#xff1a;中国-深圳技术大学 简介 第六届电气、电子信息与通信工程 (EEICE 2025&#xff09;将于2025年4月18-20日在中国深圳召开。 EEICE 20…

计算机操作系统(三) 操作系统的特性、运行环境与核心功能(附带图谱更好对比理解))

计算机操作系统&#xff08;三&#xff09; 操作系统的特性、运行环境与核心功能 前言一、操作系统的基本特性1.1 并发1.2 共享1.3 虚拟1.4 异步 二、操作系统的运行环境2.1 硬件支持2.2 操作系统内核2.3 处理机的双重工作模式2.4 中断与异常 三、操作系统的主要功能3.1 处理机…

批量将 PPT 转换为PDF/XPS/JPG图片等其它格式

PPT 文档经常有转换为其它格式的需求&#xff0c;比如将 PPT 转换为 PDF、将 PPT 转换为图片、生成 PPT 预览图等&#xff0c;这在某些场景下非常的有用&#xff0c;今天给大家介绍的就是如何批量将 PDF 转换为 PDF、JPG、Tiff 等多种格式的操作。 在工作中我们经常需要接触 PP…

【css酷炫效果】纯CSS实现3D翻转卡片动画

【css酷炫效果】纯CSS实现3D翻转卡片动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90490472 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&am…

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库&#xff1f;② 创建目…

OpenCV图像拼接(1)概述

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类&#xff0c;可以配置/移除某些步骤&#xff0c;即根据特定需求调整拼接流程。流程中的所…

Linux 音频驱动 WM8960 音频 DAC IC 音乐播放与录音

这些先引出一个内容&#xff0c;是 Linux 内核的音频系统&#xff0c;ALSA&#xff0c;提供了对声卡的低级访问&#xff0c;支持 PCM&#xff0c;播放/录音、混音、MIDI 处理等功能。它取代了旧的 OSS&#xff0c;并提供更强大的功能和更好的硬件支持。 ALSA 主要特点&#xf…

OpenHarmony 开源鸿蒙北向开发——3.配置SDK

安装、配置完成之后我们就要配置SDK。 我们创建工程后&#xff0c;点击右上角设置 进入设置 进入OpenHarmony SDK&#xff0c;选择编辑 这里配置一下SDK安装位置 点击完成 这里我们API版本勾选第一个即可 确认安装 勾选接受 这里要等一会 安装完成后&#xff0c;点击完成

C#通过API接口返回流式响应内容---SignalR方式

1、背景 在上两篇《C#通过API接口返回流式响应内容—分块编码方式》和《C#通过API接口返回流式响应内容—SSE方式》实现了流式响应的内容。 上面的这两个主要是通过HTTP的一些功能&#xff0c;除了这些之外&#xff0c;还有WebSocket的方式。C#中的WebSocket的有比较多的方案&…

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…

第六:go 操作 redis-go

Redis 在项目开发中redis的使用也比较频繁&#xff0c;本文介绍了Go语言中go-redis库的基本使用。 Redis介绍 Redis是一个开源的内存数据库&#xff0c;Redis提供了多种不同类型的数据结构&#xff0c;很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外&am…

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…

NFS共享搭建

准备工作 首先确保已经建了两台虚拟机&#xff0c;都是桥接模式&#xff0c;一台是windows server 2019 一台是centos7 用户配额教程,是在windows server 2019中&#xff0c;先新建虚拟池&#xff0c;然后创建虚拟磁盘&#xff0c;记得添加磁盘类型要选择第三个&#xff0c;要不…

DFT mode下hard phy STA Nopath

hard Phy boundary No Path 1. shift mode; shift cornor出现No Path的; PHY SI SO在shift mode必须有timing的path; 展示为No constrained path; check step: report_timing -though NO constrained path set timing_report_unconstrained true report again you will…

【工作记录】F12查看接口信息及postman中使用

可参考 详细教程&#xff1a;如何从前端查看调用接口、传参及返回结果&#xff08;附带图片案例&#xff09;_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2&#xff1a;http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…

《自然》:陆地蒸散量研究的统计失误被撤回-空间加权平均的计算方法

文章目录 前言一、空间加权平均的计算方法二、代码1.Python 实现2.MATLAB代码 前言 In this article, we calculated global land evapotranspiration for 2003 to 2019 using a mass-balance approach. To do this, we calculated evapotranspiration as the residual of the…

开源软件许可证冲突的原因和解决方法

1、什么是开源许可证以及许可证冲突产生的问题 开源软件许可证是一种法律文件&#xff0c;它规定了软件用户、分发者和修改者使用、复制、修改和分发开源软件的权利和义务。开源许可证是由软件的版权所有者&#xff08;通常是开发者或开发团队&#xff09;发布的&#xff0c;它…

【el-upload】el-upload组件 - list-type=“picture“ 时,文件预览展示优化

目录 问题图el-upload预览组件 PicturePreview效果展示 问题图 el-upload <el-uploadref"upload"multipledragaction"#":auto-upload"false":file-list"fileList"name"files":accept".png,.jpg,.jpeg,.JGP,.JPEG,.…

微前端 qiankun vite vue3

文章目录 简介主应用 qiankun-main vue3 vite子应用 qiankun-app-vue2 webpack5子应用 qiankun-react webpack5子应用 quankun-vue3 vite遇到的问题 简介 主要介绍以qiankun框架为基础&#xff0c;vite 搭建vue3 项目为主应用&#xff0c;wepack vue2 和 webpack react 搭建的…