Ошибка инициализации при компиляции кода с тремя уравнениями, содержащими массив

Я пытаюсь подготовить код модели, чтобы понять массив и цикл. Когда я компилирую код, я получаю следующую ошибку.

Проблема инициализации несовместима из-за следующего уравнения: 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;

В результате я ожидаю получить три кривые.


person damu_d    schedule 17.08.2019    source источник


Ответы (1)


Кажется, здесь что-то не так. Прежде всего, похоже, что 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;
person sjoelund.se    schedule 17.08.2019
comment
- Поскольку Open Modelica не выводит индекс уравнения, есть ли у вас какие-нибудь предложения, как решить эти уравнения? - person damu_d; 17.08.2019
comment
Я попытался найти и запустить уравнение сравнения без массивов, и, похоже, оно решило ошибку. - person damu_d; 17.08.2019
comment
Ну, код, который я опубликовал, является рабочей версией кода; Я нашел уравнение, просмотрев сгенерированные C-файлы (оно также показано в полученном вами сообщении об ошибке, что 1.0 - I[0] дал неожиданные результаты). Или вы решаете, как предложил damu_d. - person sjoelund.se; 18.08.2019