微分方程式Simulink ブロックに変換する方法
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
オプション製品である「BlockBuilder for Simulink」を使うと、自分で
定義した数式モデルを S-function ブロックに変換できます。
まず、微分方程式をシステムオブジェクトと呼ばれる中間形式に変換しま
す。
> with(BlockBuilder):
> sys := DiffEquation(m*diff(x(t),t$2)+x(t)=u(t),[u(t)],[x(t)]):

中間形式のシステムオブジェクトから S-function のソースコードを生成
し、ファイルに保存します。
> src := GenerateSFunction(sys,"mysys",optimization=true,parameters=[m=0.1]):
> SaveCode("mysys",src,extension="c"):

Simulinkブロック化のための m-script コードを生成します。
> mcode := GenerateSimulink(sys,"mysys","mysys_block",parameters=[m=0.1],target=C):

Simulinkブロックをビルドするためのコードを MATLAB 上で実行します。
> ExecuteMCode(mcode);

この操作が完了すると、自動的に Simulink が起動し変換されたブロックが
表示されます。後はブロックを Simulink で自由にお使い頂けます。

◆ 係数パラメータが時刻遷移する S-function ブロックの作成
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
BlockBuilder for Simulink では、係数が時刻遷移するような数式モデルで
も S-function ブロックに変換することができます。
> de := m*diff(x(t),t$2)+c*diff(x(t),t)=u(t);

de := m*(diff(x(t), `$`(t, 2)))+(PIECEWISE([.5, 1.5 < u(t)], [.1, otherwise]))*(diff(x(t), t)) = u(t)

この微分方程式の係数 c が時刻で変化するようなモデルは Maple 上で区分
関数を用いて定義します。
> c := piecewise(u(t)>1.5, 0.5, 0.1):
> de;

m*(diff(x(t), `$`(t, 2)))+(PIECEWISE([.5, 1.5 < u(t)], [.1, otherwise]))*(diff(x(t), t)) = u(t)

後は前の tips 同様の手順で Simulink ブロックを作っていきます。
> # システムオブジェクトを定義
> sys := DiffEquation(de, [u(t)], [x(t)]):
> # S-function ソースを生成・出力
> src := GenerateSFunction(sys,"mysys2",optimization=true,parameters=[m=0.1]):
> SaveCode("mysys2",src,extension="c"):
> # Simulink ブロック化コードを生成・実行
> mcode := GenerateSimulink(sys,"mysys2",mysys2_block",parameters=[m=0.1],target=C):
> ExecuteMCode(mcode):