EDIT:如何在第二个函数-Matlab中传递ode参数

问题描述 投票:0回答:1

我有一个动力系统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

,但我猜这不是一个好的编码策略

matlab ode
1个回答
0
投票

在函数声明内]

function dydt = ode(~,y,r)

参数r被定义为局部变量,然后可以像其他任何标量值一样使用它,例如,将其作为第二个参数传递给sigm,如in

dydt(5) = sigm(y(3)-y(4), r) - y(5)- y(1);
© www.soinside.com 2019 - 2024. All rights reserved.