0

ode45を使用してニューロンのMorris-Lecarモデルをシミュレートしようとしています。

ode45呼び出しの初期化に問題があり、ドキュメントが役に立ちませんでした。関数を介してode45を呼び出し、メインスクリプトからその関数を呼び出す必要があることを理解しています。

私は一般的にODEの理解が限られており、ODE45呼び出しを初期化するために必要な構文を理解するのに苦労しているようです。

また、変数「パルス」に時間範囲を使用するように指示されていますが、メインスクリプトから入力を受け取り、送信する関数には、時間範囲(変数のようで、固定されていないようです)の入力がありません。 ode45関数の他の関数と同じです。ode45にフィードする関数にも時間入力がありますが、時間範囲を入力する方法がわかりません。指示は、メインスクリプトで使用される関数が時間変数を受け取らないことを非常に明確にしています。

初期化で私が犯した明白なエラーを指摘していただければ幸いです。

現在の(以下の)バージョンのエラーコードは次のとおりです。

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)

これは、私の存在しないがまだ必要な時間入力に戻ると思います。

問題は関係している

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に送信される関数を作成しました。

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'

そしてそれを通過する関数は以下の通りです

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);
4

1 に答える 1

1

差出人help ode45

ODE45非硬い微分方程式、中次法を解きます。

[TOUT,YOUT] = ODE45(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates 
the system of differential equations y' = f(t,y) from time T0 to TFINAL 
with initial conditions Y0. ODEFUN is a function handle. For a scalar T
and a vector Y, ODEFUN(T,Y) must return a column vector corresponding 
to f(t,y). 

したがって、関数ODEFUNは2つの入力(ty)のみを期待しますが、関数は7つの入力を期待します。

このサイトにある手順、またはこの質問に従うことで、これを解決できます。

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

于 2012-10-04T06:19:12.633 に答える