Классы MATLAB обеспечивают естественную основу для моделирования физических систем:
Простую систему можно моделировать как класс MATLAB. Свойства частного класса являются системными параметрами. Конструктор класса создает экземпляр системы с заданными параметрами. Публичный метод фиксирует динамику системы, возвращая конечное состояние для данного начального состояния и временного интервала. Класс может также содержать другие вспомогательные методы, которые модулируют математический анализ.
Анализ часто запускается с помощью простой системы, а затем вводятся дополнительные эффекты (например, механическое демпфирование) для повышения точности анализа. В MATLAB расширенную систему можно моделировать как подкласс, наследующий от исходного класса. Подкласс может содержать дополнительные частные свойства для дополнительных системных параметров (например, константы демпфирования). В зависимости от специфики системы подкласс может наследовать определенные методы из базового класса и перегружать другие методы.
В этом примере показано, как создать код C++ для функции MATLAB, которая сравнивает эволюцию времени простого осциллятора и затухающего осциллятора с идентичными параметрами и начальными условиями. Две осцилляторные системы моделируются с использованием классов MATLAB simpleOscillator и dampedOscillator которые определены в пакете MATLAB mySystem. Созданный код содержит классы C++ для исходных классов MATLAB. В примере также показано, как классы MATLAB сопоставляются с сгенерированными классами C++ и как использовать сгенерированный код в пользовательской основной функции C++.
Простой гармонический осциллятор имеет два параметра, массу и пружинную постоянную . Угловая частота осциллятора λ km. Положение x как функции t определяется следующим образом:
(
Амплитуда и фазовая константа определяются начальным положением и начальной скоростью простого генератора. В этом примере класс MATLAB simpleOscillator моделирует эту систему.
Демпфирующий гармонический генератор имеет один дополнительный параметр, постоянную демпфирования . В этом примере рассматривается случай, когда нормализованный параметр демпфирования b2m мал по сравнению с угловой , так что значительны только эффекты демпфирования первого порядка. Положение гасящего xd как функции t равно:
(
Как и ранее, амплитуда и фазовая константа определяются начальным положением и начальной скоростью демпфированного генератора. Основной эффект демпфирования заключается в экспоненциальном затухании амплитуды. В этом примере класс MATLAB dampedOscillator который является подклассом simpleOscillator моделирует демпфированную систему.
В этом примере используются следующие вспомогательные файлы, присутствующие в текущей рабочей папке:
Папка пакета +mySystem содержит два файла класса simpleOscillator.m и dampedOscillator.m.
Функция effectOfDamping вычисляет и возвращает траектории простого осциллятора и демпфированного осциллятора с заданными параметрами и начальными условиями.
Заголовки C++ и исходные файлы main_damped_oscillator.h и main_damped_oscillator.cpp реализуют пользовательскую главную функцию C++ и используются для создания исполняемого файла в последней части примера.
Определение структуры params имеет поля для трех параметров осциллятора. Убедитесь, что dampingConstant параметр мал по сравнению с springConstant и mass (в нормированных единицах).
params.springConstant = 1; params.dampingConstant = 0.1; params.mass = 1;
Позвоните в effectOfDamping функция для вычисления положения и временных траекторий простых и демпфированных осцилляторов от 0 100. Укажите исходное x0 = 1 и начальную скорость v0 = 0.
[time1,position1,time2,position2] = effectOfDamping(params,1,0,100,0.01);
График положения и график времени простых и демпфированных осцилляторов. Наблюдайте за тем, как амплитуда гасящего осциллятора экспоненциально затухает со временем.
plot(time1,position1)
hold on
plot(time2,position2)
Отображение конечного положения простого осциллятора.
disp(position1(end))
0.8623
Отображение конечного положения гасящего генератора. Обратите внимание, что демпфирование приводит к тому, что это конечное положение близко к среднему положению 0.
disp(position2(end))
0.0056
Чтобы проверить наличие проблем во время выполнения, создайте функцию C++ MEX для effectOfDamping функция. Укажите первый аргумент, который должен иметь тот же тип и размер, что и params. Укажите другие аргументы как скалярные двойные.
codegen -lang:c++ effectOfDamping -args {params,0,0,0,0} -report
Code generation successful: To view the report, open('codegen/mex/effectOfDamping/html/report.mldatx').
Вызов сгенерированной функции MEX effectOfDamping_mex для вычисления положения и временных траекторий простых и демпфированных осцилляторов от 0 100. Укажите исходное x0 = 1 и начальную скорость v0 = 0.
[time1,position1,time2,position2] = effectOfDamping_mex(params,1,0,100,0.01);
График положения и график времени простых и демпфированных осцилляторов. Обратите внимание, что график идентичен графику, созданному исходной функцией MATLAB.
plot(time1,position1)
hold on
plot(time2,position2)
Отображение конечных положений двух осцилляторов. Эти значения также идентичны значениям исходного кода MATLAB.
disp(position1(end))
0.8623
disp(position2(end))
0.0056
Удалите файл MEX из памяти.
clear effectOfDamping_mexСоздайте объект конфигурации кода для создания статической библиотеки C++ с интерфейсом класса. Укажите имя класса интерфейса, который должен быть 'myOscillators'. Для этих настроек генератор кода создает функцию точки входа в качестве методов класса C++ 'myOscillators'. Конструктор и деструктор этого класса интерфейса реализуют функции инициализации и завершения соответственно.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.CppInterfaceStyle = 'Methods'; cfg.CppInterfaceClassName = 'myOscillators';
Скорректируйте глобальные настройки для встраивания функции следующим образом:
Сохраните модульность написанного кода для лучшей читаемости. Набор InlineBetweenUserFunctions кому 'Readability'.
Создание высокооптимизированного кода для функций MathWorks ®, даже если это приводит к снижению читаемости кода, поскольку вы с меньшей вероятностью будете проверять эту часть базы кода. НаборInlineBetweenMathWorksFunctions кому 'Speed'.
В созданном коде отдельные функции, которые записываются, и MathWorks функционируют таким образом, что созданный код не сильно отличается от кода MATLAB. Набор InlineBetweenUserAndMathWorksFunctions кому 'Readability'.
cfg.InlineBetweenUserFunctions = 'Readability'; cfg.InlineBetweenUserAndMathWorksFunctions = 'Readability'; cfg.InlineBetweenMathWorksFunctions = 'Speed';
Дополнительные сведения об управлении режимом встраивания функций генератора кода см. в разделе Управление встроением для точной настройки производительности и читаемости сгенерированного кода.
Создайте статическую библиотеку C++ с помощью codegen команда.
codegen -config cfg effectOfDamping -args {params,0,0,0,0} -report
Code generation successful: To view the report, open('codegen/lib/effectOfDamping/html/report.mldatx').
Откройте отчет о создании кода и проверьте созданный исходный код C++:
Файлы simpleOscillator.h и simpleOscillator.cpp содержат реализацию класса C++ для простого осциллятора. Файлы dampedOscillator.h и dampedOscillator.cpp содержат реализацию класса C++ для гасящего генератора. Структура наследования классов MATLAB сглаживается в сгенерированном коде. Итак, dampedOscillator не является подклассом simpleOscillator и повторно реализует все методы, наследуемые соответствующим классом MATLAB. Дополнительные сведения о сопоставлении классов MATLAB и классов C++ см. в разделе Создание классов C++ для классов MATLAB.
Пакет MATLAB сопоставляется с пространством имен C++. В созданном коде simpleOscillator и dampedOscillator классы определены в mySystem пространство имен. Дополнительные сведения см. в разделе Организация сгенерированного кода C++ в пространства имен.
Файлы myOscillators.h и myOscillators.cpp содержат реализацию класса интерфейса myOscillators. Функция начальной точки реализована в методе myOscillators::effectOfDamping. Функции инициализации и завершения реализуются в конструкторе класса и деструкторе класса соответственно. В следующей части этого примера показано, как использовать этот интерфейс класса в пользовательской основной функции C++. Дополнительные сведения см. в разделе Создание кода C++ с интерфейсом класса.
Размер выходных аргументов effectOfDamping функции определяются входами времени выполнения timeInterval и timeStep. Таким образом, сгенерированный код представляет эти аргументы как динамические массивы C++, которые реализуются с помощью coder::array шаблон класса. В следующей части этого примера показано, как использовать coder::array шаблон класса в пользовательской основной функции C++. Дополнительные сведения см. в разделе Использование динамически распределенных массивов C++ в генерируемых функциональных интерфейсах.
Например, здесь представлено объявление сгенерированного mySystem::simpleOscillator класс, содержащийся в файле заголовка simpleOscillator.h.
type codegen/lib/effectOfDamping/simpleOscillator.h//
// File: simpleOscillator.h
//
// MATLAB Coder version : 5.2
// C/C++ source code generated on : 21-Apr-2021 01:24:07
//
#ifndef SIMPLEOSCILLATOR_H
#define SIMPLEOSCILLATOR_H
// Include Files
#include "rtwtypes.h"
#include "coder_array.h"
#include <cstddef>
#include <cstdlib>
// Type Definitions
namespace mySystem {
class simpleOscillator {
public:
void init(double m, double k);
void evolution(double initialPosition, double initialVelocity,
double timeInterval, double timeStep,
coder::array<double, 1U> &b_time,
coder::array<double, 1U> &position) const;
double dynamics(double initialPosition, double initialVelocity,
double timeInterval) const;
double amplitude(double initialPosition, double initialVelocity) const;
double angularFrequency() const;
double phase(double initialPosition, double initialVelocity) const;
protected:
double mass;
double springConstant;
};
} // namespace mySystem
#endif
//
// File trailer for simpleOscillator.h
//
// [EOF]
//
Если у вас есть Embedded Coder ®, вы можете установить VerificationMode свойства объекта конфигурации для 'SIL' и создать функцию SIL MEX effectOfDamping_sil. Этот интерфейс SIL позволяет проверить готовый исходный код в среде MATLAB. См. раздел Выполнение программного обеспечения в цикле из командной строки (встроенный кодер).
В предыдущей части этого примера при создании кода библиотеки генератор кода также создает примеры основных файлов. main.h и main.cpp в examples подпапка папки построения. Поддерживающие файлы C++ main_damped_oscillator.h и main_damped_oscillator.cpp являются измененными версиями этих файлов примеров.
В main_damped_oscillator.cpp, main функция использует класс интерфейса myOscillators для взаимодействия с созданным кодом. Эта функция использует C++ new для выделения памяти для экземпляра myOscillators, вызывает main_effectOfDamping и, наконец, освобождает память с помощью C++ delete оператор.
main_effectOfDamping выполняет те же вычисления, что и сценарий MATLAB в первой части этого примера. Он использует coder::array API для взаимодействия с динамическими массивами, созданными effectOfDamping возврат функции. В конце своего исполнения, main_effectOfDamping функция печатает конечные положения двух осцилляторов.
Создайте объект конфигурации кода для создания исполняемого файла C++. Используйте те же настройки, что и в предыдущей части этого примера.
cfg = coder.config('exe'); cfg.TargetLang = 'C++'; cfg.CppInterfaceStyle = 'Methods'; cfg.CppInterfaceClassName = 'myOscillators'; cfg.InlineBetweenUserFunctions = 'Readability'; cfg.InlineBetweenUserAndMathWorksFunctions = 'Readability'; cfg.InlineBetweenMathWorksFunctions = 'Speed';
Укажите пользовательский исходный файл C++ и пользовательскую папку включения.
cfg.CustomSource = 'main_damped_oscillator.cpp';
cfg.CustomInclude = pwd;Создание исполняемого файла с помощью codegen команда.
codegen -config cfg main_damped_oscillator.cpp main_damped_oscillator.h effectOfDamping -args {params,0,0,0,0} -report
Code generation successful: To view the report, open('codegen/exe/effectOfDamping/html/report.mldatx').
Запустите созданный исполняемый файл. Обратите внимание, что конечные позиции двух осцилляторов, возвращаемых этим выполнением, соответствуют выходам исходного кода MATLAB.
if isunix system('./effectOfDamping') elseif ispc system('effectOfDamping.exe') else disp('Platform is not supported') end
0.862319 0.00563263
ans = 0