simulink内で偏微分をしたいです

5 views (last 30 days)
健太 宮田
健太 宮田 on 14 Nov 2023
Commented: 健太 宮田 on 18 Nov 2023
6次元の状態xについての非線形ダイナミクスを線形化しようとしています。
x = f(x)
x = Ax +Bu -C
Simulink(今回はMPCを作りました)内で逐一生成される時変のu,x近傍で線形化しようとした際、ヤコビアンAに代入される値は毎回変わるので、Simulink内で、x,uを入力、Aを出力としたMATLAB functionブロックを作ろうとしています。
しかし、MATLAB Function内で微分を計算できないので、どのようにして、ヤコビアンを関数化できるのかわからずにいます。やり方を教えてください。
以下、試した事や条件などを書きます。
・手計算を行い、その結果をMATLAB function内に書くのが一番手っ取り早いですが、f(x)が複雑すぎるのでそれは考えていません。
・試してもいないですが、simulink内で生成したu,xをwork spaceに送って計算してsimulinkに送りなおす事も、余りにも時間がかかるので考えていません。
・MATLABの方で関数を作って、coder.extrinsicを用いて関数を宣言したり、Matlabfunction内で簡単な微分にだけ抑えて関数を作ったりしましたが、微分を含む関数には対応していないと出て、できませんでした。
【以下、実際に出てきたエラーです】
①外部関数を定義しようとしたら出ます。
関数 'JACOB' (タイプ'double' の入力引数) が未定義です。 'Copy_2_of_LowThrust_MPC/Subsystem/J1_block' のエラー (line 3) において、以下のエラーが出ました [dada,dade,dadi,dadom,dadOm,dadth,deda,dede,dedi,dedom,dedOm,dedth,dida,dide,didi,didom,didOm,didth,domda,domde,domdi,domdom,domdOm,domdth,dOmda,dOmde,dOmdi,dOmdom,dOmdOm,dOmdth,dthda,dthde,dthdi,dthdom,dthdOm,dthdth] = JACOB(x0,u0); コンポーネント:Simulink | カテゴリ:Model エラー
②変数を用いた式をmatlab function内で行うと出ます。
微分の次数 N は正の整数のスカラーでなければなりません。 'Copy_2_of_LowThrust_MPC/Subsystem/J1_block' のエラー (line 19) dade = diff(dadt,e_symbolic); 'Copy_2_of_LowThrust_MPC/Subsystem/J1_block' のエラー (line 102) コンポーネント:Simulink | カテゴリ:Model エラー
③外部関数から行列で帰ってくると出ます。
logical, char, int, fi, single, doubleのいずれかが必要です。mxarrayが見つかりました。MxArraysはMATLABインタープリターへの呼び出しから返されましたが、式の内部ではサポートされていません。MxArraysは、右辺で外部関数のための引数としてのみ使われる可能性があります。

Answers (1)

Toshinobu Shintai
Toshinobu Shintai on 15 Nov 2023
Symbolic Math Toolboxを使ってf(x)を定義し、"jacobian"コマンドを使ってヤコビアン式を求めるのが手っ取り早いかと思います。このヤコビアンは、"matlabFunction"というコマンドを使ってMATLAB関数に変換できます。
詳細については、以下のデモモデルの、
適応MPCというデモで紹介しています。
  1 Comment
健太 宮田
健太 宮田 on 18 Nov 2023
ありがとうございます!参考にします。

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!