首页 > 解决方案 > 使用包含数组的三个方程编译代码时出现初始化错误

问题描述

我正在尝试准备一个模型代码来理解数组和 for 循环。编译代码时,出现以下错误。

由于以下等式,初始化问题不一致: 0 != 1 = 1.0 - I[0] 初始化错误。存储结果并退出。
使用 -lv=LOG_INIT -w 获取更多信息。模拟过程失败。以代码 -1 退出。

我试图调整数组编号,看看是否可以解决。无法追踪代码失败的原因。

class flu
    parameter Real beta = 10.0/(40*8*24);
    parameter Real gamma= 3.0/(15*24);
    parameter Real dt = 0.1;
    parameter Real D  = 30;
    parameter Integer N_t = integer(D*24/dt);
    parameter Integer array = integer(N_t*dt);
    //parameter Real time[array];
    Real S[array] ;
    Real I[array] ;
    Real R[array] ;

initial equation
    S[0] = 50;
    I[0] = 1;
    R[0] = 0;

equation
    for n in 0:(array-1) loop
    S[n+1] = S[n] - dt*beta*S[n]*I[n];
    I[n+1] = I[n] + dt*beta*S[n]*I[n] - dt*gamma*I[n];
    R[n+1] = R[n] + dt*gamma*I[n];
    end for;

annotation(
    __OpenModelica_simulationFlags(lv = "LOG_STATS", outputFormat = "mat", s = "dassl"));end flu;

我期望得到三条曲线。

标签: modelicaopenmodelicajmodelica

解决方案


这里似乎有一些问题。首先,OpenModelica 似乎没有输出方程的索引,因此可以打开调试器。

但更重要的是,您正在设置

I[0] = 1

I[1]是 Modelica 中的第一个索引...我不知道为什么这不会在 OpenModelica 中发出任何警告。可能是 if 方程中的一些边缘情况,它永远不会触发,因此在这种情况下没有警告/错误。

class flu
    parameter Real beta = 10.0/(40*8*24);
    parameter Real gamma= 3.0/(15*24);
    parameter Real dt = 0.1;
    parameter Real D  = 30;
    parameter Integer N_t = integer(D*24/dt);
    parameter Integer array = integer(N_t*dt);
    //parameter Real time[array];
    Real S[array] ;
    Real I[array] ;
    Real R[array] ;

equation
    S[1] = 50;
    I[1] = 1;
    R[1] = 0;

equation
    for n in 1:(array-1) loop
    S[n+1] = S[n] - dt*beta*S[n]*I[n];
    I[n+1] = I[n] + dt*beta*S[n]*I[n] - dt*gamma*I[n];
    R[n+1] = R[n] + dt*gamma*I[n];
    end for;
end flu;

推荐阅读