代数ループの回避
この例では、モデル内で代数ループを回避することができる MATLAB System ブロックの作成方法を示します。
System object
System object を使用すると、MATLAB でのアルゴリズムの実装が可能になります。System object は入力が時間経過とともに変化する動的システムを実装およびシミュレーションするために特別に設計された、特殊な種類の MATLAB オブジェクトです。
System object を定義すれば、MATLAB System ブロックを使用してそれを Simulink モデルに含めることができます。
モデルの説明
この例には、モデル内のフィードバック ループで使用される MATLAB System ブロックがあります。フィードバック ループは入力値を累積するために使用され、その結果は Scope ブロックに表示されます。このモデルのフィードバックにより代数ループが生成されます。代数ループを解くには、非直達をもつブロックが Simulink に必要です。代数ループを回避するために、非直達をもつブロックがフィードバック ループで使用されます。このブロックは、最初に入力を受け取ることなく、現在のタイム ステップで出力を生成することができます。この例では、MATLAB System ブロックには非直達があります。
MATLAB System ブロックは、単位遅延を実装する System object UnitDelayNondirect
を使用しています。出力には、フィードバック ループで入力信号の値が累積される方法が示されます。
System object クラスの定義
ブロック ダイアログで "Source code" ハイパーリンクをクリックすることで、MATLAB System ブロックによって使用される MATLAB ソース コードにアクセスできます。System object UnitDelayNondirect
は resetImpl
、outputImpl
、および updateImpl
メソッドを実装します。System object には State
と呼ばれる 1 つのプロパティがあります。
resetImpl
はState
プロパティを 0 に初期化する。outputImpl
はState
に保存された値を返す。outputImpl
では入力が使用されないため、この System object には非直達があります。updateImpl
は入力を使用してState
を更新する。
classdef UnitDelayNondirect < matlab.System % UnitDelayNondirect Delay input by one time step properties(DiscreteState) State end methods(Access = protected) function resetImpl(obj) obj.State = 0; % Initialize states end function y = outputImpl(obj, ~) y = obj.State; % Output current state % Input is not used in this method end function updateImpl(obj,u) obj.State = u; % Update state with input end end end