У меня есть модель Modelica, которую не удается инициализировать, и появляется сообщение об ошибке деления на ноль ниже:
Error: The following error was detected at time: 0
Model error - division by zero: (0.0) / (0.0) = (0) / (0)
Error: Integrator failed to start model.
Есть ли способ также увидеть имена задействованных переменных или идентификатор нелинейного блока (например, инициализация.nonlinear[3]) или класс и строку кода?
Спасибо, хорошая идея. Время начала 1e-9 по-прежнему выдает ту же ошибку, так что это не деление по времени.
Можете ли вы опубликовать код модели? Я ожидаю, что сообщение об ошибке будет немного более обширным. Это все результаты?
Это модель клиента, я могу построить воспроизводитель меньшего размера, как только найду основную причину. Это все выходные данные.
Надеюсь, в нем не слишком много разделений. Найдите их и хорошенько подумайте. Если сообщение об ошибке принимается по номиналу, оно на самом деле равно 0,0/0,0 с числителем и знаменателем как нулевым типом ошибки, которую может дать sin(x)/x, если бы оно не было закодировано с целью защиты.
Все еще немного озадачен отсутствием дополнительного вывода... Тем не менее, один из способов найти проблему - установить Advanced.OutputModelicaCode = true;
, который будет генерировать dsmodel.mof
в рабочем каталоге. Это как минимум одно место, где можно искать ошибку. Кроме того, это может помочь установить Evaluate = true;
и Advanced.EvaluateAlsoTop = true;
. Если повезет, вы сможете найти 0/0
или что-то подобное.
Это клиентская модель, которая изначально была построена в Twinbuilder, dsmodel.mof имеет 500 тыс. строк кода, поэтому вручную проверить все подразделения будет сложно.
@МаркусА. Оценка всех дала результат: dsmodel.mof содержал строку someVariable = 0.0/0.0
. Спасибо вам большое!
Приятно слышать! Я преобразую комментарий в ответ, чтобы вы могли принять его и помочь другим с похожими проблемами...
Один из способов обнаружить проблему — установить Advanced.OutputModelicaCode = true;
, скопировав команду в командную строку. При следующем переводе модели Dymola сгенерирует dsmodel.mof
в текущем рабочем каталоге. Вы можете получить текущий используемый каталог, набрав cd
или через графический интерфейс (Файл -> Рабочий каталог -> Открыть в браузере файлов/Копировать путь).
Сгенерированный файл dsmodel.mof
содержит все (причинно-следственные) утверждения, созданные на основе общей модели. Поэтому это единственное место для поиска ошибки. Кроме того, может помочь установка Evaluate = true;
и Advanced.EvaluateAlsoTop = true;
(в качестве альтернативы вы можете использовать графический интерфейс через ленту моделирования -> Настройка -> Перевод, отметив два верхних поля).
Если повезет, вы сможете найти 0.0/0.0
или что-то подобное в dsmodel.mof
.
Примечание. Чтобы избежать подобных проблем в Dymola, имеет смысл использовать либо функцию DymolaModels.Functions.Math.divNoZero
, либо соответствующий блок DymolaModels.Blocks.Math.DivNoZero
.
Проверьте каждую операцию деления в вашей модели, которая требует времени или его прокси. Действительно нужно увидеть код модели, чтобы иметь возможность комментировать дальше. Или как очень быстрое и грязное исправление времени начала в 1e-9 (или какое-то другое небольшое ненулевое значение).