Деление Дымола на ноль при инициализации, как отладить

У меня есть модель 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 (или какое-то другое небольшое ненулевое значение).

Martin Brown 09.07.2024 10:09

Спасибо, хорошая идея. Время начала 1e-9 по-прежнему выдает ту же ошибку, так что это не деление по времени.

Priyanka 09.07.2024 10:13

Можете ли вы опубликовать код модели? Я ожидаю, что сообщение об ошибке будет немного более обширным. Это все результаты?

Markus A. 09.07.2024 10:34

Это модель клиента, я могу построить воспроизводитель меньшего размера, как только найду основную причину. Это все выходные данные.

Priyanka 09.07.2024 14:32

Надеюсь, в нем не слишком много разделений. Найдите их и хорошенько подумайте. Если сообщение об ошибке принимается по номиналу, оно на самом деле равно 0,0/0,0 с числителем и знаменателем как нулевым типом ошибки, которую может дать sin(x)/x, если бы оно не было закодировано с целью защиты.

Martin Brown 09.07.2024 17:28

Все еще немного озадачен отсутствием дополнительного вывода... Тем не менее, один из способов найти проблему - установить Advanced.OutputModelicaCode = true;, который будет генерировать dsmodel.mof в рабочем каталоге. Это как минимум одно место, где можно искать ошибку. Кроме того, это может помочь установить Evaluate = true; и Advanced.EvaluateAlsoTop = true;. Если повезет, вы сможете найти 0/0 или что-то подобное.

Markus A. 10.07.2024 08:49

Это клиентская модель, которая изначально была построена в Twinbuilder, dsmodel.mof имеет 500 тыс. строк кода, поэтому вручную проверить все подразделения будет сложно.

Priyanka 10.07.2024 08:52

@МаркусА. Оценка всех дала результат: dsmodel.mof содержал строку someVariable = 0.0/0.0. Спасибо вам большое!

Priyanka 10.07.2024 11:20

Приятно слышать! Я преобразую комментарий в ответ, чтобы вы могли принять его и помочь другим с похожими проблемами...

Markus A. 10.07.2024 13:14
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
1
9
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов обнаружить проблему — установить 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.

Другие вопросы по теме