Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

並列計算による調整の高速化

この例では、Parallel Computing Toolbox™ を使用して、固定構造制御システムを調整するための多スタート戦略を高速化する方法を説明します。

背景

systunelooptune はどちらも、使用中の制御アーキテクチャを調整するための局所的な最適化手法を使用します。最終的に局所的には最適でも、大域的には不適切な設計になるリスクを軽減するため、ランダムに生成された異なる初期点から始まる複数の最適化を実行することをお勧めします。マルチコア マシンがある場合または分散コンピューティング リソースにアクセスしている場合は、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 6 workers.
Final: Failed to enforce closed-loop stability (max Re(s) = 0.042)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.039)
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.082)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.041)
Final: Peak gain = 1.23, Iterations = 53
Final: Peak gain = 62, Iterations = 92
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 62, Iterations = 128
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 1.23, Iterations = 128
Final: Failed to enforce closed-loop stability (max Re(s) = 0.041)
Final: Peak gain = 1.23, Iterations = 130
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.04)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.041)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.082)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.041)
Final: Peak gain = 1.23, Iterations = 98
Final: Peak gain = 61.9, Iterations = 79
Final: Failed to enforce closed-loop stability (max Re(s) = 0.039)
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.082)
Final: Failed to enforce closed-loop stability (max Re(s) = 0.051)
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 = 1.23, Iterations = 42

ほとんどの実行では最適なゲイン値として 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.985
 
Name: q_Gain
Static gain.

このゲインのセットに対する閉ループ応答をプロットします。

T = getIOTransfer(ST,'az ref','az');
step(T,5)

参考

| (Simulink Control Design) | (Simulink Control Design)