Odes15子绘图,微分方程

时间:2014-12-11 22:26:34

标签: matlab matlab-figure ode differential-equations subplot

所以我有三个与糖尿病有关的微分方程,我必须绘制三个中的2个,它们是一个子图中的G和I.出于某种原因,当我尝试运行它时,命令窗口打印出:“没有足够的输入参数”这是它的标准:

function dx = problem1(t,x)     
    P1 = 0.028735 ;
    P2 = 0.028344 ;
    P3 = 5.035 * 10^(-5) ;
    Vi = 12 ;
    n = 5/54 ;
    D_t = 3*exp(-0.05*t) ;
    U_t = 3 ;
    Gb = 4.5;
    Xb = 15;
    Ib = 15;

    G = x(1);
    X = x(2);
    I = x(3);

    dx = zeros(3,1);
    dx(1) = -P1*(G-Gb) - (X-Xb)*G + D_t ;
    dx(2) = -P2*(X-Xb) + P3*(I-Ib) ;
    dx(3) = -n*I + U_t/Vi ;

    [T,X] = ode15s(@problem1,[0 60*24],[4.5 15 15]) ;

subplot(3,1,1);
plot(T,X(:,1)); % Plot G
subplot(3,1,2); % Second subplot
plot(T,X(:,2)); % Plot I

1 个答案:

答案 0 :(得分:2)

运行该函数时抛出错误,MATLAB尝试评估D_t = 3*exp(-0.05*t);。由于没有给出t的值,MATLAB会抛出一个错误,指出必须指定最新的那个未使用的t变量。

代码的主要问题在于函数的设计。即,ode15s需要一个接受tx并返回dx的函数;但是,正如目前所述,对ode15s的调用嵌入problem1,其本身需要tx。这是一个鸡蛋或鸡蛋问题。

除了此设计问题外,所有输入都是正确的,并且可以使用ODE定义的单独函数轻松纠正:

function problem1

    [T,X] = ode15s(@ODE,[0 60*24],[4.5 15 15]) ;  
    subplot(3,1,1);
    plot(T,X(:,1)); % Plot G
    subplot(3,1,2); % Second subplot
    plot(T,X(:,2)); % Plot I

end

function dx = ODE(t,x)
    P1 = 0.028735 ;
    P2 = 0.028344 ;
    P3 = 5.035 * 10^(-5) ;
    Vi = 12 ;
    n = 5/54 ;
    D_t = 3*exp(-0.05*t) ;
    U_t = 3 ;
    Gb = 4.5;
    Xb = 15;
    Ib = 15;

    G = x(1);
    X = x(2);
    I = x(3);

    dx = zeros(3,1);
    dx(1) = -P1*(G-Gb) - (X-Xb)*G + D_t ;
    dx(2) = -P2*(X-Xb) + P3*(I-Ib) ;
    dx(3) = -n*I + U_t/Vi ;
end

注意:

  • 第一行function problem1function [] = problem1()的简写。我自己更喜欢后一种形式,但我是少数。
  • 传递给ode15s @ODE的函数句柄是@(t,x) ODE(t,x)的简写。我自己更喜欢后一种形式,但只要你不是parametrizing functions,它就不会更低或更有效。
  • 你也可以使用嵌套函数并赋予problem1函数访问模型常量的权限,但我在这里选择了一个单独的函数。