Main Content

Simulink モデルでの fminimax の使用

この例では、Simulink® モデルのパラメーターを調整する方法を示します。この例を実行すると、モデル optsim が含まれます。このモデルは Simulink ブロック線図としてモデル化された非線形プロセス プラントを含みます。

飽和要素を含むアクチュエータをもつプラント

このプラントは、アクチュエータに制限をもつ低減衰の 3 次のモデルです。アクチュエータは、飽和制限とスルーレート制限をもちます。アクチュエータの飽和制限により、入力値が最大 2 単位、最小 -2 単位の範囲に制限されます。そしてその変化率も 0.8 単位 / 秒以内としています。ステップ入力のシステムの閉ループ応答を閉ループ応答に示します。(コマンド ラインで optsim と入力するか、モデル名をクリックして) モデルを開き、[シミュレーション] メニューから [実行] を選択すると、この応答を確認できます。応答は Scope ブロックにプロット表示されます。

閉ループ応答

問題は、システムへの単位ステップ入力をトラックするフィードバック制御ループの設計です。閉ループ プラントは、プラントとアクチュエータをまとめて 1 つの階層構造の Subsystem ブロックとして表します。Scope ブロックは、設計プロセスの間、出力軌跡を表示します。

閉ループ モデル

このシステムを最適化するには、0 と 100 の間の任意の時刻 t での出力の最大値を最小にします。(対照的に、Simulink モデルでの lsqnonlinの例では、出力と入力信号の間の誤差を最小化して解を求めます。)

この例のコードは、補助関数 runtrackmm に含まれています (の例の終わりに掲載)。目的関数は、単に sim コマンドによって返される出力 yout です。しかし、全タイム ステップで最大出力を最小化すると、いくつかのタイム ステップに対して出力が 1 よりはるかに小さくなる可能性があります。はじめの 20 秒後、0.95 を超える出力を保つために、制約関数 trackmmcont = 20 から t = 100 まで制約 yout >= 0.95 を含みます。制約は g0 の形式でなければならないので、関数における制約は g = -yout(20:100) + 0.95 です。

trackmmobjtrackmmcon は共に現在の PID 値から計算された sim からの結果 yout を使用します。シミュレーションを 2 回呼び出さないようにするために、runtrackmm では入れ子関数になっており、yout の値が目的関数と制約関数で共有されるようになっています。シミュレーションは現在の点が変化した場合にのみ呼び出されます。

runtrackmm を呼び出します。

[Kp,Ki,Kd] = runtrackmm
                  Objective        Max     Line search     Directional 
 Iter F-count         value    constraint   steplength      derivative   Procedure 
    0      5              0       1.11982                                            
    1     11          1.184       0.07978            1           0.482     
    2     17          1.012       0.04285            1          -0.236     
    3     23         0.9996       0.00397            1         -0.0195    Hessian modified twice  
    4     29         0.9996     3.464e-05            1        0.000687    Hessian modified  
    5     35         0.9996     2.274e-09            1         -0.0175    Hessian modified twice  

Local minimum possible. Constraints satisfied.

fminimax stopped because the predicted change in the objective function
is less than the value of the function tolerance and constraints 
are satisfied to within the value of the constraint tolerance.
Kp = 0.5894
Ki = 0.0605
Kd = 5.5295

出力の Objective value 列の最後の値は、全タイム ステップに対する最大値が 1 よりわずかに少ない値であることを表しています。閉ループ応答の結果を図 fminimax を使用する閉ループ応答に示します。

この解は問題の定式化を異なる方法で行った Simulink モデルでの lsqnonlin の解とは異なります。

fminimax を使用する閉ループ応答

補助関数

次のコードは補助関数 runtrackmm を作成します。

function [Kp, Ki, Kd] = runtrackmm

optsim % initialize Simulink(R)
pid0 = [0.63 0.0504 1.9688];
% a1, a2, yout are shared with TRACKMMOBJ and TRACKMMCON
a1 = 3; a2 = 43; % Initialize plant variables in model
yout = []; % Give yout an initial value
pold = []; % tracks last pid
opt = simset('solver','ode5','SrcWorkspace','Current');
options = optimset('Display','iter',...
    'TolX',0.001,'TolFun',0.001);
pid = fminimax(@trackmmobj,pid0,[],[],[],[],[],[],...
    @trackmmcon,options);
Kp = pid(1); Ki = pid(2); Kd = pid(3);

    function F = trackmmobj(pid)
        % Track the output of optsim to a signal of 1.
        % Variables a1 and a2 are shared with RUNTRACKMM.
        % Variable yout is shared with RUNTRACKMM and 
        % RUNTRACKMMCON.
        updateIfNeeded(pid)
        
        F = yout;
    end

    function [c,ceq] = trackmmcon(pid)
        % Track the output of optsim to a signal of 1.
        % Variable yout is shared with RUNTRACKMM and
        % TRACKMMOBJ
        updateIfNeeded(pid)
        
        c = -yout(20:100)+.95;
        ceq=[];
    end

    function updateIfNeeded(pid)
         if ~isequal(pid,pold) % compute only if needed
            
            Kp = pid(1);
            Ki = pid(2);
            Kd = pid(3);
            
            [~,~,yout] = sim('optsim',[0 100],opt);
            
            pold = pid;
         end
    end
        
end

参考

関連するトピック