对应实验:lessons/08_spatial_neuron.py
输出图片:outputs/08_spatial_neuron.png
前七章都假设一个神经元只有一个状态 v。
这叫点神经元近似:
整个细胞在任意时刻共享同一个膜电位。
它适合研究:
- 大型网络活动。
- 脉冲时序。
- 简化突触整合。
但真实神经元有树突、胞体和轴突。远端树突上的输入传到胞体时会:
- 衰减。
- 延迟。
- 与局部通道相互作用。
当空间位置本身是研究问题时,需要多区室模型。
把一段神经突想象成一根带漏电膜的电缆。
电流有两条路:
- 沿细胞内部向相邻位置传播。
- 穿过细胞膜泄漏到外部。
因此某一位置的电压变化不仅取决于本地膜电流,也取决于邻近位置电压差产生的轴向电流。
连续空间中的电缆方程本质上是偏微分方程,因为 v 同时依赖:
时间 t
空间位置 x
计算机通常把形态切成有限区室,每个区室有一个近似均匀的电压,再计算相邻区室间电流。
代码:
morphology = Cylinder(
length=200 * um,
diameter=2 * um,
n=20,
)这是一根:
- 长度 200 μm。
- 直径 2 μm。
- 分成 20 个区室。
每个区室长度约:
200 μm / 20 = 10 μm
n 越大:
- 空间分辨率越高。
- 每个区室内“电压均匀”的近似越合理。
- 计算量和内存增加。
与时间步一样,区室数量也应做收敛检查。
区室的:
- 长度。
- 直径。
- 表面积。
- 横截面积。
- 连接拓扑。
都会影响电学行为。
例如直径增大时:
- 轴向电阻通常降低。
- 电流更容易沿内部传播。
- 膜面积也会改变。
因此“把直径改大”不是只让示意图变粗,而是在改变模型物理性质。
代码:
gL = 1e-4 * siemens / cm**2
EL = -70 * mV其中:
- gL:单位面积漏电导。
- EL:漏电反转电位。
膜电流密度:
Im = gL * (EL - v)
单位检查:
siemens/meter² * volt
= amp/meter²
所以方程声明:
Im : amp/meter**2
这里的 Im 是单位膜面积上的电流,不是整个区室的总电流。
如果:
v > EL
则:
EL-v < 0
漏电流方向会把 v 拉回 EL。
如果:
v < EL
则电流方向相反,同样把 v 拉向 EL。
因此 EL 是没有其他输入时的稳定电位。
本章初始化:
neuron.v = EL如果不注入电流,所有区室都应保持在 -70 mV。
代码:
neuron = SpatialNeuron(
morphology=morphology,
model=...,
Cm=1 * ufarad / cm**2,
Ri=150 * ohm * cm,
method="exponential_euler",
)你只提供:
- 形态。
- 膜电流模型 Im。
- 比膜电容 Cm。
- 细胞内电阻率 Ri。
Brian2 根据形态与 Ri 自动构造相邻区室之间的耦合。
比膜电容表示单位面积膜能储存多少电荷。
Cm 越大,同样电流引起电压变化越慢。
轴向电阻率描述细胞内部电流传播阻力。
Ri 越大,远距离传播更困难,空间衰减通常更强。
模型:
Im = gL*(EL-v) : amp/meter**2
I : amp (point current)
Im 是电流密度,作用于每个区室的膜面积。
I 是总电流,单位 amp,并标记:
(point current)
这告诉 SpatialNeuron:
I 是注入某个区室的总电流,请根据区室面积正确纳入膜方程。
如果把一个总电流错误声明为电流密度,改变区室划分后结果可能完全不一致。
这是多区室模型中最容易犯的单位错误之一。
neuron.I[0] = 0.1 * nA所有其他区室的 I 默认是 0。
这相当于在电缆一端放置电极。
随后电压变化通过轴向电流传播到:
- 5 号区室。
- 10 号区室。
- 19 号远端区室。
这样可以直接观察距离对响应的影响。
注入端 0 号区室:
- 直接接收电流。
- 电压变化最快、幅度最大。
中间区室:
- 通过相邻区室间接接收电流。
- 响应更慢、幅度更小。
远端 19 号区室:
- 距离最远。
- 衰减和延迟最明显。
因此四条曲线应按空间距离形成有序梯度,而不是随机排列。
state = StateMonitor(
neuron,
"v",
record=[0, 5, 10, 19],
)记录结果的行:
| StateMonitor 行 | 原区室编号 |
|---|---|
| 0 | 0 |
| 1 | 5 |
| 2 | 10 |
| 3 | 19 |
所以绘图使用:
for row, compartment in enumerate([0, 5, 10, 19]):
plt.plot(state.t/ms, state.v[row]/mV, ...)不能写 state.v[19],因为 Monitor 只记录了 4 行。
state.v[row] 是带单位的 Brian2 Quantity。
state.v[row] / mV得到以毫伏为刻度的普通数值。
例如内部值 -0.07 volt:
-0.07 volt / millivolt = -70
这不会改变数据,只改变绘图时使用的单位尺度。
轴标签必须与转换一致:
plt.ylabel("membrane potential (mV)")0.1 nA 看上去很小,但区室本身也非常小。
电流密度取决于:
总电流 / 区室膜面积
对细直径、短区室而言,同样的点电流可能对应很强的局部驱动。
所以不要只看 nA 的数字判断输入“强不强”。必须同时考虑:
- 注入位置。
- 区室面积。
- 膜电导。
- 膜电容。
- 仿真时长。
SpatialNeuron 并不自动意味着“完整生物神经元”。
本章只定义了被动漏电流:
Im = gL*(EL-v)
没有:
- 钠通道。
- 钾通道。
- 阈值与 reset。
- 主动树突通道。
因此这是被动电缆响应实验,不是动作电位传播模型。
要模拟主动传导,需要在 Im 中加入电压门控离子通道动力学。
尝试 n=10、20、40。
如果关键位置电压随 n 增大逐渐稳定,说明空间离散接近收敛。
比较时要注意:
- 区室索引代表的位置会变化。
- 应按实际距离选择记录点。
- point current 会由 Brian2按区室面积处理。
不能只看脚本是否运行成功。空间模型必须检查离散精度。
这些区室属于同一个 SpatialNeuron,并通过轴向电流耦合。
本例中 I 是总点电流,Im 是膜电流密度,单位和物理含义都不同。
分辨率提高但计算更贵;超过收敛需求后继续增加没有必要。
几何、Ri、gL、Cm、边界条件和分支结构都会影响传播。
它负责空间电缆耦合;具体膜电流仍由你定义。
测试 50、150、300 ohm*cm,预测远端响应怎样变化。
测试 1、2、4 μm。讨论轴向传播和膜面积同时变化的影响。
把电流注入 10 号区室,记录两端响应,观察空间对称性和边界影响。
用实际空间位置而不是固定索引比较 n=10、20、40 的结果。
让 I 只在某个时间窗开启,观察充电和放电过程。
点神经元假设:
一个细胞 -> 一个 v
多区室模型假设:
一个细胞 -> 多个空间区室 -> 多个相互耦合的 v
SpatialNeuron 根据形态、Cm 和 Ri 处理轴向耦合,你负责定义膜电流和外部输入。
下一章回到方程表达能力,学习怎样组合 Equations、使用子表达式并定义不等同于 spike 的自定义事件。