Я хочу создать сложную модель в качестве параметра в другой модели и инициализировать ее в разделе начального уравнения, как я могу сделать с любым реальным параметром.Для простого действительного параметра я бы просто написал
parameter Real y(fixed = true);
, указывая, что y
должно быть вычислено во время инициализации с использованием исходных уравнений (которые будут определены ...).Но я не могу сделать это для сложной модели, то есть
parameter ComplexModel m(fixed = true);
не компилируется.Рассмотрим, например, следующую плоскую модель
model FlatModel
parameter Real x = 4;
parameter Real y(fixed = false);
Real z;
// ... + many other model elements
initial equation
y*y = x;
// ... + many other equations
equation
z*z = 4*x;
end FlatModel;
Здесь неявное решение y = 2 вычисляется во время инициализации, тогда как решение z = 4 вычисляется в зависимости от времени (по крайней мере, в принципе, возможна оптимизация, несмотря на...).Но оба представляют в основном одно и то же квадратичное отношение, поэтому я хочу инкапсулировать это уравнение в отдельную модель (обратите внимание, что не каждая такая система уравнений так проста, как в этом примере):
model ComplexModel
Real x(fixed = false);
Real y(fixed = false);
equation
y * y = x;
end ComplexModel;
и попробуйте использоватьэто так:
model RefactoredFlatModel
parameter Real x = 4;
parameter Real y(fixed = false);
Real z;
parameter ComplexModel mStatic;
ComplexModel mDynamic;
initial equation
mStatic.x = x;
y = mStatic.y;
equation
mDynamic.x = 4*x;
z = mDynamic.y;
end RefactoredFlatModel;
Но, похоже, это не сработает (компилятор сообщает о переопределенной системе).Проверка сплющенной компилятором модели показывает, почему:
class FixedTests.RefactoredFlatModel
parameter Real x = 4.0;
parameter Real y(fixed = false);
Real z;
parameter Real mStatic.x(fixed = false);
parameter Real mStatic.y(fixed = false);
Real mDynamic.x(fixed = false);
Real mDynamic.y(fixed = false);
initial equation
mStatic.x = x;
y = mStatic.y;
equation
mStatic.y ^ 2.0 = mStatic.x;
mDynamic.y ^ 2.0 = mDynamic.x;
mDynamic.x = 4.0 * x;
z = mDynamic.y;
end FixedTests.RefactoredFlatModel;
Итак, mStatic.y ^ 2.0 = mStatic.x
помещается в (зависимый от времени) раздел уравнения вместо раздела исходного уравнения, где я хотел, чтобы это было.Ясно, что модель переопределена, потому что она пытается решить для mStatic.y во времени, хотя mStatic.y является параметром и, следовательно, не зависит от времени.
Есть ли какой-нибудь способ сказать компилятору modelica поворачивать уравненияв исходные уравнения для экземпляров параметров?Потому что иначе невозможно неявно определить экземпляры параметров сложных моделей.