我有一个动力系统ode
,我需要解决它的参数之一,即参数r
的各种值。但是,函数sigm
(S型函数)在系统中出现了很多次,因此最好将其编码为系统外部的单独函数。
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
仅出现在S型函数中而不出现在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
,如in
dydt(5) = sigm(y(3)-y(4), r) - y(5)- y(1);