主要内容

シンプルな振動子と減衰振動子をモデル化するmatlabクラスに対応するc++クラスの生成

Matlab®クラスは,物理システムをモデル化するための自然なフレ,ムワ,クを提供します。

  • シンプルなシステムをmatlabクラスとしてモデル化できます。プラベトなクラスプロパティはシステムパラメタです。クラスコンストラクタは,指定されたパラメタを使用してシステムのンスタンスを作成します。パブリックメソッドは,指定された初期状態と時間間隔の最終状態を返すことで,システムのダイナミクスを取得します。クラスには,数学的な解析をモジュ,ル化する他の補助メソッドを含めることもできます。

  • 多くの場合,シンプルなシステムで解析を開始し,追加効果(機械的な減衰など)を導入して解析の正確性を向上させます。Matlabでは,元のクラスから継承するサブクラスとして,拡張システムをモデル化できます。サブクラスには,追加のシステムパラメーターに対応する追加のプライベートプロパティが含まれる場合があります(減衰定数など)。システムの仕様によっては,サブクラスが基底クラスから特定のメソッドを継承し,他のメソッドをオーバーロードする場合があります。

この例では,同じパラメーターと初期条件を使用してシンプルな振動子と減衰振動子の時間発展を比較するMATLAB関数に対応するc++コードを生成する方法を示します。2 .の振動子システムは,matlabパッケ,ジmySystem内で定義されているmatlabクラスsimpleOscillatorおよびdampedOscillatorを使用してモデル化されます。生成されたコ,ドには,ソ,スmatlabクラスに対応するc++クラスが含まれます。この例では,生成された C++ クラスに MATLAB クラスがどのようにマッピングされるか、および生成されたコードをカスタム C++ main 関数でどのように使用するかも示します。

Matlabクラスとしてのシンプルな振動子と減衰振動子

支配方程式

シンプルな調和振動子には,質量 とバネ定数 k の2のパラメタがあります。振動子の角周波数は ω k です。時間 t の関数としての振動子の位置 x は次のようになります。

x t 一个 ω t + ϕ

振幅 一个 と位相定数 ϕ は,シンプルな振動子の初期位置 x 0 と初期速度 v 0 で決まります。この例では,MATLABクラスsimpleOscillatorによってこのシステムがモデル化されます。

減衰調和振動子には,減衰定数 b という追加のパラメタが1あります。この例では,正規化された減衰パラメ,タ, γ b 2 が角周波数 ω と比較して小さく,1次の減衰効果のみが顕著な場合を検討します。時間 t の関数としての減衰振動子の位置 x d は次のようになります。

x d t 一个 e - γ t ω t + ϕ d

前述のように,振幅 一个 と位相定数 ϕ d は,減衰振動子の初期位置 x 0 と初期速度 v 0 で決まります。減衰の主効果は,振幅を指数的に減衰させることです。この例では,simpleOscillatorモデルのサブクラスであるmatlabクラスdampedOscillatorによって減衰システムがモデル化されます。

Matlabファ▪▪ルとc++ファ▪▪ル

この例では,現在の作業ディレクトリにある次のサポ,トファ,ルを使用します。

  • パッケジフォルダ+ mySystemには,2のクラスファsimpleOscillator.mおよびdampedOscillator.mが含まれています。

  • 関数effectOfDampingは,指定されたパラメーターと初期条件を使用して,シンプルな振動子と減衰振動子の軌跡を計算して返します。

  • c++ヘッダファルmain_damped_oscillator.hおよびソスファルmain_damped_oscillator.cppは,カスタムc++主要関数を実装しており,この例の最後の部分で実行可能ファイルを生成するために使用されます。

Matlabコ,ドの実行

3構造体参数个数を定義します。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,1,0,100,0.01);

シンプルな振動子と減衰振動子の位置と時間のグラフをプロットします。時間の経過に伴い、減衰振動子の振幅がどのように指数的に減衰するかを確認します。

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

图中包含一个轴对象。axis对象包含2个line类型的对象。

シンプルな振動子の最終位置を表示します。

disp (position1(结束)
0.8623

減衰振動子の最終位置を表示します。減衰によってこの最終位置が平均位置 x 的意思是 0 に近づくことを確認します。

disp (position2(结束)
0.0056

c++ mexの生成と実行

実行時の問題を確認するには,関数effectOfDampingに対応するc++ mex関数を生成します。最初の引数は参数个数と同じ型およびサ▪▪▪ズをも▪▪▪ように指定します。その他の引数は双型のスカラ,に指定します。

codegen朗:c++effectOfDampingarg游戏{params, 0, 0, 0, 0}报告
要查看报告,打开('codegen/mex/effectOfDamping/html/report.mldatx')

生成されたmex関数effectOfDamping_mexを呼び出して,シンプルな振動子と減衰振動子の位置と時間の軌跡を t 0 から t One hundred. まで計算します。初期位置 x 0 1 と初期速度 v 0 0 を指定します。

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

シンプルな振動子と減衰振動子の位置と時間のグラフをプロットします。プロットが元のmatlab関数によって生成されたプロットと同じであることを確認します。

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

图中包含一个轴对象。axis对象包含4个line类型的对象。

2の振動子の最終位置を表示します。これらの値も元のmatlabコ,ドによって生成された値と同じです。

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

墨西哥ファ苹果苹果ルをメモリからクリアします。

清晰的effectOfDamping_mex

c++スタティックラaapl . exeブラリの生成と検査

クラスインターフェイスをもつc++スタティックライブラリの生成用にコード構成オブジェクトを作成します。インターフェイスクラスの名前を”myOscillators”に指定します。以下の設定では,コドジェネレタはエントリポント関数をc++クラス’myOscillators”のメソッドとして生成します。このインターフェイスクラスのコンストラクターとデストラクターは,それぞれ初期化関数と終了関数を実装します。

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

関数の@ @ンラ@ @ン化のグロ@ @バル設定を次のように調整します。

  • 可読性を高めるために記述したコ,ドのモジュ,ル性を維持します。InlineBetweenUserFunctions“可读性”に設定します。

  • コードの可読性が低下するとしても,MathWorks®関数の高度に最適化されたコードを生成します。コ,ドベ,スのこの部分を検査する可能性は低いためです。InlineBetweenMathWorksFunctions“速度”に設定します。

  • 生成コードで,記述した関数とMathWorks関数を分離して,生成コードの外観がMATLABコードとあまり異ならないようにします。InlineBetweenUserAndMathWorksFunctions“可读性”に設定します。

cfg。InlineBetweenUserFunctions =“可读性”;cfg。InlineBetweenUserAndMathWorksFunctions =“可读性”;cfg。InlineBetweenMathWorksFunctions =“速度”

コドジェネレタの関数のンラン化動作を制御する方法の詳細にいては,生成コドのパフォマンスと可読性を微調整するためのンラン化の制御を参照してください。

codegenコマンドを使用してc++スタティックラescブラリを生成します。

codegen配置cfgeffectOfDampingarg游戏{params, 0, 0, 0, 0}报告
要查看报告,打开('codegen/lib/effectOfDamping/html/report.mldatx')

コド生成レポトを開き,生成されたc++ソスコドを検査します。

  • ファereplicationルsimpleOscillator.hおよびsimpleOscillator.cppには,シンプルな振動子のc++クラスの実装が含まれています。ファereplicationルdampedOscillator.hおよびdampedOscillator.cppには,減衰振動子のc++クラスの実装が含まれています。MATLABクラスの継承構造は、生成されたコードではフラットになります。そのため、dampedOscillatorsimpleOscillatorのサブクラスではなく,対応するmatlabクラスが継承するすべてのメソッドを再実装します。Matlabクラスとc++クラスのマッピングの詳細に程序いてはMatlabクラスに対応するc++クラスの生成を参照してください。

  • Matlabパッケジはc++名前空間にマッピングされています。生成されたコ,ドでは,simpleOscillatorクラスとdampedOscillatorクラスはmySystem名前空間で定義されています。詳細にいては,生成されたc++コドの名前空間への整理を参照してください。

  • ファereplicationルmyOscillators.hおよびmyOscillators.cppには,myOscillatorsの実装が含まれています。エントリポ@ @ント関数はメソッドmyOscillators: effectOfDampingに実装されています。初期化関数と終了関数は,それぞれクラスコンストラクターとクラスデストラクターに実装されています。この例の次の部分では,このクラス インターフェイスをカスタム C++ main 関数で使用する方法を示します。詳細については、クラスンタフェスをもc++を参照してください。

  • 関数effectOfDampingの出力引数のサesc escズは,実行時の入力timeIntervalおよび步伐で決まります。そのため,生成されたコ,ドでは,これらの引数は编码器:数组クラステンプレトを使用して実装される動的な配列c++として表されます。この例の次の部分では,编码器:数组クラステンプレ,トをカスタムc++主関数で使用する方法を示します。詳細にいては,生成された関数esc esc esc esc esc esc esc esc escを参照してください。

たとえば,ヘッダ,ファ,ルsimpleOscillator.hに含まれている生成されたmySystem: simpleOscillatorクラスの宣言を次に示します。

类型codegen / lib / effectOfDamping / simpleOscillator.h
// //文件:simple振荡器.h // // MATLAB代码版本:5.4 // C/ c++源代码生成于:26- 2月-2022 10:49:59 // #ifndef simple振荡_h #定义simple振荡_h // Include Files # Include "rtwtypes.h" # Include "coder_array.h" # Include  # Include  //类型定义命名空间mySystem{类simple振荡器{公共:void init(双m,双k);void evolution(double initialPosition, double initialVelocity, double timeInterval, double timeStep, coder::array &b_time, coder::array &position) const;const (double initialPosition, double initialVelocity, double timeInterval);double amplitude(double initialPosition, double initialVelocity);double angularFrequency()常量;const (double initialPosition, double initialVelocity);保护:双倍质量;双springConstant;};} //命名空间mySystem #endif // // simpleOscillator.h // // [EOF] //

Embedded Coder®をお持の方は,構成オブジェクトのVerificationModeプロパティを“银”に設定して,sil mex関数effectOfDamping_silを生成できます。このSILインターフェイスを使用すると,MATLAB環境内で製品向けソースコードを検証できます。从命令行执行软件在循环(嵌入式编码)を参照してください。

実行可能ファ@ @ルの生成と実行

この例の前の部分でライブラリコードを生成した際に,コードジェネレーターはメインファイルの例main.hおよびmain.cppもビルドフォルダ,の例子サブフォルダ,に生成しています。c++サポトファルmain_damped_oscillator.hおよびmain_damped_oscillator.cppは,これらのサンプルファ。

  • main_damped_oscillator.cppでは,主要関数が▪▪ンタ▪▪フェ▪▪スクラスmyOscillatorsを使用して生成コ,ドを操作します。この関数は,c++演算子を使用してmyOscillatorsのesc escンスタンスにメモリを割り当て,関数main_effectOfDampingを呼び出して,最後にc++删除演算子を使用してメモリを解放します。

  • 関数main_effectOfDampingは,この例の最初の部分でmatlabスクリプトが実行した計算と同じ計算を実行します。编码器:数组APIを使用して,生成された関数effectOfDampingによって返される動的な配列を操作します。関数main_effectOfDampingは,その実行の終了時に2の振動子の最終位置を出力します。

C++実行可能ファC++実行可能ファC++ルの生成用にコC++ド構成オブジェクトを作成します。この例の前の部分と同じ設定を使用します。

CFG = code .config(exe”);cfg。TargetLang =“c++”;cfg。CppInterfaceStyle =“方法”;cfg。CppInterfaceClassName =“myOscillators”;cfg。InlineBetweenUserFunctions =“可读性”;cfg。InlineBetweenUserAndMathWorksFunctions =“可读性”;cfg。InlineBetweenMathWorksFunctions =“速度”

カスタム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')

生成された実行可能ファ@ @ルを実行します。この実行で返される2つの振動子の最終位置が,元のMATLABコードの出力と一致することを確認します。

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

参考

|

関連するトピック