首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab ode45基本设置

Matlab ode45基本设置
EN

Stack Overflow用户
提问于 2012-10-04 13:05:00
回答 1查看 9.5K关注 0票数 0

我正在尝试用ode45模拟神经元的Morris-Lecar模型。

我在初始化ode45调用时遇到了问题,文档也无法帮助我。我知道我必须通过一个函数调用ode45,然后从我的主脚本调用该函数。

一般来说,我对ODE的掌握有限,而且似乎难以理解初始化ODE45-call所需的语法。

此外,我被指示为变量'pulse‘使用时间范围,但函数中没有时间范围的输入(似乎是一个变量,而不是固定的),该函数从主脚本接收输入,并将其与其他函数一起发送到ode45函数。提供给ode45的函数也有时间输入,但是我还是不知道如何输入时间范围。说明非常清楚,主脚本中使用的函数不接受任何时间变量。

如果您能指出我在初始化过程中所犯的任何明显错误,我们将不胜感激。

当前(下)版本的错误码如下:

代码语言:javascript
复制
Error using ODEequation (line 89)
Not enough input arguments.

Error in odearguments (line 88)
f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.

Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in ODEquestion (line 32)
[t Vm]=ode45(@ODEequation,[-20 20],[-30, 0.1]',[],constants, stim_on, stim_off, amp);

Error in YoonS_Lab3_EBME308_Fall2012 (line 355)
[t Vm] = ODEquestion(20,100,30)

我想这可以追溯到我不存在的,但需要时间的投入。

问题涉及到

代码语言:javascript
复制
Cm * dVm / dt = -Gm(Vm-Vrest) - Gca Minf (Vm - Eca) - Gk w(Vm - Ek) + pulse(t)

dw/dt = (wInf - w) / Tau-w;

wInf = (1+tanh(Vm/30)) / 2;
mInf = (1+tanh(Vm+1)) / 2;
Tau-w = 5/ (cosh(Vm/60));
Cm = membrane leakage capacticance;
Gm = membrane leakage conductance;
Vm = membrane voltage;
Vrest = membrane voltage @ neuron resting
Gca = max Ca conductance through membrane
Gk = max K conductance through membrane;
mInf refers = P ( Ca ion channel open )
wInf refers = P ( K ion channel open )
Tau-w = rate which K channels respond to change in membrane voltage
Eca = reversal potential of Ca
Ek = reversal potential of K
pulse(t) = stimulus applied to neuron
pulse(t) = A (stim-on <= t <= stim-off) or 0 (else);

作为变量。

我已经创建了一个发送到ode45的函数,如下所示。

代码语言:javascript
复制
function dy = ODEequation(t, Vm, w, constants, stim_on, stim_off, amp)

wInf = (1 + tan(Vm / 30)) / 2
mInf = (1 + tan((Vm + 1)/ 15)) / 2
tauW = 5/ (cosh(Vm/60))

pulse = amp * ((stim_on < t ) - ( t >= stim_off));

dy(1) = y(1) * ((-constants(2) - constants(4) * constants(9) - constants(5) * y(2)) + (constants(2) * constants(3) + constants(6) * constants(4) * constants(9) + constants(5) * y(2) * constants(7) + constants(11))) / constants(1) ;
dy(2) = = ( constants(8) - y(2) )/constants(10)
dy = dy'

传递的函数如下所示

代码语言:javascript
复制
function [t Vm] = ODEquestion(stim_on, stim_off, amp)

%i)
Cm = 1;
Gm = 0.5;
Vrest = -50;
Gca = 1.1;
Gk = 2;
Eca = 100;
Ek = -70;

%ii)
Vm(1) = -30;
w(1) = 0.1;

%iii)
wInf = (1 + tan(Vm / 30)) / 2
mInf = (1 + tan((Vm + 1)/ 15)) / 2
tauW = 5/ (cosh(Vm/60))


IC1 = Vm(1) % = -30
IC2 = w(1) % = 0.1

pulse = amp %* ((stim_on < t ) - ( t >= stim_off));

constants = [Cm , Gm, Vrest, Gca, Gk, Eca, Ek, wInf, mInf, tauW, pulse];

[t Vm]=ode45(@ODEequation,[-20 20],[-30, 0.1]',[],constants, stim_on, stim_off, amp);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-04 14:19:13

来自help ode45

ODE45解非刚性微分方程,中阶方法。

TOUT,YOUT = ODE45(ODEFUN,TSPAN,Y0)与TSPAN = T0 TFINAL在初始条件Y0下积分从时间T0到TFINAL的微分方程组y‘= f(t,y)。ODEFUN是一个函数句柄。对于标量T和向量Y,ODEFUN(T,y)必须返回对应于f(t,Y)的列向量。

因此,函数ODEFUN只需要两个输入(ty),而您的函数需要7个输入。

您可以通过遵循this sitethis question上的说明来解决此问题:

代码语言:javascript
复制
wrapper = @(t,Vm) ODEequation(t, Vm, w, constants, stim_on, stim_off, amp);
[t Vm]=ode45(wrapper, [-20 20],[-30, 0.1]',[],constants, stim_on, stim_off, amp);

例如,通过创建传递所有常量的小包装函数,同时转发由ode45插入的变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12720549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档