こんにちは!パワーエレクトロニクスの犬です!
早速ポエムから始めさせていただきます!
シミュレーション高速化の夢
シミュレーション高速化は全人類の夢である(要出典)。
・・・だが、何故これが永遠のテーマとして語られるのか?
速くしたいならすればいい。
「速くしたいなぁ~」などと思っているだけで微笑んでいてもシミュレーションは速くならない。(火の玉ストレート)
そんなことは百も承知なので、
エンジニアのみなさんは日々頑張っておるわけだが、
そろそろ”これさえやれば高速化問題は無縁☆”みたいな答えが出ても良いのでは?
だって、みんな頑張ってるんだもん!
なんで!?なんで頑張ってる僕のモデルはこんなに実行に時間かかるの!
助けてよぉ~ ◯らえも~ん。
シミュレーション高速化が夢である理由
理由1. 精度と速度のバランスをとらないといけないから
シミュレーション速度ってもんは速ければよいというわけではない。
みなさんが注文してから出てくる速さがウリ!という牛丼店に入って、
牛丼を頼んだら、5秒で出てきたはいいものの
- 具がほとんど玉ねぎ
- 味が染みてない
- つゆだくと言うにはやり過ぎなほどシャバシャバ
- ご飯がかたい
という牛丼がでてきたら満足できるのか?という話と同じである。
シミュレーターの演算部がより高度化しても、
アウトプットに対して適切な品質が守られていないと嬉しくないのだと思う。
ではシミュレーターでいう品質とは
やはりモデルや出力される結果の精度が品質において重要なポイントと言える。
そもそも机上で計算するメリットと引き換えに、何かに”置き換えて表現する”というコンセプトである以上、現物とビッタビタで結果が一致することはあり得ないが、なるべく真の値に近づける”精度”が品質において重要と言える理由であろう。
この、”精度”は状況に応じてどの水準が適切であるかは異なる。
食事でも牛丼で手軽に済ませたいときもあれば、
しっかりとした雰囲気と、それに合わせた料理が必要なときもある。
どちらの手段も有効だが、相手や状況のニーズと手段が食い違うと失敗する。
ニーズと手段の組み合わせは無数にあるため、高速化が永遠のテーマ化してしまっているのではないだろうか。
理由2. みんな欲張りだから
シミュレーターが2倍高速になりました!
といって、じゃあ今までと同じモデルを使い回すか?
というとそうではない事が多いと思う。
「せっかく2倍になったのだからもう少し複雑なモデリングをしてみようか」といって前で述べた”精度”の水準を高めたり、
「せっかく2倍になったから電気と熱を錬成させて解いてみようか」
といって、異なる時定数のダイナミクスを一つのモデルに混ぜてしまったりすることはよくあると思う。
これはスマホのバッテリー容量はどんどん大きくなっているのに、
CPUの処理能力やスマホ上でできることがどんどん拡張されているため、体感としての電池の持ち具合はあまり変わらないというのに近い気がする。
つまり一言で言うと人類は愚かということである。(暴論)
・・・おふざけのいらない文章が入ってしまって失礼しました。
まとめると、精度と速度のトレードオフをわかっていても、止められない我々の欲望もまた、シミュレーション速度改善が永遠のテーマたる理由ではないだろうか。
Simscapeで速度と精度の両立をするには?
ちょうどいい題材があるのでこれを使って試してみる。
ReadMeにこんなことが書いてあって使えそうな気がする。
本例題ではシミュレーション速度と精度のバランスを取ることを目指した
モデリングスタイルをお示しします。
電流制御を行うパワーエレクトロニクス機器をMathWorks製品を使って
モデリングした場合を題材に、
- シミュレーションソルバ設定
- PWM生成部のモデリング
- ADC部のモデリング
についてどのようにモデリングすべきかについて例を示しています。
基本的にはどのようなモデルでも言えることだが、
1.モデリングの粒度
2.適切なソルバー設定
3.モデル複雑度の調整
らへんを心がけていれば良い方向に行くとおもう。
ちなみに、Simscapeは固定ステップで動作することもでき、その場合Simscape内部ソルバーを使うなど固定ステップでのテクニックもあるが、今回は可変ステップソルバーの話に限定しておく。
1.モデリングの粒度
特にパワーエレクトロニクス系のコンバータやインバータは比較的ゆっくりな動き(系統周波数:50Hz-60Hzなど)と、速く細かい動き(スイッチングサージ:数百M~数GHz)が含まれていてそれらが同時に振る舞いとして現れる。
こうなると、ゆっくりな動きである遅い周波数成分を表現するために、比較的長めのシミュレーション時間が必要であるにかかわらず、
細かい動きをしっかり表現するためにシミュレーションの刻み幅はドチャクソ細かくなる。
そうなると当然シミュレーション時間がかかるのは避けられない。
ここで、シミュレーションモデルをつくる人が、「一体どの精度の振る舞いを見たいのか?」をしっかり定めておくのが重要である。
ゆっくりな動きを含めて見たいのであれば、なるべく高周波成分を減らしたモデリングに簡素化する必要がある。
細かい動きを見たいのであれば、なるべくシミュレーション時間が短く、そして細かい動きに寄与する部分を限定的にモデリングして、その他は簡素化する必要がある。
ではパワーエレクトロニクスモデルのどこらへんを特に気をつけて粒度の調整をすればいいか?
パワー半導体部分
このサンプルの注釈にかいてあるのだが、SimscapeはMOSFETにも、IGBTにもそれぞれIdealとN-Channelの2種類が存在している。
どのような用途だとここで記載されてるどのLevelのモデルを使えばいいかの指南的なヘルプも用意されている。こちらにはMOSFETやIGBTだけでなくDiode等他のデバイスについても記載がある。
https://jp.mathworks.com/help/sps/ug/choose-right-semiconductor-block.html
上記のとおり、自分がどの粒度で表現したいかを考えて、この指南書をもとに自分が使うライブラリを選ぶことでモデルの粒度が適切なものに近づくはずである。
PWM生成部分
これは後述のソルバー設定にも関わってくる話でもある。
シミュレーターの精度において厄介なのが非線形な動作の扱いだ。
例えばボールを落としたときに地面に対して跳ね返ってボールが弾む現象においても非線形動作が含まれる。地面にボールがぶつかると急にボールの位置が跳ね返って反対方向に切り替わる。

そのような状況においてソルバーは、厳密に変化点を表現しようとして細かいタイムステップを採用してしまう。それが、シミュレーションが遅くなる要因になる。
こういうゼロを基準に動きが急激に変わる点を”ゼロクロッシング”という。この”ゼロクロッシング”が頻繁に起こらないようにモデリングしたほうが速度優先なモデルになる。
このゼロクロッシング、ゼロというが別にゼロを境界にするところだけに発生するわけではない。
PWMを生成する際には、多くは下記のような図に示す通り、基準信号とキャリア波形を比較してパルスを作るわけだが、

この図でいうコンパレータに相当するブロックであるRelational Operatorブロックが、指定した条件が真に切り替わった瞬間について、ゼロクロッシングとして扱われる。
こちらのヘルプの「ゼロクロッシングを登録するブロック」に示された表にもちゃんとリストされている。

※サンプルモデルのBidirectionalCurrentControlConverter.slx/PowerCircuitModel/PWM Generator部分をキャプチャした。
ここで、キャリア信号が、Simulnk内でDoubleなんかで表現されていると、
このゼロクロッシングを厳密に表現しようとして、浮動小数点の細かい精度単位でちょうどPWMが切り替わるタイミングを計算しようとするわけだ。
可変ステップソルバーによる速度改善の恩恵は得たいけど、ここまでパルス生成に精度がいらないよ・・・という場合にはこのキャリア波形値を量子化することで精度を落としてシミュレーション高速化につなげることができる。
同サンプルの
BidirectionalCurrentControlConverter/PowerCircuitModel/PWM Generator
サブシステムの左下側にあるキャリア信号生成部分を見ると、
Quantizerというブロックでキャリア信号を量子化していることがわかる。つまり”縦方向の刻み幅”をQuantizerで決めてしまうのだ。
これによって量子化されたことで、ゼロクロッシングが発生するタイミングの刻みをコントロールすることができるようになる。
例えば、1パルスあたりのON時間分解能を1/1000にしたければ、このQuantizerに0.001を入力してあげれば0~1のキャリア信号が1000分割された階段波形になる。そのため、例えば0.000001の精度でゼロクロッシングが発生しなくなるため、ソルバーがゼロクロッシングを検出して過剰にステップ幅を追い込むことが無くなる。
これで無駄にソルバーがステップを刻みすぎることを抑止することができる。
2.適切なソルバー設定
一つ前の図をみて、「Quantizerで0.001刻みにしてるのにだいぶ粗い波形になってるじゃねーか」と気がついた人は鋭い。
モデルで精度を設定していたとしても、それは「ユーザが指定した最小刻み」であって、可変ステップソルバーは演算結果(ここでいうとPWMによって最終的に得られる制御対象となる回路の電圧や電流の値)の精度が十分保たれているのであれば、自動的に粗いキャリア波形で実行してくれる。
可変ステップソルバーのいいところは例えば、負荷が変化して急激に電流が変化したところではquantizerで指定した最小の細かいタイムステップにしてくれて、逆に電流が安定した定常状態だと極限にまで粗いタイムステップ(つまり速度を優先して)シミュレーションしてくれる。
先程の図で指定より粗い波形になっているのはこのソルバーの設定で「許容誤差」の部分で「ここまでの誤差範囲なら許容するのでタイムステップ荒くしていい」という指定ができるからだ。
これが精度と速度のバランスをとるときに可変ステップソルバーをお勧めする理由だ。
ただ、この許容誤差の設定を弄くると、結構沼ることが多いので、割と簡単に速度と精度のバランスがとれるおすすめ設定を書いておく。
ソルバーはいわゆる陰的ソルバーと呼ばれるやつを選ぶとパワーエレクトロニクス系のモデルは安定しやすい。
ode15s,ode23tb,daesscあたりがおすすめで、特に精度が粗めでよいのでなるだけ速度優先したいときはode15sを使っている。
また、ソルバーがステップサイズを広く取りすぎないように制限をかける「最大ステップサイズ」は少し注意が必要になる。
下記の通り、キャリア周期(≒スイッチング周期)より長いステップサイズを許してしまうと、下記図右端の通りキャリア波形が潰れてしまうことがある。ナイキストの標本化定理に従って最低でも1周期あたり2点サンプルするように、最低でもキャリア周期の半分が最大ステップサイズとなるように制限をかけておくことをおすすめする。

更に余談だが、このキャリアが消えてしまう現象そのものではないけれど、根本原因は「シミュレーターがゼロクロッシング イベントを見落とす場合」というタイトルでちゃんとヘルプに記載されている。この場合は誤差判定範囲を緩くしてしまうことでゼロクロッシングが見過ごされてしまうことが書いてある。
3.モデル複雑度の調整
Simulnkは連続(厳密には可変ステップソルバーにより最適な刻み幅で表現される疑似的な連続表現)と離散(明示的にステップ幅を指定した領域)を混在してモデリング可能である。
しかし、この「いい感じに混ぜてもなんとなく動いてくれる」良さに頼りすぎるとレートの変換があらゆるところで発生する。
また、フィードバック信号において、「代数ループ」が含まれてしまうとシミュレーションが激遅になるので、ここも明示的に解消するために必ず制御部分と制御対象(プラント)を分離し、その間にRate Tranisitionブロックという、明示的にステップレートを指定したり、代数ループ回避のため意図的に遅れを含めるブロックを入れることをおすすめしたい。

ここでスッキリとしたモデリングをしておくことでメンテナンス性も高くなり、モデルを後から改変しても速度がおそくなったりエラーや警告が乱立するようなことが少なくなる。
高速化の効果を確認
このサンプルには精度を優先したモデリングスタイルと、今回紹介したやり方で速度を優先したモデリングスタイルを比較するために、両方のスタイルでBuck Converterをモデリングした例を示してくれている。
その両者の速度比較を行ってみた。R2025bにて実行してみた。
マシンのCPUはLenovo T14s CPU:13thGen Intel® Core™ i7-1365U、メモリはDDR4で32GBだった。
初期ビルド時間とシミュレーション実行経過時間の差異
サンプルのProjectを展開して、CheckSimulationSpeedとコマンドすると比較できる。こいつは精度優先モデル、速度優先モデルを順番に実行して、シミュレーションに要した実時間(経過時間)を測ってくれる。
最初の1回目はモデルのビルドやシミュレーション用のキャシュを作るため結構時間を要してしまう。
それを考慮して2回 CheckSimulationSpeedを実行した。
2回目だと両者とも早くなっている。1回目と2回目の差はこのキャシュなり初期ビルドの時間と捉えることができる。
この段階でも速度優先(Speed-oriented)のほうが初期ビルドにかかる時間も短縮できていることがわかる。
そして、2回目の実行結果で両者の経過時間を比較する。
精度優先(Accuracy-orieneted)だと37。8秒かかっているのに、速度優先(Speed-oriented)だと2.14秒でシミュレーションが完了している。
つまり15倍以上速度優先モデルのほうが速いということだ。
出力波形の差異
出力結果に差があるかを見てみよう。
波形を見るとこのような感じ。
左が精度優先、右が速度優先の結果。

グラフは上から、
- Buck Converter出力電圧
- 制御補償器が決定したPWMDuty比
- 負荷変動率(0~100%)
- 供給電流(インダクタに流れる電流)
である。
出力電圧をSimulation Data Inspectorの比較ツールで、絶対許容誤差0.5[V]に設定して比較してみたら、少なくとも両者に0.5V以上の差はないことがわかる。

動画でみたい場合はこのサンプルのGitHub、ReadMeに掲載されている。
ここで供給電流の部分を重ねてグラフに書いて拡大してみた。
青が精度優先、赤が速度優先だ。
(位相が1/4ズレているのは見やすくするためなので気にしないでください。)
両者の電流波形、ぴったり同じではないが、このくらいの差で表現ができるなら速度優先も悪くないのではなかろうか。
さらに拡大して見てみると、精度優先はスイッチングの切り替わりのタイミングで発生する電流サージを表現しているが、赤は簡素化したIdealスイッチを使っているのでサージが出ておらず、それによってステップ刻み(丸い点の数で刻み点の数が比較できる)が荒くなっていることがわかる。たしかにこれだけ刻みが違うとシミュレーション速度に違いが出るわなとは我ながら思った。
最後に
いやしかし、
たまたまちょうどよいサンプルを見つけたので、
普段から色々思っていることが書けてよかったです。
こんな良いタイミングでサンプルを出してくれるなんてラッキーだったなぁ~
いやぁ本当にラッキーだった。ほんと。






