Использование нескольких экземпляров Calculator
действительно тормозит модель, так как одна переменная calculatedVariable
будет иметь несколько уравнений, пытающихся вычислить ее значение.Поэтому Димола жалуется, что система структурно сингулярна, в данном случае это означает, что в результирующей системе уравнений больше уравнений, чем переменных.
Чтобы дать немного больше понимания: на самом деле проверка Collector
не удастсятак как начиная с Modelica 3.0 каждый компонент должен быть сбалансирован (то есть он должен иметь столько же неизвестных, сколько и состояний), что не относится к Collector
, поскольку у него есть одно неизвестное, но нет уравнения.Это сильно ограничивает возможные применения конструкции inner/outer
, поскольку в основном каждая переменная должна быть вычислена там, где она определена.
В данном примере это компенсируется в общей системе, если используется только один Calculator
.Так что эта единственная комбинация будет работать.Хотя это работает, это то, что не следует делать - по очевидной причине очень подверженной ошибкам (и все подмодели должны пройти проверку).
Ваш вопрос о том, как на самом деле решить эту проблемупропускает описание того, что проблема на самом деле.На мой взгляд, есть несколько случаев, когда ваш подход может быть полезен для:
- Вы хотите построить несколько переменных из одной точки, которая будет коллектором.Для этой цели «выбор переменных» должен быть наиболее простым способом: см. Dymola Manual Vol.1, раздел «4.3.11 Соответствие и выбор переменных» о том, как их применять.
- Вы хотите выполнить некоторую математическую операцию над этими переменными.Тогда может быть полезно иметь векторизованный ввод переменного размера.Это позволяет произвольное количество подключений к этому входу.Для примера рассмотрим:
Modelica.Blocks.Math.MultiSum
- Вы хотите направить несколько сигналов между разными моделями (что маловероятно, если судить по вашему описанию, но все же): тогда
expandable connectors
будет хорошей возможностью,Чтобы получить представление о том, на что это действительно нужно взглянуть, Modelica.Blocks.Examples.BusUsage
.
Надеюсь, это поможет, в противном случае, пожалуйста, укажите более четко, чего вы действительно хотите достичь с помощью своего кода.