2016-05-12 14 views
0

MATLABを使用して、3つのPIDコントローラゲインの自動チューニングを行うコードを作成しています。私が考えているのは、自分のシステムのエラー(目的の状態と取得したものの違い)を最小限に抑えることです。そのために、PIDゲインを入力パラメータとして受け取り、計算されたエラーを返します。すなわち:"fminunc"を使用して配列を返す関数の最小化

errors_vector = closedLoopSimulation(pidGains) 

I三セットポイント(入力コマンド)を有しているので、出力errors_vectorの寸法はN私は(私の場合1000)を有する時間サンプルの数は3 * Nです。だから、私は最小限にしたい機能であり、そうするために、私はつまり、fminuncコマンドを使用してみました:

pidGains_ini = [2.4 0.1 0.4]; 
func   = @closedLoopSimulation; 
[pid, fval] = fminunc(func, pidGains_ini) 

をしかし、私は、コードの最後の部分を実行したときに、私はこのエラーを取得:

User supplied objective function must return a scalar value. 

これは明らかに、errors_vectorがスカラーではなく3 * 1000の配列であるためです。

私の質問は、プログラミングの観点からは、fminunc配列を返す関数を最小化する方法がありますか?

一方、コントロール理論の観点からは、PIDゲインを自動的に最適化する別の方法がありますか?

私は自分自身を十分に明確にしたいと思う。ベクトルを最小化

おかげで

+0

errors_vectorの方が良いと説明できますか?タイムステップごとにエラーがあるのは明らかですが、タイムステップごとに3つあるのはなぜですか?あなたは同時に3つのアウトプットをコントロールしていますか? – tvo

+1

[Ziegler-Nichols法](https://en.wikipedia.org/wiki/Ziegler-Nichols_method)と[中継方法](http://www.controleng.com/search/search-single-display/) relay-method-automates-pid-loop-tuning/4a5774decc.html)は、2つの一般的なPIDチューニング手法です。 – horchler

+0

@tvoはい、これは私がやっていることです。私のシステムはMIMOであり、3つの入力コマンドと3つの制御作業がPIDコントローラから出力されています。 –

答えて

1

非常によく(そこ多目的​​または多基準最適化と呼ばれるものがあるが、それは多少の専門である)に定義されていません。 「通常の」最適化メソッドは、スカラ目標を最小化(または最大化)するだけです。私はあなたのケースでは、二乗誤差の合計を取ってそれを最小化することによって、そのような目的を形成することができると考えています。これは標準的な操作手順であり、しばしば「最小二乗」と呼ばれます。

+0

MATLABで 'lsqnonlin'を使うのはどうですか?それは私の場合は、配列を返す関数でうまく動作するとは限りません。 –

+1

はい、それは自動的にあなたのための目的(二乗和)を形成します。 –

関連する問題