Octave中用ode45求解HH模型ODE时出现V未定义错误
解决Octave中ode45调用HH模型ODE函数时的"V未定义"错误
问题根源
Octave(及MATLAB)的ODE求解器(如ode45)对被调用的函数有严格格式要求:
- 函数必须接收两个输入参数:第一个是时间
t(即使内部不用),第二个是所有状态变量组成的列向量y - 输出必须是状态变量导数组成的列向量
你的hh函数将n、m、h、V作为独立参数传入,完全不符合求解器调用规范。当ode45调用时,会把初始条件向量[0.5;0.5;0.5;-60]作为第一个参数传给n,而m、h、V都未被传入,因此触发"V未定义"的错误。
修改方案
将hh函数调整为符合ODE求解器规范的格式,从状态向量中拆分变量,最后打包导数为列向量输出:
function dydt = hh(t, y) % 从状态向量y中拆分各变量 n = y(1); m = y(2); h = y(3); V = y(4); C=1; GK=36; GNa=120; GL=0.3; EK=-72; ENa=55; EL=-49.4; dndt=(1-n)*alphan(V)-n*betan(V); dmdt=(1-m)*alpham(V)-m*betam(V); dhdt=(1-h)*alphah(V)-h*betah(V); dVdt=-1/C*(GK*n^4*(V-EK)+GNa*m^3*h*(V-ENa)+GL*(V-EL)); % 将导数打包为列向量输出 dydt = [dndt; dmdt; dhdt; dVdt]; end
正确调用方式
修改后即可正常使用ode45调用,推荐使用函数句柄(比字符串更可靠):
ySS = ode45(@hh, [0 20], [0.5; 0.5; 0.5; -60]);
如果你的Octave版本较旧,也可以用字符串指定函数名:
ySS = ode45('hh', [0 20], [0.5; 0.5; 0.5; -60]);
额外说明
如果需要保留原有的独立参数调用功能(如[a,b,c,d]=hh(0.5,0.5,0.5,-60)),可以通过函数重载实现:
function varargout = hh(varargin) if nargin == 4 % 原独立参数调用逻辑 n = varargin{1}; m = varargin{2}; h = varargin{3}; V = varargin{4}; C=1; GK=36; GNa=120; GL=0.3; EK=-72; ENa=55; EL=-49.4; dndt=(1-n)*alphan(V)-n*betan(V); dmdt=(1-m)*alpham(V)-m*betam(V); dhdt=(1-h)*alphah(V)-h*betah(V); dVdt=-1/C*(GK*n^4*(V-EK)+GNa*m^3*h*(V-ENa)+GL*(V-EL)); varargout = {dndt, dmdt, dhdt, dVdt}; elseif nargin == 2 % ODE求解器调用逻辑 t = varargin{1}; y = varargin{2}; n = y(1); m = y(2); h = y(3); V = y(4); C=1; GK=36; GNa=120; GL=0.3; EK=-72; ENa=55; EL=-49.4; dndt=(1-n)*alphan(V)-n*betan(V); dmdt=(1-m)*alpham(V)-m*betam(V); dhdt=(1-h)*alphah(V)-h*betah(V); dVdt=-1/C*(GK*n^4*(V-EK)+GNa*m^3*h*(V-ENa)+GL*(V-EL)); varargout{1} = [dndt; dmdt; dhdt; dVdt]; end end
内容的提问来源于stack exchange,提问作者צבי
相关产品推荐
相关产品推荐

