Цель раздела уравнения состоит в том, чтобы установить математические отношения между переменными компонентами, параметрами, входами, выходами, временем и производными по времени каждой из этих сущностей. Раздел уравнения файла Simscape™ выполняется на протяжении всей симуляции.
Примечание
Можно также задать уравнения, которые выполняются только во время инициализации модели, при помощи (Initial=true)
атрибут. Для получения дополнительной информации см. «Начальные уравнения».
Уравнение языка Simscape состоит из двух выражений, связанных с оператором = =. В отличие от оператора регулярного назначения (=), оператор = = задает непрерывное математическое равенство между этими двумя выражениями (для получения дополнительной информации см. «Определение математического равенства»). Выражения уравнения могут быть построены из любого из идентификаторов, определенных в объявлении модели. Вы также можете получить доступ к глобальному времени симуляции из раздела уравнения, используя time
функция.
Список MATLAB® функции, которые можно использовать в разделе уравнения, см. «Поддерживаемые функции».
Язык Simscape семантически оговаривает, что все выражения уравнения, возвращенные разделом уравнения файла Simscape, задают непрерывное математическое равенство между двумя выражениями. Рассмотрим простой пример:
equations Expression1 == Expression2; end
Здесь мы объявили равенство между Expression1
и Expression2
. Левое и правое выражения являются любыми допустимыми выражениями MATLAB (ограничения на использование реляционных операторов см. в следующем разделе ==
, <
, >
, <=
, >=
, ~=
, &&
, ||
). Выражения уравнения могут быть построены из любого из идентификаторов, определенных в объявлении модели.
Уравнение задано оператором = =. Это означает, что уравнение представляет не присвоение, а скорее симметричную математическую связь между левым и правым операндами. Потому что = = симметрично, левый операнд не ограничивается просто переменной. Для примера:
component MyComponent [...] variables a = 1; b = 1; c = 1; end equations a + b == c; end end
Следующий пример математически эквивалентен предыдущему примеру:
component MyComponent [...] variables a = 1; b = 1; c = 1; end equations 0 == c - a - b; end end
Примечание
Выражения уравнений должны быть завершены точкой с запятой или новой строкой. В отличие от MATLAB, отсутствие точки с запятой не имеет различия. В любом случае, язык Simscape не отображает результат, так как он оценивает уравнение.
В предыдущем разделе мы обсуждали, как ==
используется для объявления математических равенств. Однако в MATLAB ==
приводит к выражению, подобному любому другому оператору. Для примера:
(a == b) * c;
где a
, b
, и c
представляет скалярные двойные значения, является легальным выражением MATLAB. Это означало бы, взять logical
значение, сгенерированное тестированием a
"эквивалентность b
, принуждение этого значения к double
и умножить на c
. Если a
то же, что и b
, тогда это выражение вернется c
. В противном случае возвращается 0.
С другой стороны, в MATLAB мы можем использовать ==
дважды для построения выражения:
a == b == c;
Это выражение неоднозначно, но MATLAB делает ==
и другие реляционные операторы остались ассоциативными, поэтому это выражение рассматривается как:
(a == b) == c;
Тонкое различие между (a == b) == c
и a == (b == c)
может быть значимым в MATLAB, но даже более значимым в уравнении. Потому что использование ==
является значимым в языке Simscape, и, чтобы избежать неоднозначности, следующий синтаксис:
component MyComponent [...] equations a == b == c; end end
недопустимо в языке Simscape. Вы должны явно связать вхождения верхнего уровня реляционных операторов. Также
component MyComponent [...] equations (a == b) == c; end end
или
component MyComponent [...] equations a == (b == c); end end
являются законными. В любом случае количество в круглых скобках приравнивается к количеству на другой стороне уравнения.
За исключением использования верхнего уровня ==
оператор, ==
и другие реляционные операторы остаются ассоциативными. Для примера:
component MyComponent [...] parameters a = 1; b = 1; c = false; end variables d = 1; end equations (a == b == c) == d; end end
является законным и толкуется как:
component MyComponent [...] parameters a = 1; b = 1; c = false; end variables d = 1; end equations ((a == b) == c) == d; end end
Выражения с обеих сторон ==
оператор не должен быть скалярными выражениями. Они должны быть одного и того же размера или должны быть скаляры. Для примера:
equations [...] <3x3 Expression> == <3x3 Expression>; [...] end
является законным и вводит 9 скалярных уравнений. Выражение уравнения:
equations [...] <1x1 Expression> == <3x3 Expression>; [...] end
также является законным. Здесь левая сторона уравнения расширена посредством скалярного расширения в то же выражение, реплицированное в матрицу 3x3. Это выражение уравнения также вводит 9 скалярных уравнений.
Однако выражение уравнения:
equations [...] <2x3 Expression> == <3x2 Expression>; [...] end
недопустимо, поскольку размеры выражений в левой и правой частях различаются.
Раздел уравнения оценивается за непрерывное время. Некоторые значения, которые доступны в разделе уравнения, сами по себе кусочно-непрерывны, то есть изменяются постоянно во времени. Эти значения:
переменные
входы
выходы
время
Piecewise continuous указывает, что значения непрерывны в течение компактных временных интервалов, но могут изменяться в определенных образцах. Следующие значения являются непрерывными, но не изменяющимися во времени:
параметры
константы
Изменяющиеся во времени счетные значения, например, целое или логическое, никогда не являются непрерывными.
Непрерывность распространяется как тип данных. Он распространяется через непрерывные функции (см. «Поддерживаемые функции»).
В языке Simscape вы объявляете представителей (такие как параметры, переменные, входы и выходы) как значение с модулем, и уравнения автоматически обрабатывают все преобразования модуля.
Однако эмпирические формулы часто используют нецелочисленные экспоненты, где основа либо безединично, либо в известных модулях. При работе с этими типами формул преобразуйте основу в бесчисленное значение с помощью value
функцию, а затем при необходимости повторно применить модули.
Например, следующая формула дает перепад давления, в Pa, с точки зрения скорости потока жидкости, в м ^ 3/с:
p == k * q^1.023
где p - давление, q - скорость потока жидкости и k - некоторая бесчисленная константа. Чтобы написать эту формулу на языке Simscape, используйте:
p == { k * value(q, 'm^3/s')^1.023, 'Pa' }
Этот подход работает независимо от фактических модулей p или q, пока они соизмеримы с давлением и объемными скоростями потока жидкости, соответственно. Для примера фактическая скорость потока жидкости может быть в галлонах в минуту, уравнение все еще будет работать и обрабатывать преобразование модуля автоматически.