• 締切済み

平衡点とは??matlabでのコマンド・・・ 状態方程式?

現在matlabを用いて制御系を設計している者ですが。model predictive control toolboxを用いてモデル予測制御を行おうと努力しているのですが、その例題のM-fileの途中に記述されている [x0,u0,y0,dx0]=trim('model'); [A,B,C,D]=linmod('model',x0,u0); sys=ss(A,B,C,D); という部分がいまいちよくわかりません・・・。 実際に調べた所、非線形を平衡点付近で線形化し、それを状態方程式化している。みたいな感じだと思うんですが、例題のmodelを用いるとうまくまわることはまわるんですが、自分で設計した制御系のmodelを使って先程のコマンドを入力すると 「プロパティ/値の組み合わせは偶数でなければなりません。」 というエラーが起こってしまいます・・・。 自分の調べた所 trim・・・modelというシステムの初期状態x0に最も近い状態安定点 linmod・・・システムの連続空間モデル、または離散時間線形状態空間モデルを演算点のまわりで抽出 というかしこまった表現でしかわかりませんでした。 あのコマンドがいったい何を指しているのか、そして「プロパティ/値の組み合わせは偶数でなければなりません。」とはいったいどういうエラーなのか、もしわかる方がいましたら是非アドバイスお願いします。

みんなの回答

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.4

rensyuu というものが、どういった構造のモデル(?)になっているのかまったく分からないため、何とも答えようがないです。 エラーメッセージだけでは、 (1)Sum3 からデータを出力できていない (2)Transfer Fcn に渡すデータの構造が不正 ぐらいしか分かりません。 とりあえず、 (1)は出力するデータの構造を指定しているけれども、モデルのOutput端子の設計と一致していない (2)は受け取れない構造のデータを渡そうとしている といった感じでしょうか? もし、Sum3 と Transfer Fcn が直接データをやり取りしているなら、そのインターフェースが間違っているのかもしれませんね。

nannzann
質問者

お礼

そうですね。でもその問題はなんとか解決しました☆ いろいろアドバイスありがとうございます!!参考にさせて頂いた部分も多数ありますので非常に感謝しております。またmatlab関連で分からない部分等でてきましたら、質問させて頂くかもしれませんのでそのときはよろしくお願いします。

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.3

関数ss()の仕様を見る限り、sys=ss(A, B, C, D, 'min') という記述はできないように思えます。 'min'を使用するなら、おそらく以下のように記述しなければならないのではないでしょうか。 sys = ss(A, B, C, D); % 状態空間モデルの作成 sys = ss(sys, 'min'); % sys の状態空間の最小実現を計算 関数sim()のエラーメッセージにも引数は2つで記述されていますし。 > Example: MPCobj.Model.Plant = ss(G,'min')

nannzann
質問者

お礼

あ、本当ですね。ありがとうございます!!これで一歩前進しました! プロパティ/値は偶数でなければなりません。というエラーは消え、あとは ??? エラー: ==> sim --> Error in port widths or dimensions. 'rensyuu/Subsystem/inductionmotor/Sum3' の Output 端子 1 は 2 の要素をもちます。この端子は、output の信号で指定された次元 (または方向) を受け入れません。. --> Error in port widths or dimensions. 無効な次元が 'rensyuu/Subsystem/inductionmotor/Transfer Fcn' の input 端子 1 に指定されました。. というエラーだけになりました。これは帰ってくる側の信号と受け入れる側の信号の次元が違うということでしょうか・・?

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

可能性としては、 (1)'min'がプロパティだとすると、その設定値がない (2)'min'は数値情報のことで、sys=ss(A, B, C, D, min)のように使う   min = 最小値(数値) というような感じでしょうか。 ただ、関数ss()は引数を4つまでしか設定できないようなんですが…。 http://www.mathworks.com/access/helpdesk/help/toolbox/mpc/index.html?/access/helpdesk/help/toolbox/mpc/ss.html&http://translate.google.com/translate_n?hl=ja&sl=en&u=http://www.mathworks.com/access/helpdesk/help/toolbox/mpc/ss.html&prev=/search%3Fq%3Dmodel%2Bpredictive%2Bcontrol%2Btoolbox%25E3%2580%2580ss%26hl%3Dja%26lr%3D 現状の情報だけでは良く分からないので、以下の2つについても教えていただけますか? (1)sys=ss(A,B,C,D)と実行したときのエラーメッセージ (2)MATLABのCommandWindowで help ss と実行したときに表示される関数仕様

nannzann
質問者

補足

返信ありがとうございます。sys=ss(A,B,C,D)とやるだけでしたらエラーが出ないのですが、simを行うときにエラーがでてしまいます。。。そのときのエラーメッセージを以下にのせます。 ??? エラー: ==> sim MPC block (mask) 'MPC Controller1'の'InitFcn'コールバックの実行中にエラーが発生しました。 エラー ==> @mpc\private\mpc_estimator の 52 行目 Problems encountered when designing the overall state observer (Kalman filter). Model.Plant is not detectable from measured outputs. If Model.Plant was obtained using the command 'ss', try using 'ss' with option 'min'. Example: MPCobj.Model.Plant=ss(G,'min'). The overall system has unobservable modes in z=1. エラー ==> mrensyuu at 37 sim('rensyuu',Tstop); このエラーメッセージ中のIf Model.Plant was obtained using the command 'ss', try using 'ss' with option 'min'. Example: MPCobj.Model.Plant=ss(G,'min').というところを見て、'min'をつければいいのではないかと考えたのですが・・・ (2)も以下にのせておきます。よろしくおねがいします。 SS 状態空間モデルの作成、またはモデルを状態空間モデルに変換 SYS = SS(A,B,C,D) は、下記の連続状態空間モデルで表される SS オブジェクト SYS を作成します。 dx/dt = Ax(t) + Bu(t) y(t) = Cx(t) + Du(t) 適切な次元の 0 行列 D=0 を設定することができます。 行列 A,B,C,D の いくつかが不確かさをもつ場合、SS は不確かさをもつ状態空間 (USS) モデルを返します (Robust Control Toolbox のみ)。 SYS = SS(A,B,C,D,Ts) は、サンプル時間 Ts をもつ離散時間の状態空間モデルを 作成します (サンプル時間が未決定の場合、Ts=-1 を設定)。 SYS = SS は、空の SS オブジェクトを作成します。 SYS = SS(D) は、静的なゲイン行列 D を作成します。 上記のすべての場合で、様々なモデルプロパティを設定するために、入力の リストに、つぎの組み合わせを続けることができます (詳細は、LTIPROPS と タイプしてください)。 'PropertyName1', PropertyValue1, ... A,B,C,D に対する ND 配列を使用することで状態空間モデルの配列を作成できます。 A,B,C,D の最初の 2 つの次元は、状態数と入出力の数を定義し、残りの次元は配列 サイズを指定します。たとえば、 sys = ss(rand(2,2,3,4),[2;1],[1 1],0) は、SISO 状態空間モデルの 3x4 配列を作成します。SS 配列を作成するために インデックスの割り当てや、STACK を使用することもできます。 sys = ss(zeros(1,1,2)) % SISO モデルの 2x1 配列を作成 sys(:,:,1) = rss(2) % 1 番目のモデルの割り当て sys(:,:,2) = ss(-1) % 2 番目のモデルの割り当て sys = stack(1,sys,rss(5)) % 3 番目のモデルを配列に追加 SYS = SS(SYS) は、任意のクラスのシステム SYS を状態空間に変換します。 すなわち、SYS の状態空間実現を計算します。 SYS = SS(SYS,'min') は、SYS の最小実現を計算します。 参考 ltimodels, ltiprops, dss, delayss, rss, drss, lti/ssdata, tf, zpk, frd. 参照ページはHelp browserにあります doc ss

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

(1)実際に実行したコード (2)エラーの出た箇所 とりあえず、この位は書かれていないと、答えようがない気がします。  まぁ、エラー内容から察するに、linmod()かss()あたりの引数の設定がおかしそうな感じですね。  「プロパティ/値の組み合わせは偶数でなければなりません。」というのは、おそらく関数に渡すプロパティとそれに対する設定値は、一対一の関係でなければならないということだと思います。 例えば、set(handle, 'XData', x, 'YData', y, 'ZData', z)とする場合、プロパティ'XData'、'YData'、'ZData'と値「x」「y」「z」は同数指定する必要があるということではないでしょうか。

nannzann
質問者

補足

アドバイスありがとうございます。そうですね、実際に実行したコードがないと話にならないですよね。以下に書きます。 (1) %% トルク応答特性 MPCの利用 %% % Find equilibrium (平衡点を見つける) [x0,u0,y0,dx0]=trim('rensyuunaibu'); %% % x0 = offset (also used as initial condition); [A,B,C,D]=linmod('rensyuunaibu',x0,u0); sys=ss(A,B,C,D,'min'); %% MPC Controller Setup Ts=0.1; % Sampling time clear Model Model.Plant=sys; % Plant prediction model Model.Nominal.X=x0; % State vector at linearization Model.Nominal.U=u0; % Input vector at linearization Model.Nominal.Y=y0; % Output vector at linearization Model.Nominal.DX=dx0; % State derivative vector at linearization Model.Noise=0; % Output measurement noise model (white noise, zero mean, variance=0.01) p=20; m=3; weights=[]; % use default weights mpc_controller=mpc(Model,Ts,p,m,weights); %% Simulate using Simulink (Nonlinear Model + MPC Controller) Tstop=1.5; %Simulation time s = warning('query'); warning off sim('rensyuu',Tstop); warning(s); %% Simulate using SIM (Linear model + MPC Controller) Tf=round(Tstop/Ts); r=r0*ones(Tf,1); [y1,t1,u1,x1,xmpc1]=sim(mpc_controller,Tf,r); これなんですけど、まず実行させるとsys=ss(A,B,C,D);をsys=ss(A,B,C,D,'min');に変えたらどうですか?的なエラーが起こり、実際に変えて実行してみると「プロパティ/値の組み合わせは偶数でなければなりません。」というエラーが出ました。model以外のところはdemoとほぼ一緒なのでmodelに問題があるとはおもうのですが、実際にどういったエラーなのかは意味不明です・・・。ちなみにエラーの詳細は ??? エラー ==> lti.utFastSet の 10 行目 プロパティ/値 の組み合わせは偶数でなければなりません。 エラー ==> mpcc at 8 sys=ss(A,B,C,D,'min'); です。考えられる可能性としてはなにでしょうか??よろしくおねがいします。

関連するQ&A