出荷前のテスト仕様として、入力値に対する期待出力値を作成することになりますが、ある程度規模が大きく複雑な「組込み制御ソフトウェア」では、机上計算だけでテストケースを作成するのは、難しいでしょう。その対策として、ソフト仕様が適切であることを確認するために作成した、シミュレーションプログラムを活用することを、考える人は多いでしょう。ということで、この章では、シミュレーションプログラムについての、注意すべき内容について、触れていきます。
私は、組込みソフトを開発する業務をする前に、シミュレーションプログラムの開発業務をしていました。学生時代の専攻が数値計算プログラミングだった事が背景にあります。科学技術系の数値計算プログラミングでは、当時FORTRANが使われることが多く、私も多くのFORTRANコードを書いていました。プログラムの心臓となる方程式を解く方法については、ある程度当時のチームや担当者において、どの方法が良さそうか目処をつけて使っていましたが、計算の対象や条件は毎回異なるので、それぞれの計算対象に応じて、専用のプログラムの開発も必要でした。入力データの作成に必要なプログラム、計算結果を評価するためのプログラムの作成も必要ということで、それらのソフト作成に追われる日々を過ごしていました。
一般的なシミュレーションでは、空間方向の微分(差分)に使うメッシュとも呼ばれる十分に小さい長さの刻みや、時間方向の微分(差分)に使うタイムステップとも呼ばれる十分に小さい時間刻みが使われることが多いでしょう。シミュレーションプログラムでは、微分方程式の微分を差分で表現して計算することになりますが、オイラーやルンゲクッタなどの複数の解法(ソルバー)から選ぶのが一般的だと思います。また、陽解法、隠解法など比較しながら解析結果の精度向上したいという要望も出てくると、さらに、プログラムは複雑になるでしょう。プログラム作成も難しいですが、解析のためにプログラムをチューニングする作業も簡単ではありません。例えば、空間方向の刻みを小さくする事で、解析精度は高くできるのですが、それだけのデータを扱うためのデータを確保するメモリの確保が難しくなる場合もあります。空間方向の刻みを大きくして、その計算のための解法を工夫して、精度を改善する努力を強いられる事もあるでしょう。時間方向の刻みを扱う場合も、そこで目指すのは、空間や時間方向の刻みの変更や、解法の変更でもある程度の範囲で値が一致することを目指して、暴れる解析結果を収束させるための戦いがあります。最終的に、計算時間とメモリ利用量が最少の解法や刻みを見つ蹴られるとハッピーです。
一般に、演算の丸め誤差が収束を妨げる原因になりやすいようです。そのためには、単位や座標系の検討、演算順序の検討などが有効です。どこの演算部分が課題になるかを調べるには、シミュレーションプログラムの主要なデータの値の範囲をモニター出来るようにしておくと便利です。その工夫を入れる事で、プログラミングの作業に、ますます負荷が掛かるかも知れません。
シミュレーションプログラムの開発業務を経験したことのある人であれば、ある程度イメージがつくかもしれませんが、ある程度開発規模の大きなシステムでは、全てのシミュレーションプログラムを、自分で全て開発することは少ないでしょう。ということで、まず、少なくとも他の人が手を加えたプログラムを編集する場合もあります。日々更新されているプログラムには、自分もそうでしたが、十分な説明資料は準備できない場合が多いでしょう。その組織の業務の目的は、解析結果から、最適な対象物の候補を見つけることであって、決してシミュレーションのプログラム作成がしたいわけではありません。プログラムを、製品の一部として出荷する組織であれば、ちゃんとプログラムの仕様書や設計書は残すでしょう。一方で、解析目的で担当者が更新しながら使っているプログラムについては、そのような文書をちゃんと作成してメンテナンスする余裕を作るのは難しいでしょう。ということで、シミュレーションプログラムを頑張ってコードを解読しながら、自分が手を加え始めると、最初は大体動いていたものが、動かなくなります。そこで、頑張ってデバッグして、ようやく動き出し、結果が出るようになるという状況。そこから解析の収束を目指して、刻みや解放の最適化を行います。計算結果が収束した後ようやく、計算結果が正しいことを確認するための作業に移れます。類似の解析を行った論文や、過去の実験データを探してきて、その結果と比較しながら、近いところまで持っていくようなパラメータ調整作業が必要になるでしょう。おそらく、ピッタリ一致することは稀であり、通常は、定性的な評価の指標として使えるところまで、持ってくることが出来れば御の字でしょう。それでも、定性的な評価も実験や実機の結果と比較を繰り返すことで、指標としての精度を上げて、シミュレーションプログラムを育てていく運用になります。
少し脱線しますが、実験結果と比較する作業で気付いた点ですが、シミュレーションプログラムを育てるには、実験の技術の高さも必要となります。経験の高い実験専門の組織では、結果を綺麗に再現する技術を持っています。また、センサーなどの結果ばらつきの取り扱いも優れており、実験室・試験場の結果と、実際の製品運用時の結果の合わせ込みの方法も確立できているでしょう。ただ、このような状態まで持ってくるのは、新規の組織では難しいかも知れません。このような実験が得意なパートナーを見つけて、シミュレーションプログラムを育てることになります。
そうやって育ててきたシミュレーションプログラムも、ハードウェアの更新や、OS、コンパイラーのアップデートの影響で、改修が必要となることがあります。こうしたメンテナンスにも、難しさがあります。私が実際に経験したことですが、当初スパコンで動いていたプログラムが、スパコンが古くなり、比較的安価で性能の高いエンジニアリングワークステーションを利用することができるようになったことから、プログラムを移植することになりました。さらに、エンジニアリングワークステーションからパーソナルコンピューターへと、計算機環境が移っていくわけですが、それぞれFORTRANコンパイラーの仕様が異なっていたため、元のプログラムがそのまま動かず、それぞれ修正する必要がありました。動かないものを修正してやっと動くようになったけれども、計算結果は元のものと一致しませんでした。それら計算結果が一致しない点について、その時いろいろと調査を進めていくと、新しい環境で、コンパイラーのデバッグオプションを入れたものと、外したもので計算結果が異なることに気づきました。さらに、最適化オプションの設定の違いでも、計算結果が変わることに気づきました。当時は1回の解析に数時間かかることもあったので、解析時間はできるだけ短くしたので、最適化オプションを利用したかったのですが、移植する前の計算結果と、最適化オプションを入れたものとの間で計算結果の違いが、入れないものより大きいことがありました。おそらく、コンピュータの計算を早くするために、演算の順番をコンパイラーが変更したのでしょうが、計算精度を落とさないように工夫した演算順序まで、最適化の中で変更されてしまった可能性がありました。結局その時は、最速の最適化オプションは諦めて、結果が最も近くなるものを設定した記憶があります。余談になりますが、この時に、計算機で使われているプロセッサーの種類とコンパイラーの種類やその設定によって、計算結果が変わる可能性があることを認識できたことは、その後の「組込み制御ソフトウェア」開発で、とても役に立ちました。
繰り返しになりますが、業務の目的は、解析結果から、最適な対象物の候補を見つけることであって、決してシミュレーションのプログラム作成やメンテナンスがしたいわけではありません。プログラムをゼロから開発した人はシミュレーションプログラムにとても熱い思い入れがあるでしょうが、使う側から考えると、プログラムを扱える人が限られ、新しい条件の解析の開始やメンテナンスに時間が、あまりにもかかりすぎるので、開発作業全体のネックとも、考えられるようになってきていました。私は導入したエンジニアリングワークステーションの一部に、FORTRANコンパイラーが導入できない事情があり、そこからC言語でのシミュレーションプログラムの移植に取り組んだことがありました。C言語のコンパイラーは、当時エンジニアリングワークステーションのOSに付属されて入っていることが多い一方で、FOTRANコンパイラーが提供されていないものも多かったことが背景にありました。余談ですが、私は、その頃からC言語でのプログラミング作業が増えて、やがて、C言語での組込みソフト開発を担当するようになりました。当時のソフトウェア開発部門では、シミュレーションプログラムでも、組込みソフトでも、業務用に近いようなソフトでも、プログラムを開発できるなら、何でもお願いされていたような記憶があります。。
話が少し逸れてしまいましたが、上記のようにシミュレーションプログラムの取り扱いは難しい上に、プログラミングやメンテナンス作業は大変です。そういったことから、シミュレーションのためのツールの導入も進んできました。今では制御ソフト開発現場の多くの人がSimulink®︎のようなツールを使っています。私がSimulinkを使い始めたのは、「組込み制御ソフトウェア」開発の業務へ移ってしばらくしてからです。このようなシミュレーションツールを使うにしても、シミュレーションプログラムの扱いについて、上記で説明した、刻みと解法の取り扱いや、計算の収束と計算誤差の扱いは、市販のツールを使ったとしても、気を付ける必要があります。ただ、シミュレーションプログラム開発担当者のプログラム完成を待たずに、また、自分でプログラム開発したり、メンテをせずに、解析が可能になる利点は、計り知れないでしょう。このような市販ツールのユーザが増えるのも理解できます。
この章では、シミュレーションプログラムについて、以下のことを説明しました。
(1)微分(差分)計算のための、刻みと解法の最適な組み合わせを考える。
(2)計算の収束、計算誤差の扱いについて、指標を持つ。
(3)適切な実験結果との比較で、シミュレーションプログラムを育てる必要がある。メンテナンスにも気を付ける。
(4)シミュレーションツールの活用も検討する。ただし、上記条件については同じ。

