function dYdt = fhn_model(Y, a, b, c, I)
V = Y(1);
W = Y(2);
dVdt = V - V^3 / 3 - W + I;
%表示膜电位的变化率。这个方程包含了两个部分,第一部分 V - V^3 / 3 描述了膜电位的变化,第二部分 - W + I 描述了外部刺激对膜电位的影响。
dWdt = c * (V + a - b*W);
%表示激活变量的变化率。这个方程也包含了两个部分,第一部分 V + a 描述了膜电位对激活变量的影响,第二部分 - b*W 描述了激活变量自身的耗散,其中 b 是耗散系数,c 是一个比例系数。
dYdt = [dVdt; dWdt];
end
FitzHugh-Nagumo 模型脉冲响应微分方程
function dYdt = fhn_model_impulse(Y, a, b, c, I)
V = Y(1);
W = Y(2);
dVdt = V - V^3 / 3 - W + I;
dWdt = c * (V + a - b*W);
dYdt = [dVdt; dWdt];
if rand < 0.01 % 添加脉冲激励
dYdt = dYdt + [1; 0];
end
end
%该模型模拟神经元的放电行为。
MATLAB仿真测试
clc;clear
% FitzHugh-Nagumo 模型参数
a = 0.7;
b = 0.8;
c = 0.08;
I = 0.5;
% 定义函数进行时间积分
T = [0 250]; %定义了时间范围 [0, 250],用于指定积分的时间区间
initialY = [-0.8; 0.8]; % 初始膜电位 ( V ) 设置为 -0.8,初始恢复变量 ( W ) 设置为 0.8。
options = odeset('RelTol', 1e-6); %定义了ODE求解器的选项。在这里,使用了相对容差为 ( 1 \times 10^{-6} ) 的选项
[t, Y] = ode45(@(t, Y) fhn_model(Y, a, b, c, I), T, initialY, options); %使用ODE45函数对FHN模型进行时间积分
% 提取状态变量
V = Y(:, 1); %提取时间积分得到膜电位 ( V ) 的值
W = Y(:, 2); %提取时间积分得到恢复变量 ( W ) 的值
%-------------FHN神经元放电图-------------
[t_impulse, Y_impulse] = ode45(@(t, Y) fhn_model_impulse(Y, a, b, c, I), T, initialY, options);
figure(2);
plot(t_impulse, Y_impulse(:, 1), 'r');
ylabel('膜电位V')
xlabel('时间T')
grid minor
grid on
set(gca,'linewidth',0.5,'fontsize',12,'fontname','STFangSong');
ylim([-2.5,2.5])
%--------- FitzHugh-Nagumo模型相图绘制相图--------------
figure(1);
plot(V, W)
xlabel('膜电位V')
ylabel('恢复变量W')
grid minor
grid on
set(gca,'linewidth',0.5,'fontsize',12,'fontname','STFangSong');
% ------------ 绘制零斜率线-----------------
figure(3);
v = @(V) -(V - V.^3 / 3 + I);
w = @(V) -(V + a) / b;
hold on;
xlabel('膜电位V');
ylabel('恢复变量W');
fplot(v, [-3 3], 'r--');
fplot(w, [-3 3], 'g--');
grid minor
grid on
set(gca,'linewidth',0.5,'fontsize',12,'fontname','STFangSong');
% ---------------膜电势 ( V ) 和恢复变量 ( W ) 随时间变化------------------
figure(4);
plot(t, V, 'b', t, W, 'r');
xlabel('时间T');
ylabel('膜电势(V),恢复变量(W)');
legend('膜电势(V)', '恢复变量(W)');
grid minor
grid on
set(gca,'linewidth',0.5,'fontsize',12,'fontname','STFangSong');
ylim([-3,3])