Сгенерируйте классы C++ для MATLAB® Classes That Model Simple и ослабленных генераторов

Классы MATLAB служат естественной основой для моделирования физических систем:

  • Можно смоделировать простую систему как класс MATLAB. Частные свойства класса являются системными параметрами. Конструктор класса создает экземпляр системы данными параметрами. Открытый метод получает динамику системы путем возврата конечного состояния для данного начального состояния и временного интервала. Класс может также содержать другие вспомогательные методы, которые строят математический анализ из модулей.

  • Вы часто начинаете свой анализ с простой системы и затем вводите дополнительные эффекты (такие как затухание механического устройства), чтобы увеличить точность вашего анализа. В MATLAB можно смоделировать расширенную систему как подкласс, который наследовался исходному классу. Подкласс может содержать дополнительные частные свойства для дополнительных системных параметров (таких как затухание постоянного). В зависимости от специфических особенностей системы подкласс может наследовать определенные методы от базового класса и может перегрузить другие методы.

В этом примере показано, как сгенерировать Код С++ для функции MATLAB, которая сравнивает эволюцию времени простого генератора и ослабленного генератора идентичными параметрами и начальными условиями. Две системы генератора моделируются при помощи классов MATLAB simpleOscillator и dampedOscillator это задано в пакете MATLAB mySystem. Сгенерированный код содержит классы C++ для источника классы MATLAB. Пример также показывает, как классы MATLAB сопоставляют со сгенерированными классами C++ и как использовать сгенерированный код на пользовательском C++ основная функция.

Простые и ослабленные генераторы как классы MATLAB

Управление уравнениями

Простой гармонический генератор имеет два параметра, массу m и коэффициент упругости k. Угловая частота генератора ω=km. Положение генератора x в зависимости от времени t дают:

x(t)=Asin(ωt+ϕ).

Амплитуда A и постоянная фаза ϕ определяются исходным положением x0 и начальная скорость v0 из простого генератора. В этом примере, класс MATLAB simpleOscillator моделирует эту систему.

Ослабленный гармонический генератор имеет один дополнительный параметр, постоянное затухание b. Этот пример рассматривает случай где нормированный параметр затухания γ=b2m мал по сравнению с угловой частотой ω таким образом, что только эффекты затухания первого порядка являются значительными. Положение ослабленного генератора xd в зависимости от времени t :

xd(t)=Ae-γtsin(ωt+ϕd)

Как прежде, амплитуда A и постоянная фаза ϕd определяются исходным положением x0 и начальная скорость v0 из ослабленного генератора. Основной эффект затухания состоит в том, чтобы заставить амплитуду затухать экспоненциально. В этом примере, класс MATLAB dampedOscillator который является подклассом simpleOscillator моделирует ослабленную систему.

MATLAB и файлы C++

Этот пример использует эти вспомогательные файлы, которые присутствуют в текущей рабочей директории:

  • Папка +mySystem пакета содержит два файла класса simpleOscillator.m и dampedOscillator.m.

  • Функциональный effectOfDamping вычисляет и возвращает траектории простого генератора и ослабленного генератора данными параметрами и начальными условиями.

  • Заголовок C++ и исходные файлы main_damped_oscillator.h и main_damped_oscillator.cpp реализуйте пользовательский C++ основная функция, и используются, чтобы сгенерировать исполняемый файл в последней части примера.

Запустите код MATLAB

Задайте структуру params это имеет поля для трех параметров генератора. Убедитесь dampingConstant параметр мал по сравнению с springConstant и mass (в нормированных единицах).

params.springConstant = 1;
params.dampingConstant = 0.1;
params.mass = 1;

Вызовите effectOfDamping функция, чтобы вычислить положение по сравнению с траекториями времени простых и ослабленных генераторов от t=0 к t=100. Задайте исходное положение x0=1и начальная скорость v0=0.

[time1,position1,time2,position2] = effectOfDamping(params,1,0,100,0.01);

Постройте положение по сравнению с графиками времени простых и ослабленных генераторов. Наблюдайте, как амплитуда ослабленного генератора затухает экспоненциально со временем.

plot(time1,position1)
hold on
plot(time2,position2)

Figure contains an axes. The axes contains 2 objects of type line.

Отобразите конечное положение простого генератора.

disp(position1(end))
    0.8623

Отобразите конечное положение ослабленного генератора. Заметьте что, ослабив причины это конечное положение, чтобы быть близко к среднему положению xmean=0.

disp(position2(end))
    0.0056

Сгенерируйте и запущенный MEX C++

Чтобы проверять на проблемы во время выполнения, сгенерируйте 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 вычислить положение по сравнению с траекториями времени простых и ослабленных генераторов от t=0 к t=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)

Figure contains an axes. The axes contains 4 objects of type line.

Отобразите конечные положения этих двух генераторов. Эти значения также идентичны произведенным оригинальным кодом MATLAB.

disp(position1(end))
    0.8623
disp(position2(end))
    0.0056

Очистите файл MEX из памяти.

clear effectOfDamping_mex

Сгенерируйте и смотрите статическую библиотеку C++

Создайте объект настройки кода для генерации статической библиотеки 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

Смотрите также

|

Похожие темы