並列計算による調整の高速化
この例では、Parallel Computing Toolbox™ を使用して、固定構造制御システムを調整するための多スタート戦略を高速化する方法を説明します。
背景
systune
と looptune
はどちらも、使用中の制御アーキテクチャを調整するための局所的な最適化手法を使用します。最終的に局所的には最適でも、大域的には不適切な設計になるリスクを軽減するため、ランダムに生成された異なる初期点から始まる複数の最適化を実行することをお勧めします。マルチコア マシンがある場合または分散コンピューティング リソースにアクセスしている場合は、Parallel Computing Toolbox を使ってこの処理を大幅に高速化できます。
この例では、looptune
を使用して機体の自動操縦の調整を並列化する方法を説明します。この looptune
の適用の詳細については、「2 ループ自動操縦の調整」の例を参照してください。
自動操縦の調整
機体のダイナミクスと自動操縦が Simulink でモデル化されます。
open_system('rct_airframe1')
自動操縦は 2 つのカスケード式ループで構成され、その調整可能な要素には 2 つの PI コントローラー ゲイン ("az Control" ブロック) とピッチレート ループの 1 つのゲイン ("q Gain" ブロック) が含まれます。垂直加速度 az
は、1 秒の応答時間でコマンド azref
に追従する必要があります。slTuner
を使用してこの調整タスクを構成します (詳細については、「2 ループ自動操縦の調整」の例を参照)。
ST0 = slTuner('rct_airframe1',{'az Control','q Gain'}); addPoint(ST0,{'az ref','delta fin','az','q'}) % Design requirements wc = [3,12]; % bandwidth TrackReq = TuningGoal.Tracking('az ref','az',1); % tracking
looptune による並列調整
looptune
を使って自動操縦ゲインを調整することができます。品質の低い局所的最小値を得るリスクを最小限にするには、3 つのゲインのランダムに生成された 30 個の値から開始される 30 回の最適化を実行します。この 30 回の実行の並列処理を可能にするため looptune
オプションを次のように構成します。
rng('default') Options = looptuneOptions('RandomStart',30,'UseParallel',true);
次に、looptune
を呼び出して調整アルゴリズムを開始します。30 回の実行は、使用可能なコンピューティング リソースに自動的に分散されます。
Controls = 'delta fin'; Measurements = {'az','q'}; [ST,gam,Info] = looptune(ST0,Controls,Measurements,wc,TrackReq,Options);
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.075) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.04) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.06) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Peak gain = 1e+03, Iterations = 59 Final: Peak gain = 1.23, Iterations = 49 Final: Failed to enforce closed-loop stability (max Re(s) = 0.062) Final: Failed to enforce closed-loop stability (max Re(s) = 0.041) Final: Failed to enforce closed-loop stability (max Re(s) = 0.078) Final: Peak gain = 1.23, Iterations = 133 Final: Peak gain = 1.23, Iterations = 59 Final: Peak gain = 1.23, Iterations = 61 Final: Failed to enforce closed-loop stability (max Re(s) = 0.083) Final: Peak gain = 1e+03, Iterations = 61 Warning: Tuning goal "Open loop CG": Feedback configuration has fixed integrators that cannot be stabilized with available tuning parameters. Make sure these are modeling artifacts rather than physical instabilities.
ほとんどの実行では最適なゲイン値として 1.23 が返されます。これは、この局所的最小値に幅広い引き込み領域があり、大域的最適値になる可能性があることを示唆しています。showBlockValue
を使用して対応するゲイン値を確認します。
showBlockValue(ST)
AnalysisPoints_ = D = u1 u2 u3 u4 y1 1 0 0 0 y2 0 1 0 0 y3 0 0 1 0 y4 0 0 0 1 Name: AnalysisPoints_ Static gain. ----------------------------------- az_Control = 1 Kp + Ki * --- s with Kp = 0.00165, Ki = 0.00166 Name: az_Control Continuous-time PI controller in parallel form. ----------------------------------- q_Gain = D = u1 y1 1.983 Name: q_Gain Static gain.
このゲインのセットに対する閉ループ応答をプロットします。
T = getIOTransfer(ST,'az ref','az'); step(T,5)