メインコンテンツ

ゲイン スケジュール制御の隠れ結合

この例では、コントローラーの構成に応じてゲイン スケジュール制御で発生する可能性がある "隠れ結合" について説明します。これは、[1] の例 2、8、9、11 に対応します。

LPV プラント

次の方程式で非線形プラントが定義されます。

dxdt=-x+u

y=tanh(x)

平衡点の集合は p=y[-1,1] でパラメーター化されています。

(x0(p),u0(p),y0(p))=(tanh-1(p),tanh-1(p),p)

これらの平衡点の周囲の線形化によって LPV モデルが得られます。

x˙=-(x-x0(p))+(u-u0(p))

y=y0(p)+(1-p2)(x-x0(p))

lpvss を使用して、この LPV プラントを作成します。データ関数はファイル lpvHCModel.m で定義されています。tanh-1(p)|p|=1 で無限であるため、特異点を避けるために p を範囲 [–0.99,0.99] にクリップします。

pmax = 0.99;
G = lpvss('p',@(t,p) lpvHCModel(t,p,pmax),'StateName','x');

ゲイン スケジュール PI コントローラー

ゲイン スケジュールの比例積分 (PI) コントローラー K(p) は、領域の各点において閉ループの減衰比 ζd=23 および固有振動数 ωd=1 を達成するように設計されています。このコントローラーは 2 つの異なる形式で作成できます。

  • コントローラー Kin では、積分器の入力に積分ゲインがあります。

x˙c=Ki(p)e

u=xc+Kp(p)e

  • コントローラー Kout では、積分器の出力に積分ゲインがあります。

x˙c=e

u=Ki(p)xc+Kp(p)e

これらの形式は、p が定数であれば等価です。ただし、パラメーターが時間によって変化する場合は 2 つの形式で入出力応答が異なります。この例では、これらの 2 つのオプションの閉ループ性能を比較します。

この例では、これらの 2 つのコントローラーのコードがファイル hcKinFCN.m および hcKoutFCN.m に用意されています。lpvss を使用して 2 つのコントローラーを作成します。

Kin = lpvss('p',@(t,p) hcKinFCN(t,p,pmax));
Kout = lpvss('p',@(t,p) hcKoutFCN(t,p,pmax));

feedback を使用して、各コントローラーの閉ループ システムの LPV モデルを作成します。

CLin = feedback(G*Kin,1);
CLout = feedback(G*Kout,1);

LTI の解析

いくつかの p の固定値について、閉ループ応答を評価します。

5 つの p 値で LPV システムをサンプリングします。

Nvals = 5;
pvals = linspace(-0.9,0.9,Nvals);
CLinvals = sample(CLin,[],pvals);
CLoutvals = sample(CLout,[],pvals);

p の固定値に対するボード応答をプロットします。

bode(CLinvals,'b',CLoutvals,'r--',{1e-2,1e1});

MATLAB figure

p が定数の場合、積分ゲインの位置はコントローラーに影響しません。したがって、2 つのフィードバック ループの応答が同じになります。

LPV シミュレーション

2 つのステップ振幅 rstep = 0.3 および rstep = 0.7 について、閉ループ LPV モデルのステップ応答を計算します。これにより、非線形モデルに対する各ゲイン スケジュール コントローラーの追従性能の近似が得られます。どちらのコントローラーでも p=y をスケジューリング変数として使用します。

Kout では p>0.725 においてフィードバック ループが局所的に不安定になり、Kin では p<1 のすべてにおいて局所的な安定性が維持されます [1]。これらの結果を LPV シミュレーションで再現してみます。

Tf = 30;
tsim = linspace(0,Tf,1000);
xinit = [0;0];
rstep  = 0.3;
Config = RespConfig('Amplitude',rstep,'Delay',1,'InitialState',xinit);
pFcn = @(t,x,u) tanh(x(1));
step(CLin,CLout,tsim,pFcn,Config), grid
title('Step Amplitude 0.3')
legend('Kin','Kout','location','Best')

MATLAB figure

rstep  = 0.7;
Config = RespConfig('Amplitude',rstep,'Delay',1,'InitialState',xinit);
step(CLin,CLout,tsim,pFcn,Config), grid
title('Step Amplitude 0.7')
legend('Kin','Kout','location','Best')

MATLAB figure

LPV シミュレーションにおいて、Kin (積分器の入力の積分ゲイン) ではフィードバック ループの安定性が維持されますが、Kout では大きい設定点の変化でリミット サイクルが見られます。出力 y が 1 を超えることはないため、このサイクルは実際の非線形動作の近似にすぎません。LPV プラント モデルは局所的に線形であり、関数 tanh の飽和動作を捉えることはできません。

LPV モデルの忠実度をさらに評価するために、非線形シミュレーションで実際の非線形プラントを使用して比較します。

閉ループ システムの Simulink® モデルを開きます。

mdl = 'HiddenCouplings';
open_system(mdl)

積分器の出力の Ki で応答をシミュレートします。

usey = 1; 
useKout = 1;
simout = sim('HiddenCouplings',Tf);

LPV と非線形の応答をコントローラー Kout で比較します。

y = step(CLout,tsim,pFcn,Config);
plot(tsim,y,simout.tout,simout.y,'--')
title('Limit cycle detection for Kout')
legend('LPV','Nonlinear','location','Best')

Figure contains an axes object. The axes object with title Limit cycle detection for Kout contains 2 objects of type line. These objects represent LPV, Nonlinear.

予想どおり、tanh の厳密な非線形性により、結果は完全には一致しません。それでも、LPV シミュレーションでは、ほぼ正しい周期でリミット サイクルが正しく予測されます。

基準信号でのスケジューリング

y=tanh(x) でスケジューリングすると、スケジューリング機能によってプラントとコントローラーの間に追加のフィードバック ループが作成されます。つまり、step でシミュレートされた閉ループ モデルは準 LPV であり、状態依存のスケジューリングが原因で不安定になります。出力 y は基準信号 r に追従することになるため、真に外因的な信号である r でコントローラーをスケジューリングすることが代替手法となります。step コマンドでパラメーターの軌跡 p=tanh(x)p=r に置き換えることで、2 つの手法を簡単に比較できます。

rstep  = 0.3;
Config = RespConfig('Amplitude',rstep,'Delay',1,'InitialState',xinit);
r = rstep*(tsim>=1);
step(CLin,CLout,'r--',tsim,r,Config), grid
title('Scheduling on r, Step Amplitude 0.3')
legend('Kin','Kout','location','Best')

MATLAB figure

より大きいステップ振幅でシミュレートします。

rstep  = 0.7;
Config = RespConfig('Amplitude',rstep,'Delay',1,'InitialState',xinit);
step(CLin,CLout,'r--',tsim,r,Config), grid
Warning: While saving an object of class 'controllib.chart.StepPlot':
Legend cannot be a child of AxesLayoutManager.

Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.mixin.chartview.core.LegendMixin/initializeLegends', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+mixin/+chartview/+core/LegendMixin.m', 226)" style="font-weight:bold">controllib.chart.internal.mixin.chartview.core.LegendMixin/initializeLegends</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+mixin/+chartview/+core/LegendMixin.m',226,0)">line 226</a>)
                    set(this.Legends(ii,jj),Axes=ax(ii,jj),Parent=ax(ii,jj).Parent,...
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.mixin.chartview.core.LegendMixin/updateLegends', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+mixin/+chartview/+core/LegendMixin.m', 105)" style="font-weight:bold">controllib.chart.internal.mixin.chartview.core.LegendMixin/updateLegends</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+mixin/+chartview/+core/LegendMixin.m',105,0)">line 105</a>)
                initializeLegends(this);
                ^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.foundation.BaseChartView/updateAxes', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/BaseChartView.m', 661)" style="font-weight:bold">controllib.chart.internal.foundation.BaseChartView/updateAxes</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/BaseChartView.m',661,0)">line 661</a>)
            updateLegends(this);
            ^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.foundation.BaseChartView/update', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/BaseChartView.m', 414)" style="font-weight:bold">controllib.chart.internal.foundation.BaseChartView/update</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/BaseChartView.m',414,0)">line 414</a>)
            updateAxes(this);
            ^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.foundation.AbstractPlot/updateView', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/AbstractPlot.m', 658)" style="font-weight:bold">controllib.chart.internal.foundation.AbstractPlot/updateView</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/AbstractPlot.m',658,0)">line 658</a>)
            update(this.View);
            ^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.foundation.AbstractPlot/update', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/AbstractPlot.m', 574)" style="font-weight:bold">controllib.chart.internal.foundation.AbstractPlot/update</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+foundation/AbstractPlot.m',574,0)">line 574</a>)
                updateView(this);
                ^^^^^^^^^^^^^^^^
Error in matlab.graphics.chart.internal.ChartBaseProxy/doUpdateInternal

Error in matlab.graphics.chart.internal.ChartBaseProxy/doUpdateChart

Error in matlab.graphics.chartcontainer.mixin.internal.Positionable/get.InnerPosition

Error in matlab.graphics.chartcontainer.mixin.internal.Positionable/getPositionStorageImpl

Error in matlab.graphics.chartcontainer.mixin.internal.Positionable/get.PositionStorage

Error in matlab.internal.editor.figure.SerializedFigureState/serialize

Error in matlab.internal.editor.FigureProxy/createWebFigureSnapshot

Error in matlab.internal.editor.FigureManager

Error in matlab.internal.editor.FigureManager

Error in matlab.internal.editor.FigureManager.saveSnapshot

Error in matlab.internal.editor.FigureManager

Error in matlab.internal.editor.FigureManager.figureBeingCleared

Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('matlab.graphics.internal.clearNotify', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/graphics/graphics/+matlab/+graphics/+internal/clearNotify.m', 43)" style="font-weight:bold">matlab.graphics.internal.clearNotify</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/graphics/graphics/+matlab/+graphics/+internal/clearNotify.m',43,0)">line 43</a>)
        matlab.internal.editor.FigureManager.figureBeingCleared(fig, flag);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.utils.ControlsChartFactory/parseAxes', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m', 357)" style="font-weight:bold">controllib.chart.internal.utils.ControlsChartFactory/parseAxes</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m',357,0)">line 357</a>)
                    matlab.graphics.internal.clearNotify(fig, ax);
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.utils.ControlsChartFactory/processParent', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m', 312)" style="font-weight:bold">controllib.chart.internal.utils.ControlsChartFactory/processParent</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m',312,0)">line 312</a>)
                        [chartInputs,ax] = controllib.chart.internal.utils.ControlsChartFactory.parseAxes(ax,type);
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('controllib.chart.internal.utils.ControlsChartFactory.plot', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m', 28)" style="font-weight:bold">controllib.chart.internal.utils.ControlsChartFactory.plot</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/+controllib/+chart/+internal/+utils/ControlsChartFactory.m',28,0)">line 28</a>)
            [hParent,chartInputs,ax] = controllib.chart.internal.utils.ControlsChartFactory.processParent(hParent,type);
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('stepplot', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/charts/stepplot.m', 71)" style="font-weight:bold">stepplot</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/graphics/charts/stepplot.m',71,0)">line 71</a>)
    h = controllib.chart.internal.utils.ControlsChartFactory.plot("step",...
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('DynamicSystem/step', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/engine/@DynamicSystem/step.m', 93)" style="font-weight:bold">DynamicSystem/step</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/shared/controllib/engine/@DynamicSystem/step.m',93,0)">line 93</a>)
        h = stepplot(varargin{:});
            ^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('LiveEditorEvaluationHelperEeba0b16e3e9c42ec9744cc50ec25cdab', '/tmp/Bdoc26a_3146167_4015016/Editor_pomtx/LiveEditorEvaluationHelperEeba0b16e3e9c42ec9744cc50ec25cdab.m', 90)" style="font-weight:bold">LiveEditorEvaluationHelperEeba0b16e3e9c42ec9744cc50ec25cdab</a> (<a href="matlab: opentoline('/tmp/Bdoc26a_3146167_4015016/Editor_pomtx/LiveEditorEvaluationHelperEeba0b16e3e9c42ec9744cc50ec25cdab.m',90,0)">line 90</a>)
step(CLin,CLout,'r--',tsim,r,Config), grid %[output:8459cf08]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('matlab.internal.liveeditor.LiveEditorUtilities.doExecute', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/codetools/+matlab/+internal/+liveeditor/@LiveEditorUtilities/doExecute.m', 85)" style="font-weight:bold">matlab.internal.liveeditor.LiveEditorUtilities.doExecute</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/codetools/+matlab/+internal/+liveeditor/@LiveEditorUtilities/doExecute.m',85,0)">line 85</a>)
    builtin('_liveCodeExecutionPortal', 'matlab.internal.editor.EvaluationOutputsService.evalRegions', editorId, uuid, startLine, endLine, fullFileText, false, true, fileName, -1, '', sectionData);
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('matlab.internal.liveeditor.LiveEditorUtilities.execute', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/codetools/+matlab/+internal/+liveeditor/@LiveEditorUtilities/execute.m', 27)" style="font-weight:bold">matlab.internal.liveeditor.LiveEditorUtilities.execute</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/runnable/matlab/toolbox/matlab/codetools/+matlab/+internal/+liveeditor/@LiveEditorUtilities/execute.m',27,0)">line 27</a>)
    executionTime = LiveEditorUtilities.doExecute(editorId, fileName, persistOutput, isSynchronousDrawnowRequired);
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('mwtools.liveCodeToDocbook>doRun', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m', 474)" style="font-weight:bold">mwtools.liveCodeToDocbook>doRun</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m',474,0)">line 474</a>)
    LiveEditorUtilities.execute(editorId, source);
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('mwtools.liveCodeToDocbook>doRunConvert', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m', 382)" style="font-weight:bold">mwtools.liveCodeToDocbook>doRunConvert</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m',382,0)">line 382</a>)
    [startTimeStamp,finishTimeStamp,exampleTime,exampleWarnings, exampleErrors] = doRun(editorObj, javaRichDocument, source);
                                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('mwtools.liveCodeToDocbook', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m', 156)" style="font-weight:bold">mwtools.liveCodeToDocbook</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/examples/exampletools/+mwtools/liveCodeToDocbook.m',156,0)">line 156</a>)
        [startTimeStamp,finishTimeStamp,exampleTime,exampleRunWarnings,exampleRunErrors, errorMessage, webWindow] = doRunConvert(...
                                                                                                                    ^^^^^^^^^^^^^^^^
Error in <a href="matlab:matlab.lang.internal.introspective.errorDocCallback('BML', '/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/build_using_matlab/BML.m', 13)" style="font-weight:bold">BML</a> (<a href="matlab: opentoline('/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3146167/build/matlab/tools/build_using_matlab/BML.m',13,0)">line 13</a>)
        evalin('base', s);
        ^^^^^^^^^^^^^^^^^
title('Scheduling on r, Step Amplitude 0.7')
legend('Kin','Kout','location','Best')

MATLAB figure

両方のコントローラーで安定性が維持されるようになり、性能が同じになります。これは、p が区分的に一定であり、両方のコントローラーを相互交換可能な LTI の場合に十分に近いためです。次に説明するハイブリッド方式との比較のために Kout で結果を保存します。

y = step(CLout,tsim,r,Config);

ハイブリッド方式

LPV プラントは p=y に依存し、PI コントローラーは r でスケジューリングされるハイブリッド方式を使用することもできます。この手法を試すために、pc という別のパラメーターを使用して LPV コントローラーを作成します。

Kout = lpvss('pc',@(t,p) hcKoutFCN(t,p,pmax));
CLout = feedback(G*Kout,1);

閉ループ モデルが ppc の 2 つのパラメーターに依存するようになります。pypcr に設定し、応答をシミュレートします。

pFcn = @(t,x,u) [tanh(x(1)) ; interp1(tsim,r,t)];
yh = step(CLout,tsim,pFcn,Config);

最後に、実際のプラントと積分器の出力の Ki を使用して r でスケジューリングされた PI コントローラーを使用して非線形シミュレーションを実行します。

usey = 0; useKout = 1;
simout = sim('HiddenCouplings',Tf);

r スケジューリング方式とハイブリッド スケジューリング方式を実際の非線形応答と比較します。

plot(tsim,y,tsim,yh,simout.tout,simout.y,'k--')
title('Step Amplitude 0.7')
legend('r scheduling','y/r scheduling','nonlinear','location','Best')

Figure contains an axes object. The axes object with title Step Amplitude 0.7 contains 3 objects of type line. These objects represent r scheduling, y/r scheduling, nonlinear.

ここで、プラントとコントローラーの両方を r でスケジューリングした方が非線形応答に近い近似になっています。

プラントとコントローラーのデータ関数

type lpvHCModel
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = lpvHCModel(~,p,pmax) 
% Plant model

p = max(-pmax,min(p,pmax));
tau = atanh(p);

A = -1;
B = 1;
C = 1-p^2;
D = 0;
E = [];
dx0 = [];
x0 = tau;
u0 = tau;
y0 = p;
Delays = [];
type hcKinFCN
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = hcKinFCN(~,p,pmax) 

% PI Gains
if abs(p)< pmax
    Kp = 1/3/(1-p^2);
    Ki = 1/(1-p^2);
else
    % Protect against |p|>=1
    Kp = 1/3/(1-pmax^2);
    Ki = 1/(1-pmax^2);
end

% State-space and offset data: Ki at the input
A = 0;
B = Ki;
C = 1;
D = Kp;
E = [];
dx0 = [];
x0 = [];
u0 = [];
y0 = [];
Delays = [];
type hcKoutFCN
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = hcKoutFCN(~,p,pmax) 

% PI Gains
if abs(p)< pmax
    Kp = 1/3/(1-p^2);
    Ki = 1/(1-p^2);
else
    % Protect against |p|>=1
    Kp = 1/3/(1-pmax^2);
    Ki = 1/(1-pmax^2);
end

% State-space and offset data: Ki at the output
A = 0;
B = 1;
C = Ki;
D = Kp;
E = [];
dx0 = [];
x0 = [];
u0 = [];
y0 = [];
Delays = [];

参考文献

  1. Rugh, Wilson J., and Jeff S. Shamma. “Research on Gain Scheduling.” Automatica 36, no. 10 (October 2000):1401–25. https://doi.org/10.1016/S0005-1098(00)00058-3.

参考

|

トピック