主要内容

为MATLAB生成c++类的类模型简单、阻尼振子

MATLAB®类提供一个自然的物理系统建模框架:

  • 你可以一个简单的系统作为一个MATLAB类模型。私人类属性系统参数。类的构造函数创建了一个实例系统给定的参数。一个公共方法捕获系统的动力学通过返回给定初始状态和最终状态的时间间隔。类还可以包含其他的辅助方法,模块化的数学分析。

  • 你通常开始用一个简单的系统分析,然后介绍额外的影响(如机械阻尼)提高分析的准确性。模型在MATLAB中,可以增强系统作为一个子类继承自原始类。子类可能包含附加的私人属性附加系统参数(如阻尼常数)。根据系统的具体情况,从基类和子类可以继承某些方法可能过载的其他方法。

这个例子展示了如何为MATLAB函数生成c++代码比较简单的振荡器和阻尼振荡的时间演化与相同的参数和初始条件。这两个振荡器系统建模通过使用MATLAB类simpleOscillatordampedOscillator定义在一个MATLAB软件包mySystem。生成的代码包含源MATLAB c++类的类。示例还展示了MATLAB类映射到生成的c++类以及如何使用生成的代码在一个定制的c++的主要功能。

简单和阻尼振子MATLAB类

控制方程

一个简单谐振子有两个参数,质量 和弹簧常数 k 。振荡器的角频率 ω = k 。振荡器的位置 x 作为时间的函数 t 是由:

x ( t ) = 一个 ( ω t + ϕ )

振幅 一个 和相位常数 ϕ 由初始位置吗 x 0 和初速度 v 0 简单的振荡器。在这个例子中,MATLAB类simpleOscillator这个系统模型。

阻尼谐振子有一个额外的参数,阻尼常数 b 。这个例子中认为的规范化阻尼参数 γ = b 2 小角频率相比呢 ω 这样,只有一阶阻尼效应是显著的。阻尼振子的位置 x d 作为时间的函数 t 是:

x d ( t ) = 一个 e - - - - - - γ t ( ω t + ϕ d )

像以前一样,振幅 一个 和相位常数 ϕ d 由初始位置吗 x 0 和初速度 v 0 阻尼振荡。阻尼的主要作用是使振幅衰减指数。在这个例子中,MATLAB类dampedOscillator的子类是哪一个simpleOscillator模型的阻尼系统。

MATLAB和c++文件

这个示例使用这些支持文件在当前工作目录:金宝app

  • 包文件夹+ mySystem包含两个类文件simpleOscillator.mdampedOscillator.m

  • 这个函数effectOfDamping计算并返回一个简单的振荡器的轨迹和阻尼振子与给定参数和初始条件。

  • c++头文件和源文件main_damped_oscillator.hmain_damped_oscillator.cpp实现自定义c++主要功能和用于生成一个可执行的最后一部分的例子。

运行MATLAB代码

定义一个结构参数个数三个振荡器参数的字段。确保dampingConstant参数是小相比springConstant质量(归一化单位)。

参数个数。springConstant = 1;参数个数。dampingConstant = 0.1; params.mass = 1;

调用effectOfDamping函数来计算位置与时间的轨迹简单和阻尼振子 t = 0 t = One hundred. 。指定初始位置 x 0 = 1 和初始速度 v 0 = 0

[time1, position1 time2 position2] = effectOfDamping (params, 0100, 0.01);

情节简单、阻尼振子的位置与时间图。观察阻尼振子的振幅随时间呈指数衰减。

情节(time1 position1)情节(time2 position2)

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。

显示简单的振荡器的最终位置。

disp (position1(结束)
0.8623

显示阻尼振子的最终位置。观察到阻尼导致最后位置接近均值的位置 x 的意思是 = 0

disp (position2(结束)
0.0056

生成并运行c++墨西哥人

检查运行时问题,生成一个c++函数的墨西哥人effectOfDamping函数。指定第一个参数具有相同的类型和大小参数个数。指定其他参数标量双打。

codegen朗:c++effectOfDampingarg游戏{params, 0, 0, 0, 0}报告
代码生成成功:查看报告,打开(“codegen /墨西哥人/ effectOfDamping / html / report.mldatx”)

调用生成的墨西哥人函数effectOfDamping_mex计算简单和阻尼振子的位置与时间的轨迹 t = 0 t = One hundred. 。指定初始位置 x 0 = 1 和初始速度 v 0 = 0

[time1, position1 time2 position2] = effectOfDamping_mex (params, 0100, 0.01);

情节简单、阻尼振子的位置与时间图。观察到相同的情节是一个由原来的MATLAB函数。

情节(time1 position1)情节(time2 position2)

图包含一个坐标轴对象。坐标轴对象包含4线类型的对象。

显示最后的位置的两个振荡器。这些值也由最初的MATLAB代码相同。

disp (position1(结束)
0.8623
disp (position2(结束)
0.0056

文件从内存中清除墨西哥人。

清晰的effectOfDamping_mex

生成和检查静态c++库

创建一个配置对象生成一个静态的c++代码库和类接口。指定接口类的名称是“myOscillators”。这些设置的代码生成器产生的入口点函数作为一个c++类的方法myOscillators”。这个接口的类的构造函数和析构函数执行初始化和终止功能,分别。

cfg = coder.config (“自由”);cfg。TargetLang =“c++”;cfg。CppInterfaceStyle =“方法”;cfg。CppInterfaceClassName =“myOscillators”;

调整函数内联的全局设置:

  • 保持你写的代码的模块化更好的可读性。集InlineBetweenUserFunctions“可读性”

  • 生成高度优化的代码MathWorks®功能,即使这结果在可读的代码,因为您不太可能检查这部分代码的基础。集InlineBetweenMathWorksFunctions“速度”

  • 在生成的代码中,单独的函数编写和MathWorks功能,这样生成的代码与MATLAB代码看起来并没有多大的不同。集InlineBetweenUserAndMathWorksFunctions“可读性”

cfg。在lineBetweenUserFunctions =“可读性”;cfg。在lineBetweenUserAndMathWorksFunctions =“可读性”;cfg。在lineBetweenMathWorksFunctions =“速度”;

更多信息关于控制函数内联代码生成器的行为,明白了控制内联微调性能和生成的代码的可读性

生成一个静态的c++库使用codegen命令。

codegen配置cfgeffectOfDampingarg游戏{params, 0, 0, 0, 0}报告
代码生成成功:查看报告,打开(“codegen / lib / effectOfDamping / html / report.mldatx”)

打开代码生成报告和检查生成的c++源代码:

  • 的文件simpleOscillator.hsimpleOscillator.cpp包含c++类的实现为简单的振荡器。的文件dampedOscillator.hdampedOscillator.cpp包含c++类的实现阻尼振荡。MATLAB类的继承结构生成的代码中被夷为平地。所以,dampedOscillator不是的一个子类simpleOscillator重装所有相应的MATLAB类继承的方法。更多信息在MATLAB之间的映射类和c++类,明白了为MATLAB生成c++类的类

  • MATLAB软件包被映射到一个c++名称空间。在生成的代码中,simpleOscillatordampedOscillator类中定义mySystem名称空间。有关更多信息,请参见生成c++代码组织成名称空间

  • 的文件myOscillators.hmyOscillators.cpp包含接口的实现类myOscillators。的入口点函数的实现方法myOscillators: effectOfDamping。初始化和终止功能实现类构造函数和类的析构函数,分别。下一部分的这个例子展示了如何使用这个类界面定制c++的主要功能。有关更多信息,请参见生成c++代码的类接口

  • 的输出参数的大小effectOfDamping函数是由运行时输入timeInterval步伐。因此,生成的代码代表这些参数作为动态数组实现通过使用c++编码器:数组类模板。这个例子展示了如何使用的下一部分编码器:数组类模板定制c++的主要功能。有关更多信息,请参见使用动态分配的c++数组生成的函数接口

例如,生成的宣言mySystem: simpleOscillator类中包含的头文件simpleOscillator.h

类型codegen / lib / effectOfDamping / simpleOscillator.h
/ / / /文件:simpleOscillator。h / / / / MATLAB编码器版本:5.6 / / C / c++源代码生成:03 - mar - 2023 05:04:01 / / ifndef SIMPLEOSCILLATOR_H # define SIMPLEOSCILLATOR_H / / #包括“rtwtypes包括文件。h coder_array # include。h”# include < cstddef > # include < cstdlib > / /类型定义名称空间mySystem{类simpleOscillator{公众:空白init(双m,双k);孔隙演化(双initialPosition,双initialVelocity、双timeInterval、双步伐,编码器::<双,1 u > &b_time数组,编码器::数组<双,1 u >和地位)常量;双动力(双initialPosition,双initialVelocity,双timeInterval)常量;双振幅(双initialPosition,双initialVelocity)常量;双angularFrequency()常量;双相(双initialPosition,双initialVelocity)常量;保护:双质量;双springConstant; }; } // namespace mySystem #endif // // File trailer for simpleOscillator.h // // [EOF] //

如果你有嵌入式编码器®,您可以设置VerificationMode配置对象的属性“银”并生成一个SIL墨西哥人的功能effectOfDamping_sil。这个银接口允许您验证生产准备源代码在MATLAB环境中。看到Software-in-the-Loop从命令行执行(嵌入式编码)

生成并运行可执行文件

在前面的一部分,这个例子中,当你生成库代码,代码生成器也生产主要文件示例main.hmain.cpp例子建立文件夹的子文件夹。支持c+金宝app+文件main_damped_oscillator.hmain_damped_oscillator.cpp这些示例文件的修改版本。

  • main_damped_oscillator.cpp,主要函数使用类的接口myOscillators与生成的代码进行交互。这个函数使用c++运营商分配内存的一个实例myOscillators,调用main_effectOfDamping函数,最后通过使用c++释放内存删除操作符。

  • main_effectOfDamping函数执行相同的计算中的MATLAB脚本的第一部分这个例子。它使用编码器:数组API与动态数组生成的交互effectOfDamping函数返回。最后执行的main_effectOfDamping函数输出的最后位置两个振荡器。

创建一个配置对象生成c++代码可执行文件。使用相同的设置与前面的这个示例的一部分。

cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg。CppInterfaceStyle =“方法”;cfg。CppInterfaceClassName =“myOscillators”;cfg。在lineBetweenUserFunctions =“可读性”;cfg。在lineBetweenUserAndMathWorksFunctions =“可读性”;cfg。在lineBetweenMathWorksFunctions =“速度”;

指定自定义c++源文件,自定义包括文件夹。

cfg。CustomSource =“main_damped_oscillator.cpp”;cfg。CustomInclude = pwd;

生成一个可执行的使用codegen命令。

codegen配置cfgmain_damped_oscillator.cppmain_damped_oscillator.heffectOfDampingarg游戏{params, 0, 0, 0, 0}报告
代码生成成功:查看报告,打开(“codegen / exe / effectOfDamping / html / report.mldatx”)

运行生成的可执行文件。观察到最终位置的两个振荡器这执行返回匹配原始的MATLAB代码的输出。

如果isunix系统(”。/ effectOfDamping ')elseifispc系统(“effectOfDamping.exe”)其他的disp (平台不支持的金宝app)结束
0.862319 - 0.00563263
ans = 0

另请参阅

|

相关的话题