编辑:如何在第二个函数-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);