模拟两个神经元的连接,突触前神经元分别传递兴奋性和抑制性信号给突触后神经元(神经元模型使用HH方程)

一、实验内容

模拟两个神经元的连接,突触前神经元分别传递兴奋性和抑制性信号给突触后神经元。

二、实验结果:

兴奋性:

​​​​​​​

 

图 1 兴奋性

抑制性:

 

图 2 抑制性

  • 代码

运行mimi.py,其中type为0是抑制性,type为1是兴奋性

Neuron.py

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 29 19:19:23 2022

@author: dell2
"""
import numpy as np
import matplotlib.pyplot as plt
from Synapsis import Synapsis as Syn
 
class Neuron():
    def __init__(self, I):
        self.gl = 0.3
        self.gk = 36.0
        self.gna = 120.0
        self.El = -54.4
        self.Ek = -77.0
        self.Ena = 50.0
        self.Cm = 1.0
        self.V0 = -65.0
 
        self.step = 0.01
        self.iter = int(100/self.step)
        self.I = I
        self.t = np.zeros(int(self.iter)+1)
        self.V = np.zeros(int(self.iter)+1)
        self.V[0] = self.V0
        self.am = 0.1 * (self.V[0] + 40) / (1 - np.exp(-(self.V[0] + 40) / 10))
        self.bm = 4 * np.exp(-(self.V[0] + 65) / 18)
        self.ah = 0.07 * np.exp(-(self.V[0] + 65) / 20)
        self.bh = 1 / (np.exp(-(self.V[0] + 35) / 10) + 1)
        self.an = 0.01 * (self.V[0] + 55) / (1 - np.exp(-(self.V[0] + 55) / 10))
        self.bn = 0.125 * np.exp(-(self.V[0] + 65) / 80)
 
        self.m = self.am / (self.am + self.bm)
        self.h = self.ah / (self.ah + self.bh)
        self.n = self.an / (self.an + self.bn)
 
    def oula(self):
        for i in range(int(self.iter)):
            self.t[i] = i * self.step  
            self.V[i + 1] = self.V[i] + self.step * (
                        (-self.gl * (self.V[i] - self.El) - self.gna * self.m ** 3 * self.h * (self.V[i] - self.Ena)
                         - self.gk * self.n ** 4 * (self.V[i] - self.Ek) + self.I[i]) / self.Cm)
            
            self.am = 0.1 * (self.V[i + 1] + 40) / (1 - np.exp(-(self.V[i + 1] + 40) / 10))
            self.bm = 4 * np.exp(-(self.V[i + 1] + 65) / 18)
            self.ah = 0.07 * np.exp(-(self.V[i + 1] + 65) / 20)
            self.bh = 1 / (np.exp(-(self.V[i + 1] + 35) / 10) + 1)
            self.an = 0.01 * (self.V[i + 1] + 55) / (1 - np.exp(-(self.V[i + 1] + 55) / 10))
            self.bn = 0.125 * np.exp(-(self.V[i + 1] + 65) / 80)
            
            self.m = self.m + self.step * (self.am * (1 - self.m) - self.bm * self.m)
            self.h = self.h + self.step * (self.ah * (1 - self.h) - self.bh * self.h)
            self.n = self.n + self.step * (self.an * (1 - self.n) - self.bn * self.n)
 
        return self.t[0:self.iter], self.V[0:self.iter]
 
       
 
    def spike(self,type):
        ts = []
        for i in range(int(self.iter)):
            self.t[i] = i * self.step  
            self.V[i + 1] = self.V[i] + self.step * (
                        (-self.gl * (self.V[i] - self.El) - self.gna * self.m ** 3 * self.h * (self.V[i] - self.Ena)
                         - self.gk * self.n ** 4 * (self.V[i] - self.Ek) + self.I[i]) / self.Cm)
            self.am = 0.1 * (self.V[i + 1] + 40) / (1 - np.exp(-(self.V[i + 1] + 40) / 10))
            self.bm = 4 * np.exp(-(self.V[i + 1] + 65) / 18)
            self.ah = 0.07 * np.exp(-(self.V[i + 1] + 65) / 20)
            self.bh = 1 / (np.exp(-(self.V[i + 1] + 35) / 10) + 1)
            self.an = 0.01 * (self.V[i + 1] + 55) / (1 - np.exp(-(self.V[i + 1] + 55) / 10))
            self.bn = 0.125 * np.exp(-(self.V[i + 1] + 65) / 80)
            self.m = self.m + self.step * (self.am * (1 - self.m) - self.bm * self.m)
            self.h = self.h + self.step * (self.ah * (1 - self.h) - self.bh * self.h)
            self.n = self.n + self.step * (self.an * (1 - self.n) - self.bn * self.n)
 
            
            if i != 0:
                if self.V[i] > self.V[i-1] and self.V[i] > self.V[i+1]:
                    ts.append(self.t[i])
        I,g,t = Syn(type, ts, self.step).oula()
        return I,g,t
        

Synapsis.py

# -*- coding: utf-8 -*-
"""
Created on Fri Sep 30 15:47:51 2022

@author: dell2
"""
import numpy as np
 
class Synapsis():
    def __init__(self, type, ts, step):
        self.type = type
        self.ts = ts
        if type == 1:
            self.Esyn = 0 # 抑制性的为-50 兴奋性的为0
        else:
            self.Esyn = -80
 
        self.V0 = -65 # 突触受体公式上的V要与后面神经元的V相等,这在生物学上也是成立的
        self.step = step # 步长0.01 ms
        self.iter = int(100/self.step) # 计算1ms的时间
 
        self.t = np.zeros(self.iter + 1)
        self.g = np.zeros(self.iter + 1)
        self.g[0] = 0
        self.I = np.zeros(self.iter + 1)
        self.I[0] = 0
    def oula(self):
        g_result = []
        for j in range(len(self.ts)):
            for i in range(self.iter):
                self.t[i] = i * self.step
                self.g[i+1] = 0.1 * (self.t[i] - self.ts[j]) / 5 * np.exp(-(self.t[i] - self.ts[j]) / 5)
            for i in range(self.iter):
                if self.g[i] < 0:
                    self.g[i] = 0
            import copy
            g_result.append(copy.deepcopy(self.g))
        gl = g_result[0]
        for i in range(len(g_result)):
            if i == 0:
                continue
            gl += g_result[i]
            self.g = gl
        for i in range(self.iter):
            self.I[i] = -self.g[i]*(self.V0 - self.Esyn) * 10
        return self.I[0:self.iter],self.g[0:self.iter],self.t[0:self.iter]

mimi.py

# -*- coding: utf-8 -*-
"""
Created on Fri Sep 30 15:49:12 2022

@author: dell2
"""
import Neuron
import matplotlib.pyplot as plt
import numpy as np
 
type = 0
I = [30] * 10000
neuron1 = Neuron.Neuron(I)
t1,v1 = neuron1.oula()
I,g,t = neuron1.spike(type)
neuron2 = Neuron.Neuron(I)
t2,v2 = neuron2.oula()

fig, ax = plt.subplots(4,1)
plt.subplots_adjust(hspace=1)
ax[0].plot(t1,v1)
ax[0].set_title('First')
ax[0].set_xlabel('t(ms)')
ax[0].set_ylabel('v(mV)')

if type == 1:
    v2[0:500] = v2[501]
ax[1].plot(t2,v2)
ax[1].set_title('Second')
ax[1].set_xlabel('t(ms)')
ax[1].set_ylabel('v(mV)')
ax[2].plot(t,g)
ax[2].set_title('Conductive')
ax[2].set_xlabel('t(ms)')
ax[2].set_ylabel('g(s/m)')
ax[3].plot(t,I)
ax[3].set_title('Isyn')
ax[3].set_xlabel('t(ms)')
ax[3].set_ylabel('I(mA)')
plt.show()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值