exponenta event banner

Создание классов C++ для классов MATLAB ®, моделирующих простые и демпфирующие осцилляторы

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

  • Простую систему можно моделировать как класс MATLAB. Свойства частного класса являются системными параметрами. Конструктор класса создает экземпляр системы с заданными параметрами. Публичный метод фиксирует динамику системы, возвращая конечное состояние для данного начального состояния и временного интервала. Класс может также содержать другие вспомогательные методы, которые модулируют математический анализ.

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

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

Простые и демпфированные осцилляторы как классы MATLAB

Управляющие уравнения

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

x (t) = sin (

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

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

xd (t) = E-γ t sin (

Как и ранее, амплитуда А и фазовая константа δ 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

Создать и запустить C++ MEX

Чтобы проверить наличие проблем во время выполнения, создайте функцию 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 для вычисления положения и временных траекторий простых и демпфированных осцилляторов от 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 пространство имен. Дополнительные сведения см. в разделе Организация сгенерированного кода 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

См. также

|

Связанные темы