Modelica 使用包含数组的三个等式编译代码时发生初始化错误

Modelica 使用包含数组的三个等式编译代码时发生初始化错误,modelica,openmodelica,jmodelica,Modelica,Openmodelica,Jmodelica,我试图准备一个modelica代码来理解数组和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/

我试图准备一个modelica代码来理解数组和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;

我希望得到三条曲线。

这里似乎有一些地方不对劲。首先,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;

-由于OpenModelica不输出方程的索引,您有什么建议如何解决这个方程吗?我尝试在没有数组的情况下查找并运行diff方程,它似乎解决了错误。好吧,我发布的代码是该代码的工作版本;我通过查找生成的C文件找到了这个等式(您得到的错误消息中也显示了
1.0-I[0]
给出了意外的结果)。或者你像达穆德建议的那样解决它。
class flu
    parameter Real beta = 10.0/(40*8*24);
    parameter Real gamma= 3.0/(15*24);


    Real S(start = 50) ;
    Real I(start = 1) ;
    Real R(start = 0) ;


equation
    der(S)= -beta*S*I;
    der(I)=(beta*S*I) - (gamma*I);
    der(R)=gamma*I;

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