非直達の更新および出力の使用
updateImpl
、outputImpl
および isInputDirectFeedthroughImpl
メソッドを使用して、System object™ の非直達を実装します。非直達では、出力は、その時点での入力ではなく、オブジェクトの内部状態とプロパティにのみ依存します。これらのメソッドを使用して、出力計算を System object の状態更新から分離します。これらの 2 つのメソッドを実装して stepImpl
メソッドをオーバーライドします。これらのメソッドにより、オブジェクトをフィードバック ループで使用して代数ループを防止できます。
matlab.System クラスからのサブクラス化
updateImpl
、outputImpl
および isInputDirectFeedthroughImpl
メソッドを使用するには、matlab.System
からのサブクラス化を行わなければなりません。
classdef IntegerDelaySysObj < matlab.System
オブジェクトへの更新の実装
updateImpl
メソッドを実装して、オブジェクトを前の入力で更新します。
methods (Access = protected) function updateImpl(obj,u) obj.PreviousInput = [u obj.PreviousInput(1:end-1)]; end end
オブジェクトからの出力の実装
outputImpl
メソッドを実装して、現在の入力ではなく前の入力を出力します。
methods (Access = protected) function [y] = outputImpl(obj,~) y = obj.PreviousInput(end); end end
入力が直達かどうかの実装
isInputDirectFeedthroughImpl
メソッドを実装して、入力が非直達かどうかを示します。
methods (Access = protected) function flag = isInputDirectFeedthroughImpl(~,~) flag = false; end end
更新および出力をもつクラス定義ファイルの作成
classdef intDelaySysObj < matlab.System % intDelaySysObj Delay input by specified number of samples. properties InitialOutput = 0; end properties (Nontunable) NumDelays = 1; end properties (DiscreteState) PreviousInput; end methods (Access = protected) function validatePropertiesImpl(obj) if ((numel(obj.NumDelays)>1) || (obj.NumDelays <= 0)) error('Number of delays must be > 0 scalar value.'); end if (numel(obj.InitialOutput)>1) error('Initial Output must be scalar value.'); end end function setupImpl(obj) obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput; end function resetImpl(obj) obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput; end function [y] = outputImpl(obj,~) y = obj.PreviousInput(end); end function updateImpl(obj, u) obj.PreviousInput = [u obj.PreviousInput(1:end-1)]; end function flag = isInputDirectFeedthroughImpl(~,~) flag = false; end end end