Классы MATLAB служат естественной основой для моделирования физических систем:
Можно смоделировать простую систему как класс MATLAB. Частные свойства класса являются системными параметрами. Конструктор класса создает экземпляр системы данными параметрами. Открытый метод получает динамику системы путем возврата конечного состояния для данного начального состояния и временного интервала. Класс может также содержать другие вспомогательные методы, которые строят математический анализ из модулей.
Вы часто начинаете свой анализ с простой системы и затем вводите дополнительные эффекты (такие как затухание механического устройства), чтобы увеличить точность вашего анализа. В MATLAB можно смоделировать расширенную систему как подкласс, который наследовался исходному классу. Подкласс может содержать дополнительные частные свойства для дополнительных системных параметров (таких как затухание постоянного). В зависимости от специфических особенностей системы подкласс может наследовать определенные методы от базового класса и может перегрузить другие методы.
В этом примере показано, как сгенерировать Код С++ для функции MATLAB, которая сравнивает эволюцию времени простого генератора и ослабленного генератора идентичными параметрами и начальными условиями. Две системы генератора моделируются при помощи классов MATLAB simpleOscillator
и dampedOscillator
это задано в пакете MATLAB mySystem
. Сгенерированный код содержит классы C++ для источника классы MATLAB. Пример также показывает, как классы MATLAB сопоставляют со сгенерированными классами C++ и как использовать сгенерированный код на пользовательском C++ основная функция.
Простой гармонический генератор имеет два параметра, массу и коэффициент упругости . Угловая частота генератора . Положение генератора в зависимости от времени дают:
Амплитуда и постоянная фаза определяются исходным положением и начальная скорость из простого генератора. В этом примере, класс MATLAB simpleOscillator
моделирует эту систему.
Ослабленный гармонический генератор имеет один дополнительный параметр, постоянное затухание . Этот пример рассматривает случай где нормированный параметр затухания мал по сравнению с угловой частотой таким образом, что только эффекты затухания первого порядка являются значительными. Положение ослабленного генератора в зависимости от времени :
Как прежде, амплитуда и постоянная фаза определяются исходным положением и начальная скорость из ослабленного генератора. Основной эффект затухания состоит в том, чтобы заставить амплитуду затухать экспоненциально. В этом примере, класс 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
функция, чтобы вычислить положение по сравнению с траекториями времени простых и ослабленных генераторов от к . Задайте исходное положение и начальная скорость .
[time1,position1,time2,position2] = effectOfDamping(params,1,0,100,0.01);
Постройте положение по сравнению с графиками времени простых и ослабленных генераторов. Наблюдайте, как амплитуда ослабленного генератора затухает экспоненциально со временем.
plot(time1,position1)
hold on
plot(time2,position2)
Отобразите конечное положение простого генератора.
disp(position1(end))
0.8623
Отобразите конечное положение ослабленного генератора. Заметьте что, ослабив причины это конечное положение, чтобы быть близко к среднему положению .
disp(position2(end))
0.0056
Чтобы проверять на проблемы во время выполнения, сгенерируйте MEX-функцию C++ для 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
вычислить положение по сравнению с траекториями времени простых и ослабленных генераторов от к . Задайте исходное положение и начальная скорость .
[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
пространство имен. Для получения дополнительной информации смотрите, Организуют Сгенерированный Код С++ в Пространства имен.
Файлы myOscillators.h
и myOscillators.cpp
содержите реализацию интерфейсного класса myOscillators
. Функция точки входа реализована в методе myOscillators::effectOfDamping
. Инициализирование и оконечные функции реализованы в конструкторе класса и деструкторе класса, соответственно. Следующая часть этого примера показывает, как использовать этот интерфейс класса на вашем пользовательском 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'
и сгенерируйте MEX-функцию SIL effectOfDamping_sil
. Этот интерфейс SIL позволяет вам проверять производство готовый исходный код в среде MATLAB. См. программное обеспечение в Выполнении цикла Из Командной строки (Embedded Coder).
В предыдущей части этого примера, когда вы генерируете код библиотеки, генератор кода также производит пример основные файлы main.h
и main.cpp
в examples
подпапка папки сборки. Поддержка файлы C++ main_damped_oscillator.h
и main_damped_oscillator.cpp
измененные версии этих файлов в качестве примера.
В main_damped_oscillator.cpp
, main
функционируйте использует интерфейсный класс myOscillators
взаимодействовать со сгенерированным кодом. Эта функция использует new
C++ оператор, чтобы выделить память для экземпляра
myOscillators
, вызывает main_effectOfDamping
функция, и наконец освобождает память при помощи delete
C++ оператор.
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