编辑:如何在第二个函数-Matlab 中传递 ode 参数
EDIT: how to pass ode parameters in second function-Matlab
我有一个动力系统 ode
,我需要求解其中一个参数,即参数 r
的各种值。然而,函数 sigm
(sigmoid 函数)在系统中出现了很多次,人们认为最好将其编码为系统外部的单独函数。
r = 0:+0.01:1;
time = 0:.01:10;
y0 = [0 0 0 0 0 0 0 0];
y = NaN(length(time),length(y0),length(r));
for i=1:length(r)
[t,y(:,:,i)] = ode45(@(t,y) ode(t,y,r(i)),time, y0);
...
end
function dydt = ode(~,y,r)
dydt = NaN(8,1);
dydt(1) = y(5);
dydt(2) = y(6);
dydt(3) = y(7);
dydt(4) = y(8);
dydt(5) = sigm(y(3)-y(4)) - y(5)- y(1);
dydt(6) = sigm(y(3)-y(4)) - y(6) - y(2);
dydt(7) = sigm(y(1)) - y(7) - y(3);
dydt(8) = sigm(y(2)) - y(8) - y(4);
end
function X = sigm(u,r)
X = 1/(1+exp(r*(6-u)));
end
我遇到困难的一点是,参数 r
只出现在 sigmoid 函数中,而不出现在 ode 中。因此,当我尝试针对此参数的多个值求解系统时,出现错误 not enough input arguments
。
如何将此参数传递给第二个函数?
一种可能的方法是将整个 sigm
函数放在 ode
函数中:
function dydt = ode(~,y,r)
dydt = NaN(8,1);
dydt(1) = y(5);
dydt(2) = y(6);
dydt(3) = y(7);
dydt(4) = y(8);
dydt(5) = sigm(y(3)-y(4)) - y(5)- y(1);
dydt(6) = sigm(y(3)-y(4)) - y(6) - y(2);
dydt(7) = sigm(y(1)) - y(7) - y(3);
dydt(8) = sigm(y(2)) - y(8) - y(4);
function X = sigm(u)
X = 1/(1+exp(r*(6-u)));
end
end
,但我猜这不是一个好的编码策略
在函数声明中
function dydt = ode(~,y,r)
参数 r
被定义为局部变量,然后可以像任何其他标量值一样使用,例如将其作为第二个参数传递给 sigm
,如
]
dydt(5) = sigm(y(3)-y(4), r) - y(5)- y(1);
我有一个动力系统 ode
,我需要求解其中一个参数,即参数 r
的各种值。然而,函数 sigm
(sigmoid 函数)在系统中出现了很多次,人们认为最好将其编码为系统外部的单独函数。
r = 0:+0.01:1;
time = 0:.01:10;
y0 = [0 0 0 0 0 0 0 0];
y = NaN(length(time),length(y0),length(r));
for i=1:length(r)
[t,y(:,:,i)] = ode45(@(t,y) ode(t,y,r(i)),time, y0);
...
end
function dydt = ode(~,y,r)
dydt = NaN(8,1);
dydt(1) = y(5);
dydt(2) = y(6);
dydt(3) = y(7);
dydt(4) = y(8);
dydt(5) = sigm(y(3)-y(4)) - y(5)- y(1);
dydt(6) = sigm(y(3)-y(4)) - y(6) - y(2);
dydt(7) = sigm(y(1)) - y(7) - y(3);
dydt(8) = sigm(y(2)) - y(8) - y(4);
end
function X = sigm(u,r)
X = 1/(1+exp(r*(6-u)));
end
我遇到困难的一点是,参数 r
只出现在 sigmoid 函数中,而不出现在 ode 中。因此,当我尝试针对此参数的多个值求解系统时,出现错误 not enough input arguments
。
如何将此参数传递给第二个函数?
一种可能的方法是将整个 sigm
函数放在 ode
函数中:
function dydt = ode(~,y,r)
dydt = NaN(8,1);
dydt(1) = y(5);
dydt(2) = y(6);
dydt(3) = y(7);
dydt(4) = y(8);
dydt(5) = sigm(y(3)-y(4)) - y(5)- y(1);
dydt(6) = sigm(y(3)-y(4)) - y(6) - y(2);
dydt(7) = sigm(y(1)) - y(7) - y(3);
dydt(8) = sigm(y(2)) - y(8) - y(4);
function X = sigm(u)
X = 1/(1+exp(r*(6-u)));
end
end
,但我猜这不是一个好的编码策略
在函数声明中
function dydt = ode(~,y,r)
参数 r
被定义为局部变量,然后可以像任何其他标量值一样使用,例如将其作为第二个参数传递给 sigm
,如
dydt(5) = sigm(y(3)-y(4), r) - y(5)- y(1);