コンバータ制御設計に役立つ状態平均化モデルをsimulinkで書いてみた3

# 前回までのあらすじ

この記事では２つ前の記事 https://qiita.com/griffin921/items/47c4efe95550b36f15d1
で取得した代数式モデルを
伝達関数モデルに変換した１つ前の記事　https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188
の内容をもとに遂にSimulink の世界にその結果を持ち込むところを実際にやってみた。

つづきはこちら
記事その４https://qiita.com/griffin921/items/87dcda9ba1879cca1181

# Simulinkによる微分方程式モデルの記述と線形化


本スクリプトでは[記事その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)で導出した伝達関数をSimulink Control Designの線形化機能を用いて導出する。

異なるアプローチで同じ伝達関数を導出し、それぞれを比較することで立式が妥当であるかを検証することができる。

**Simulinkで作成したモデルをシミュレーション・線形化処理を行うことで**
**[１つ前の記事](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)で手計算で導出した伝達関数を異なるアプローチで導出できることを理解する。**
**これにより代数式モデルの結果とSimulinkモデルからの結果両者を比較することで立式の妥当性検証が行えることを確認する。**


  
  
# 1.  状態平均化モデルの呼び出し


[その１](https://qiita.com/griffin921/items/47c4efe95550b36f15d1)の最後で.matファイルに保存しておいた
代数式演算結果をワークスペースに展開します



```matlab:Code
clear variables
load('Parameters/AveragedState-SapaceModel.mat')
```

# 2.  Simulinkモデルによる微分方程式記述


ここで[その１](https://qiita.com/griffin921/items/47c4efe95550b36f15d1)の式(4.1)に着目すると



```math
\frac{d}{\mathrm{d}t}\mathit{\mathbf{x}}\left(t\right)=\textrm{Ax}\left(t\right)+\textrm{Bu}\left(t\right)\cdots \left(4\ldotp 1\textrm{@Script01}\right)
```


Symbolic Math Toolboxによってこれらの式を計算することで状態空間モデルを各微分項の微分方程式に変換できる。



```matlab:Code
%シンボルを追加定義
syms x u dxdt vout iL vc Vin
x = [iL; vc] 
```

x = 

  
```math
 \left(\begin{array}{c}
\textrm{iL}\\
\textrm{vc}
\end{array}\right)
```

```matlab:Code
u = Vin
```

u = 

  
```math
 \textrm{Vin}
```

```matlab:Code

dxdt = simplify(A*x + B*u)
```

dxdt = 

  
```math
 \left(\begin{array}{c}
-\frac{\textrm{vc}-\textrm{Duty}\,\textrm{Vin}}{L_1 }\\
-\frac{\textrm{vc}-\textrm{Ro}\,\textrm{iL}}{C_1 \,\textrm{Ro}}
\end{array}\right)
```

```matlab:Code

vout = C*x + D*u
```

vout = 

  
```math
 \textrm{vc}
```


dxdtの第一要素は$\frac{{\textrm{di}}_L }{\textrm{dt}}$、第二要素は$\frac{{\textrm{dv}}_c }{\textrm{dt}}$なので



```matlab:Code
syms diLdt dvcdt

diLdt = dxdt(1)
```

diLdt = 

  
```math
 -\frac{\textrm{vc}-\textrm{Duty}\,\textrm{Vin}}{L_1 }
```

```matlab:Code
dvcdt = dxdt(2)
```

dvcdt = 

  
```math
 -\frac{\textrm{vc}-\textrm{Ro}\,\textrm{iL}}{C_1 \,\textrm{Ro}}
```


上記式をSimulinkモデルで記述することで時系列シミュレーションとして動作する式モデルを構築できる。


  


※１ここで議論されるiL,vcは瞬時値ではなくあくまで"サンプリング周期において平均化された値"であることに注意する必要がある。
即ち、ここで議論される微分や積分は実コンバータにおけるリプルが重畳した電流、電圧を平均化した値に対しての積分、微分であり、瞬時値に対する積分・微分とは異なる。


※２ここで出力方程式(4.4@[その１](https://qiita.com/griffin921/items/47c4efe95550b36f15d1))の議論をしていないのはVo=VcであるのでvcをVoとして扱えば今回の場合は問題ないためである。これはいくつかのパラメータ要素を省略しているため（インダクタの直流抵抗成分、コンデンサのESR等）であるため、より詳細なモデリングを行う場合はSimulinkの記述モデルに出力方程式の演算も含めなければならない。


## 2.1. iLに対する微分方程式のSimulink記述
  


いかなるツールを使ったとしても、コンピュータでシミュレーションする際には常に有限の数しか扱うことができないため、




インパルス応答、ステップ応答のような立ち上がりを示すような時系列信号に対して微分を施すと、




無限大の値に発散するため、多くの場合、近似微分と言うかたちで高周波のゲイン上昇を任意の周波数で抑制するような形で扱う。




そのため、実際の微分値に対して誤差を含んでしまうため、




Simulinkで微分方程式を記述する際は積分系に式を変換して記述することが一般的である。


  


$\frac{{\textrm{di}}_L \left(t\right)}{\textrm{dt}}$、$\frac{{\textrm{dv}}_c \left(t\right)}{\textrm{dt}}$を積分することで$i_L \left(t\right)$,$v_c \left(t\right)$とすることができる。




その際式の右辺にも積分する必要がある。




この微分方程式をラプラス変換すると、積分は$\frac{1}{s}$で表すことができるため、Symbolic式の　diLdtを$s$で割って$i_L \left(s\right)$,$v_c \left(s\right)$の式にすると



```matlab:Code
syms s iL_s
iL_s = diLdt / s
```

iL_s = 

  
```math
 -\frac{\textrm{vc}-\textrm{Duty}\,\textrm{Vin}}{L_1 \,s}
```


上記式をSimulinkモデルで記述する。


  


Symbolic式ではすべて変数として扱ったが、厳密には$L_1$だけが時間に依存しない定数でありその他の変数は時間の関数で表せる。




最終的な式の出力は$i_L$(t),




式に対する入力変数は$V_{\textrm{in}} \left(t\right)$,$\textrm{Duty}\left(t\right)$,$v_c \left(t\right)$とし




$L_1$は式の定数とする。


  
### 2.1.1　Simulinkモデル編集ウィンドウの表示


Simulinkモデルを新規作成する。


  


簡潔なSimulinkの基本操作を説明するが、




Web上解説資料が存在するためそちらを合わせて確認してほしい。




**■Youtube**


**今から始めるSimulink** [**https://youtu.be/em73agWEUuo**](https://youtu.be/em73agWEUuo)


**Simulink入門　プログラミング不要な数値シミュレーション**

[**https://www.youtube.com/watch?v=oPsdCH-dXL0\&ab_channel=MATLABJapan**](https://www.youtube.com/watch?v=oPsdCH-dXL0&ab_channel=MATLABJapan)


**■自己学習コンテンツ**

**Simulink入門**

[**https://jp.mathworks.com/learn/tutorials/simulink-onramp.html**](https://jp.mathworks.com/learn/tutorials/simulink-onramp.html)




MATLAB コマンドウィンドウで"simulink"と入力するか

MATLABのGUI上部のSimulinkアイコンをクリックすることで　Simuinkは起動する。


### 2.1.2　Subsystemの作成
  


状態空間モデルは2つの微分方程式で表現されるが、まずiLについての式について記載する。




Simulinkにはサブシステムという機能があり、ある数式の処理をひとまとまりのサブシステムブロックとして記述ができる。


  


**キャンパスにサブシステムを下記の通り作成する**




![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/0e957402-a7b1-5f24-4a8e-b0a7ff0e07af.png)




   1.  ダブルクリックで水色の検索ダイアログを表示させる 
   1.  "subsystem"と記述する 
   1.  Enterキーを入力する 

  


**サブシステムブロックに入力端子を追加する**



![image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/203df62e-acd8-031f-378d-f28c0947701b.png)




   1.  Subsystemブロックの端をクリックして水色のダイアログを表示させる 
   1.  ”入力信号端子の作成”をクリックして端子を増やす 



**入出力端子に名前を付ける**


![image_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/599ab222-1533-8ec4-16f3-8f6d1015ba94.png)



   1.  Subsystemブロックをダブルクリックして一階層下のレイヤーに移動する 
   1.  入力ブロックをクリックすると、In1,In2等デフォルトのブロック名が水色で表示されるので、その名前をクリック 
   1.  キーボード入力ができるようになるのでDuty,Vin,vcの式にとっての入力変数の名前に変更する 
   1.  同様に出力ポートブロック名をiLに変更する 

### 2.1.3　式をブロック線図として記述する



![image_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/b0054bfa-9a1c-cbe9-dab3-b340a10c42e0.png)

  


ライブラリブラウザボタンをクリックして
提示されるブロックを組み合わせて微分方程式を記述していく。


もはやこのアドカレで言及することもないかもしれないけれど
ブロックをSimulinkのモデルに配置するには、該当ブロックをライブラリブラウザからドラッグ・アンド・ドロップするだけである。

またブロックの端子をドラッグすることでブロック間の結線が可能である。
![image_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/07aa7bad-711e-34d6-9d76-305d74ecbfce.png)



  


今一度iLの式を思い出してみると



```matlab:Code
iL_s
```

iL_s = 

  
```math
 -\frac{\textrm{vc}-\textrm{Duty}\,\textrm{Vin}}{L_1 \,s}
```


これをSimulinkモデルで記述すると下記のとおりになる。




![image_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/700c7be3-23b0-5003-36f4-9c5cff34abba.png)





赤く表示がされているブロックはパラメータL1が




MATLABワークスペースに定義されていないことを示す警告であるので、




下記のコードを実行することで、パラメータを定義しておきエラーを解消する。



```matlab:Code
 
L1 = 200e-6 %[H]
```


```text:Output
L1 = 2.0000e-04
```


式との対応がわかりやすいよう信号線に演算過程を示す信号名を付与している。




信号線に名前を付与する場合は、下記のとおりに行う。



   1.  信号線をダブルクリック 
   1.  キーボードで信号名を入力 



このように左から右に信号が流れる形で微分方程式を立式できる。



### 2.1.4　微分方程式のシミュレーション


下記ボタンをクリックし一階層上のレイヤーに移動する。




![image_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/5eb268dc-a165-7f77-714e-ecced342bd7e.png)



  


Commonly Used Blocksの中から Constant ブロック、Scopeブロックを用いて下記図のように配置・接続する



   1.  定数を出力するConstant ブロックを3つ配置しSubsystemの入力に接続 
   1.  Constantブロックをダブルクリックし、各定数を下記図に従って入力する 
   1.  信号を観測するScopeブロックを１つ配置しSubsystemの出力に接続 
   1.  Subsystemをクリックする 
   1.  Subsystemブロック下部に表示される青い"Subsystem"テキストをクリック 
   1.  "CurrentEquation"とキーボードで入力しサブシステムに名前をつける 



![image_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/2b618718-e4ed-2cc4-8a34-78ca8a51ddb1.png)





これにより、微分方程式について記述した関数 $i_L \left(t\right)=\textrm{CurrentEquation}\left(\textrm{Duty}\left(t\right),V_{\textrm{in}} \left(t\right),v_c \left(t\right)\right)$をサブシステムとしてモデリングができ、シミュレーションが実行できる状態になった。ﾔｯﾀ━━━( pﾟ∀ﾟ)q━━━━!!

  


さっそく0.1sという時間でシミュレーションしてみる。
   1.  ”シミュレーション”タブをクリック 
   1.  Simulationの"終了時間"を0.1[s]と設定 
   1.  "実行"ボタンをクリック 

すると先程定義した微分方程式が演算され、下記のような出力を取得できる。

![image_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/bf6a57f0-3a92-1248-92a5-7438af5c677d.png)


### ポエム
<details><summary>どうでもいいけどなんでもっかい同じ式をSimulink とやらで書く必要がある訳？というコメントに対してのお気持ち表明</summary><div>

****
**正直にいうとまぁ気持ちはわかる。だるい。**
しかもシミュレーションしてもこの時点では正直面白くない。
だってインダクタに電圧かけたら一定の傾きで電流が上昇していくなんて当たり前すぎるからだ。（言い過ぎかしら）


とはいえ**ブロック線図というのが制御設計する上で結構大事である。**
例えば、インダクタの値は実際の世界では電流に対して非線形特性を持ち、変動してしまうが
「このインダクタンスの変動を補償するようなアイディアは無いだろうか？」
とか考えるときに　式の途中経過のどの信号を利用しようかなどあれこれ考えるときに
整理がおわった式全体としてではなく、
**式の演算過程の関係性や途中の信号をいじったり、取り出したりできるブロック線図は非常に都合がいい。**

そういう意味であえてブロック線図にかく意義ってのはあるのではないかと思う。
****
あと、シミュレーション実行可能ってのも、今は考えたらわかるやろ、って式だけど
実際コンバータをガチで設計しようと思うとたいていこの例題のモデリングでは全然ダメで
もっと複雑な形でモデリングしようとするはずだ。
そういう場合は自分の考えが正しいかを確認する拠り所として改めてSimulink でモデリングするのは悪くないと思う。

**個人的には制御工学においてブロック線図とそれが直ちにシミュレーションできるという環境がが好まれるのはこういった理由があるのではないかと考えている（諸説あります）。**
****
</div></details>

## 2.2. vcに対する微分方程式のSimulink記述


2.1と同様にvcについてもモデリングを行う。




dvcdtの式を思い出してみると



```matlab:Code
dvcdt
```

dvcdt = 

  
```math
 -\frac{\textrm{vc}-\textrm{Ro}\,\textrm{iL}}{C_1 \,\textrm{Ro}}
```


これをラプラス変換し積分系に変換すると



```matlab:Code
syms cv_s
cv_s = dvcdt / s
```

cv_s = 

  
```math
 -\frac{\textrm{vc}-\textrm{Ro}\,\textrm{iL}}{C_1 \,\textrm{Ro}\,s}
```
  


となっている。




入力を$i_L \left(t\right)$,$R_o \left(t\right)$




出力を$v_c \left(t\right)$




定数であるパラメータを$C_1$とし新たなサブシステムを作成する。



```matlab:Code
C1 = 300e-6;%[F]
```

### 2.2.1　Subsystemの作成


![image_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/f79cb30d-1911-123b-909b-b181b541a8fc.png)




新たなサブシステムとして"VoltageEquation"を定義する。




また信号の入出力ポートに名前を定義する。


  


vcの出力がiLの式の入力となるので上記図のように結線する。




これによって２つの微分方程式間の関係性を定義できる。

ここでも立式するだけでは理解しにくい関係性を視覚的に理解できるのもブロック線図の良さを体験できる。

#### ポエム

<details><summary>こういうのちょいちょい挟むのしつこいかな。。。</summary><div>

** **

**まぁ書くけどな！**

コンバータの試作品に対して色々な条件で動かしてあーでもない　こうでもないと試行錯誤するやり方もやったことあるが、
それよりも、
プラントを電流系、電圧系に分割しながらステップバイステップで検討を進めていけるのはとてもいいと思う。

**ただ、まぁ実機の実験は楽しい。それは僕もよく分かる。楽しすぎて[プライベート用のマイオシロスコープを買った](https://twitter.com/griffin921/status/1327194917244862466?s=20&t=GriYmN06SuO_r5TusaQVDw)くらいだ**

が。
やはり我々はサラリーマンであるので、実機いじくり倒して
**「壊しちゃいましたぁ　てへ」で、そうやすやすと許されるような立場ではないはずである。**
** **
極端（？）な例として
イーロン・マスクさんのSpaceXもバカスカ失敗して試作品のロケット爆発させてるが、
じゃあ彼らが「シミュレーションなんか無駄だぜ！とりあえず打ち上げちゃえ」という思想でやってんのかというと、
多分そうではなくて

あれも実際はシミュレーションでわかるところは事前にちゃんとやっていて。
で、ある程度検討した上でもやっぱり実機でしかわからないところがあるので、
**そのときはもう机上でうだうだいってないでやってみるしか無いですよね？ じゃやりましょう。**
ってスタンスなのかなと想像している。

うまくシミュレーションの領分と実機検証での領分をバランス取った上でやってみて
そのうえであれだけ失敗するむずかし～いことにチャレンジしてるのだと僕は思う。

実験は楽しさもあるけど、失敗はできないというプレッシャーが常につきまとい、
いざ失敗しちゃうと取り返すのは大変である。
**なので失敗してもすぐ取り返しが効く机上で検討できるというのは精神衛生上良いのである。
モデルベース開発で心理的安全性を確保しよう。**
** **

</div></details>

### 2.2.2　式をブロック線図として記述する
2.1.3と同様の要領でモデリングすると下記図のとおりになる。

![image_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/f5c539ed-962d-b26a-197b-a7a01ae43f22.png)



### 2.2.3　微分方程式のシミュレーション


モデルの最上位レイヤに移動しシミュレーションを実行する。


   1.  入力$R_o$の値をConstantブロックで定義し定数"5"を設定 
   1.  vcの出力端子にScopeブロックを配置 
   1.  Dutyに接続されているConstantブロックの値を"0.5"に変更 
   1.  ScopeブロックをダブルクリックしてScopeウィンドウを開く 
   1.  シミュレーションの”実行”ボタンをクリック 



![image_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/7d547f00-5922-3b26-4bbf-d61d7785903b.png)

![image_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/0b0e747e-eb12-6292-f1c9-c0c4d2d6ccb7.png)




このようにDuty,Vin,Roがある値を持つときのコンバータ出力電圧についてのシミュレーションが
微分方程式をモデリングすることで確認できた。

これもまぁ当たり前っちゃ当たり前だが、
コンバータの特性っていうのはDuty比に応じてインダクタにかける平均電圧をコントロールすることで
インダクタを電流源として操作し、その電流がコンデンサに流れ込み、その両端電圧がコンバータの出力電圧として現れるというコンバータ特性の全体像が視覚的にもわかりやすく表現できる。


# 3.  Simulinkによる微分方程式モデルの定常解（静特性式）の導出


**シミュレーションの結果が6Vに収束していることに注目したい。**
[その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)の式(2.2)において定常状態を求めた際に得た式に値を代入するとシミュレーション結果が収束した値と一致する。
[その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)からの再掲になるが、




提示した状態変数の定常解を大文字を用いて$\mathit{\mathbf{X}}=\left\lbrack \begin{array}{c}
I_L \\
V_c 
\end{array}\right\rbrack$、出力を$U=V_{\textrm{in}}$と記述することにする。



```math
\begin{array}{l}
0=\mathit{\mathbf{A}}X+{\textrm{BV}}_{\textrm{in}} \cdots \left(2\ldotp 1\textrm{@記事その２}\right)\\
\textrm{Vo}=\textrm{CX}\cdots \left(2\ldotp 2\textrm{@記事その２}\right)
\end{array}
```


$\mathit{\mathbf{X}}$導出のために式(2.1@記事その２)を変形し




$\mathit{\mathbf{X}}=-{\mathit{\mathbf{A}}}^{-1} \textrm{BU}$を計算する代数式演算を行う。



```matlab:Code
syms X U Vin Vc

U = Vin
```

U = 

  
```math
 \textrm{Vin}
```

```matlab:Code
X = -inv(A)*B*U
```

X = 

  
```math
 \left(\begin{array}{c}
\frac{\textrm{Duty}\,\textrm{Vin}}{\textrm{Ro}}\\
\textrm{Duty}\,\textrm{Vin}
\end{array}\right)
```

```matlab:Code
Vc = X(2)
```

Vc = 

  
```math
 \textrm{Duty}\,\textrm{Vin}
```


各変数を代入して値を得ると下記のとおりに確かにシミュレーション結果の収束値と一致する。




```matlab:Code
Ro = 5;
Vin = 12;
Duty = 0.5;
subs(Vc)
```
```math
ans =　6

```
**シミュレーションによって式に時系列データを入力し出力を計算することで**
**代数的に演算した定常解と同じ答えを別のアプローチから得ることができた。**
**このように異なるアプローチから解を求め、両者を比較することで立式の妥当性検証が行える。**

### ポエム
<details><summary>僕は空気を読まないのでポエムをはさみ続ける</summary><div>

** **
こういう形でシミュレーションを理論として求められるであろう期待値が
正しいものかを検証するための道具として使うととても良い。

こうしておくと、仮に理論と一致しなかった場合においても便利である。
- 理論建てが間違ってたケース
- シミュレーション結果の解釈や見るところが間違ってたケース
- シミュレーションモデルの作り方が間違ってたケース
等　想定される間違いシナリオを切り分けやすい。

モデルをコツコツつくっておくと成功しても失敗してもお得というのが個人的には好きなところだ。

** **
</div></details>



# 4.  Simulinkによる微分方程式モデルの動特性式の導出


MATLABのオプション製品であるSimulink Control DesignはGUI操作でSimulinkのモデルを線形化することが可能であるっぽい。ほんとにそうなのか試してみる。



まず、下記図のように２つの式を１つのサブシステムにまとめる。


![image_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/82b31033-7424-5037-c46a-37f98bde2f6e.png)





操作としては下記の通り



   1.  ドラッグ・アンド・ドロップでまとめたい範囲を指定 
   1.  表示される青い”・・・”ブロックをクリックし”サブシステムの作成”をクリック 
   1.   もしくは選択範囲を右クリックして右クリックメニューから”選択からサブシステムを作成”を選択 
   1.  新たなサブシステム "BuckConverter"にリネームする 

■式(4.4 @[その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188))$\frac{\Delta \mathit{\mathbf{X}}\left(s\right)}{\Delta R_o \left(s\right)}$の導出

```math
\frac{\Delta \mathit{\mathbf{X}}\left(s\right)}{\Delta R_o \left(s\right)}={\left(\textrm{sI}-\mathit{\mathbf{A}}\right)}^{-1} \left(\frac{\partial }{\partial R_o }\textrm{AX}\right)\;\cdots \left(7\ldotp 4\textrm{@記事その２}\right)
```


この伝達関数はRo(s)からX(s)までの伝達関数である。




Simulinkモデルで線形化を行うには伝達関数の入力と出力をモデル上で指定する必要がある。







  
# Simulink モデルのモデル操作点での線形化

こちらのリンクに説明があるが一応流れを追ってみる。
[https://jp.mathworks.com/help/slcontrol/ug/linearize-simulink-model.html](https://jp.mathworks.com/help/slcontrol/ug/linearize-simulink-model.html)


  
### **操作１：伝達関数における入力を指定する。**


１．Roが入力されている信号線を右クリックし右クリックメニューを開く




![image_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/adabb486-7d74-9fbb-cfd7-053f583e9760.png)



２．線形解析ポイントを選択し、”入力の接動”を選択する




![image_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/21f499d3-b025-7004-2586-df5c0a98c3f4.png)




そうすると信号線にこのようなマークが付与され、この信号部分に微小振動を付与することを指定できる。




![image_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/917adda5-82dd-d8ad-218e-f05b21e6e05d.png)




**次に出力を指定する。**$\mathit{\mathbf{X}}=\left\lbrack \begin{array}{c}
I_L \\
V_c 
\end{array}\right\rbrack$なので




出力はこのサブシステムの２つの出力線両方となる。




出力を指定する場合は同様に右クリックメニューから




１．信号解析ポイントを選択




２．”出力の測定”を選択




をおこなう。これをiL,Vcの両方に行う。



![image_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/83896d34-b268-3cc3-98db-4c528211ddbe.png)



### **操作２：”Simulink Control Design”の”モデル線形器アプリを使う**


上部ツールストリップから



   1.  ”アプリ”タブの選択 
   1.  モデル線形化器アプリをクリック 



![image_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/bc41ac21-c066-2f4d-6874-74c277068779.png)




このようなウィンドウが開く。




![image_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/1ba380cc-8fea-2799-6232-979056104264.png)



### 操作３：定常状態を操作点になるように設定


[その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)における２章：定常解（静特性式）の導出で行ったことと等価な作業、




即ち微小振動を入力する前に定常状態である$\mathit{\mathbf{X}}=\left\lbrack \begin{array}{c}
I_L \\
V_c 
\end{array}\right\rbrack$が一定値をもつ状態をアプリで設定する。




一つ前の章である**3.  Simulinkによる微分方程式モデルの定常解（静特性式）の導出**




にて、Simulinkで式をモデリングしてシミュレーションすることで定常解を求められることを示した。


  


これを利用して、このツールには「シミュレーション実行時間X秒時点の演算結果を定常解とする」




というような指定をする事が可能である。これをこのアプリでは”スナップショットを撮る”という。


  


下記の通り



   1.  ”操作点：モデルの初期条件”をクリック 
   1.  シミュレーションのスナップショットを撮るをクリック 
   1.  シミュレーションのスナップショット時間を指定 



![image_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/df961e7b-e521-4e1a-a972-34919e78bdd9.png)


  


**2.2.3　微分方程式のシミュレーション**で確認したシミュレーション結果から




0.03秒以降であれば十分解が一意の値に収束してい良いように見えるので
今回はスナップショット時間を0.03と設定した。



![image_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/3bf5cf33-547b-a675-04b5-75342c09c7af.png)



  


スナップショットボタンをクリックすると




線形化アプリ専用のローカルワークスペースである




線形解析ワークスペースにop_snapshot1というデータが追加される。


  


また、操作点として生成されたop_snapshot1が設定されていることもわかる。



![image_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/2af89b5a-652e-5cdf-8e59-6974a4799ea6.png)




こちらの通り、定常状態である$\mathit{\mathbf{X}}=\left\lbrack \begin{array}{c}
I_L \\
V_c 
\end{array}\right\rbrack$にたいして定常解が求められていることがわかる。




上から1つ目の状態が$I_L$に相当し、2つ目の状態が$V_c$に相当する。




![image_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/fd625af9-7ca9-7d5e-f2f0-3cab563342a0.png)


### 操作4：定常状態近傍でモデルを線形化


アプリ上部の「ステップ、ボード線図、インパルス、ナイキスト、ニコルス線図・・・」等のプロットをクリックすれば




アプリが定常解近傍での線形化を実施し、指定したグラフをプロットする。




プロット画面右端の▽ボタンをクリックすることですべての操作ボタンを閲覧できる。




![image_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/0adf5c70-878f-c382-714f-61749ed3d04b.png)




ここで「ボード線図」をクリックすると下記の通り




記事その２で■式(4.4)$\frac{\Delta \mathit{\mathbf{X}}\left(s\right)}{\Delta R_o \left(s\right)}$の導出で求めた２つの伝達関数に相当する結果がアプリ操作で取得できる。


# 5. 代数式演算の結果と比較


記事その２で求めたSymbolic式データをロードする。



```matlab:Code
load('SymbolicEquation.mat');
```



アプリで線形化された結果は




線形化アプリ専用のローカルワークスペースである




線形解析ワークスペースにop_snapshot1というデータが追加される。


  


こちらをMATLABワークスペースにドラッグ・アンド・ドロップすれば、データが




MATALBのワークスペースにコピーされてスクリプトから操作できるようになる。



![image_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/0a6ee327-9bed-4031-fd8d-b35a06224f2a.png)





**コピーされた変数名が”linsys1"以外ならば下記スクリプトの都合上名前を"linsys1"にリネームすること。**




代数式モデルとアプリで取得した線形化結果を比較する。

 
## 結果：さぁほんとにアプリで線形化してくれんのか？　やれんのかい？　やれないのかい？　どっちなんだい！


```matlab:Code
%Symbolic式を伝達関数モデルに変換
Gplant_s = arrayfun(@sym2tf_ykamatan,subs(GdXdRo),'UniformOutput',false);

%モデルのサイズを取得
[row, colm] = size(GdXdRo);

%ループを回して各要素のボード線図を描画
for i = 1:row
    for j = 1:colm
        ax = subplot(2,1,(i-1)*colm+j);
        %代数式ベースの伝達関数をプロット
        bodeplot(ax,Gplant_s{i,j});
        grid on;
        hold on;
        %アプリで取得したやつをプロット
        bodeplot(ax,linsys1(i,j),'--y');
    end
end
legend('代数式モデル','線形化アプリによる線形化結果')
```


![figure_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/aee34017-1986-be04-0233-ff4d6489292e.png)


**パワーーーーーー！！！:muscle: :muscle::muscle::muscle::muscle::muscle::muscle::muscle:　エレクトロニクス！！**
**完全に結果が一致しておりアプリ操作で線形化された結果と代数式モデルで求めたものとが等価なモデルであるということが確認できた。ヤッ٩(⁎˃ᴗ˂⁎)۶ (੭ >᎑<)੭タァー！**




# まとめ




Simulinkで作成したモデルをシミュレーション・線形化処理を行うことで
[その2](https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188)で手計算で導出した伝達関数を異なるアプローチで導出できることを確認できた。

これにより代数式モデルの結果とSimulinkモデルからの結果両者を比較することで立式の妥当性検証が行えることを確認した。

:::note info
そう、一生懸命式を立てて、ボード線図かいてみたはいいものの
**これってあってんのかなぁ・・・・？ぽいけどなぁ・・・？しらんけど・・・**
みたいな仕事をやりきったはずなのになんだかモヤモヤする気持ちにならなくて済むのである。

嬉しくないですか？僕は嬉しい。
:::

  
### ポエム
<details><summary>え、ポエム読みたいの？暑苦しいけど？いいの？知らんよ？</summary><div>


** **
モデル化の意義は”理論を理解せずに結果を得る”ことではない。

まずは上記の検証のためのReferenceとして利用するため、
もう一つは自動化によってより広く理論を展開できるところにある。


 

即ち理論をモデル化することでシステマチックに解を導出できるため、より複雑なモデルに対しても同様のスキームで解を求めることができる。

とはいえ、~~パワエレオタクである私個人としては「理論式を追いかける楽しみを放棄するなんてもったいない」というのが本音だが、まぁそう言うの置いといて~~
「その・・・式をこねくり回すとかいいんで、モデル書いてその伝達関数さえ貰えれば良いんですけど。」ってこともシーンとしてはあるはずだ。
そういうときにはアプリのパワーで所望の結果をサクッと取得するのも良い。

**パワエレオタクを目指したい人は**

**いきなりアプリに頼らず１回でもいいから式を書いてみることを強くおすすめする**
**よく言われる「真剣にやれよ！仕事じゃねぇんだぞ！」ってやつである**
**オタ活は仕事じゃないんだから！効率的とか置いといてとことん取り組もう！(????)**

また、上記のアプリ操作はスクリプトから等価な操作を実行可能にする
[**Simulink Control Design　APIが提供されている**](https://jp.mathworks.com/help/slcontrol/referencelist.html?type=function&listtype=cat&category=index&blocktype=all&capability=)**ため**
**複数の条件に対する反復演算といった処理が必要なシーンで自動化が可能になる。**
** **
</div></details>


ほとんど言いたいことは言えたがおまけ的にその４に続く！
記事その４https://qiita.com/griffin921/items/87dcda9ba1879cca1181
# Reference


[1] 安部　征哉, 財津　俊行, 上松 武.　デジタル電源の基礎と設計法 -スイッチング電源のデジタル制御-. 科学情報出版株式会社, 2020,246p, ISBN978-4-904774-84-7.




[2] Frede Blaabjerg, ed. Yanfelng Shen, Zian Qi and Huai Wang. Control of Power Electronic Converters And Systems. Volume 1, Chapter 3 "Modeling and Control of DC-DC Converters" p69-p92, Academic Press, 2018, ISBN 978-0-12-804254-7.




[3]MathWorks."Simulink モデルのモデル操作点での線形化". MathWorks ヘルプセンター　ヘルプドキュメント,2022/10/19. 




\href{ttps://jp.mathworks.com/help/slcontrol/ug/linearize-simulink-model.html}{}[https://jp.mathworks.com/help/slcontrol/ug/linearize-simulink-model.html](https://jp.mathworks.com/help/slcontrol/ug/linearize-simulink-model.html)




[4]MathWorks."SimulinkControl Design 入門". MathWorks ヘルプセンター　ヘルプドキュメント,2022/10/19. [https://jp.mathworks.com/help/slcontrol/getting-started-with-simulink-control-design.html](https://jp.mathworks.com/help/slcontrol/getting-started-with-simulink-control-design.html)