プログラムは、何か実現したいこと(あるいは実現したいと要請されていること)があって書くものだ。だから、実現したい内容についての理解を増やすことが大切だ。開発言語が何であれ、その実現したい内容についてツールが充実しているものについて知っておいて損はない。
最近、データ解析でパラメータをあわせ込むためにPythonのSciPyライブラリを用いた。
Optimization (scipy.optimize)
Simplex法による合わせこみを利用すれば、計算式の逆変換を求める必要もないし、数値に誤差を含んでいるときの扱いも楽だ。(もちろん誤差の影響を減らすには、未知数の自由度より、実験データの数の方が多いことが必要だ。)
逆変換の計算式を求めるには、手計算での導出が面倒だし、パラメータの値によっては、分母が0に近くなって計算の精度がでないこともある。未知数よりも、実験データの数の方が多くても、それらの全てを利用することができないという欠点がある。
Simplex法は、多数のパラメータを持つ関数の最小化を行うアルゴリズムの一つだ。その昔は、「Numerical Recipes in C」の日本語版の書籍を参考にそのアルゴリズムを別言語に移植して使った覚えがある。
関数の最小化をするアルゴリズムは、MATLABの場合だとOptimization Toolboxに充実している。MATLABを業務で使ってきたとき、インタプリタでの数値解析の便利さを実感した。(Spyder(解説ブログの1例)に代表されるPythonの環境が充実している今となっては、ライセンスが高いMATLABを利用して書く意味はない。もちろんMATLABがお好きな方は、home ライセンス)で安く使えるようになっているので、自宅で使うのもありとなっています。(モデル ベース デザインの分野では、ある種の業界ではSimulinkが事実上の標準となっていて、それがもたらしている利点も知っています。)
Pythonを使って動作の検証を行えば、アルゴリズムの検証がしやすい。Pythonはツールが使いやすいし、MATLAB並みのグラフライブラリmatplotlibが使えるので、結果をチェックしやすい。
そのほかにもPythonでは十分に使った上で、関数の引数がどうあるべきかをすばやく書いて試してみることができるので、単独の関数で実装すべきか、クラスのメソッドとして実装すべきかを、使いながら検証できます。その結果をふまえてからC++で実装すれば、C++での設計に間違えることが格段に減ります。
C++で書かれた別バージョンのライブラリを、開発中のプログラムに移植することの方がむしろ厄介に感じています。
やはりPythonは楽しい