C++ による数値シミュレーション入門 (1/4)|導入
東工大情報理工学院 高安研究室 で開催されている新入生向けのプログラミングゼミの資料を一部公開します.
本稿は C++ による数値シミュレーション入門 の第 1 部です.
本稿では,研究で重たい数値シミュレーションを回す必要のある方を対象に,C++ の使い方を基礎から解説します.一般向けの C++ 入門の多くは,大規模開発に使うことを想定してオブジェクト指向プログラミングの機能の解説に重点を置いています.しかし,シミュレーションに必要な機能はそれよりもずっとシンプルです.本稿は簡単なシミュレーションの実装をゴールに,C++ の最低限の知識を提供することを目指します.
はじめに
本章では,
(1) 数値シミュレーションとは何かを具体例とともに紹介し,
(2) C++ の特徴と本稿で紹介する機能を提示します.
数値シミュレーションとは
数値シミュレーションとは,現実のシステムやプロセスを模倣してルールを定義し,コンピュータ上で実行することです.複雑なシステムのふるまいや性質を予測したり分析したりするのに使います.日常的にお世話になっている天気予報は,大気や海洋・陸地の状態を物理方程式に従ってコンピュータ上で時間変化させ,将来の状態を予測しています.(参考:気象庁 > 数値予報とは)
シミュレーションは決定論的なものと確率論的なものに分類できます(単に決定的,確率的ともいう).
- 決定論的シミュレーション: 状態の変化が直前の状態によって完全に決定されるもの.初期値とパラメータが決まれば,状態の変化は常に同じ.
- 確率論的シミュレーション: 状態の変化が確率的に決定されるもの.サイコロの出た目によって行動を変えるようなシミュレーションがこれに当たります.
高安研究室で使われているシミュレーションの例を紹介します.
-
ディーラーモデル
金融市場に参加するディーラーたちの戦略を定義し,マクロな現象として観測される暴騰・暴落などの金融市場価格の動的なふるまいとの関係を探る.順張り・逆張り戦略取るディーラーの比率を変えたり,利益確定や損切りの閾値を変えたり,政府による為替介入を導入できたりと,発展性が高い.[1] Yamada, Kenta, Hideki Takayasu, Takatoshi Ito, and Misako Takayasu. 2009. “Solvable Stochastic Dealer Models for Financial Markets.” Physical Review. E, Statistical, Nonlinear, and Soft Matter Physics 79 (5 Pt 1): 051120. http://dx.doi.org/10.1103/PhysRevE.79.051120
[2] 松永健太, 山田健太, 高安秀樹, and 高安美佐子. 2012. “スプレッドディーラーモデルの構築とその応用.” 人工知能学会論文誌 27 (6): 365–75. http://dx.doi.org/10.1527/tjsai.27.365
-
企業間取引ネットワークの時間発展モデル
新規参入する企業がどのような規模の企業と取引を開始するのか,どのような企業が合併・分社するのか,どのような企業が倒産するのかを調べ,マクロな性質である売上高や成長率,寿命の分布などを再現する.[3] Miura, Wataru, Hideki Takayasu, and Misako Takayasu. 2012. “Effect of Coagulation of Nodes in an Evolving Complex Network.” Physical Review Letters 108 (16): 168701. http://dx.doi.org/10.1103/PhysRevLett.108.168701
[4] Ozaki, Jun ’ichi, Eduardo Viegas, Hideki Takayasu, and Misako Takayasu. 2024. “Integration of B-to-B Trade Network Models of Structural Evolution and Monetary Flows Reproducing All Major Empirical Laws.” Scientific Reports 14 (1): 4628. http://dx.doi.org/10.1038/s41598-024-54719-0
C++ とは
C++ は1983年に開発されたコンパイル言語であり,データ解析の現場では重たい計算を回す際に使われています.
C との比較
C++ は C 言語の拡張であり,クラスや継承などのオブジェクト指向プログラミングの機能が追加されたほか,基本的なデータ構造やアルゴリズムが標準ライブラリにまとめられ,追加されました.C 言語にはこれらの機能が備わっておらず,基本的にはすべて自前で実装する必要がありました.C++ ではライブラリを活用することで実装コストを抑えることができます.
Python との比較
Python はインタープリタ言語であり,シンプルなコードと充実したライブラリが特長です.C++ は実装コストと多機能性の面では Python に劣りますが,実行速度の面では C++ に軍配が上がります.特に,シミュレーションのように,実装は単純だがループの多いプログラムには C++ が適しています.C++ の強みを活かし,弱みを補うために,以下のように作業を仕分けることが多いです.
- Awk などの UNIX コマンド: データ抽出
- Python: 基本的な解析と図表作成
- C++: シミュレーション等の重たい計算
C++ で覚えること(本稿の構成)
内容を3つのカテゴリに分け,順に解説します.
-
基本
- C++ の使い方:コンパイルと実行方法
- 基本型:
bool
,char
,int
,double
,void
- 関数:定義,関数呼び出し
- 制御文:
if
,for
,while
,switch
- コマンドライン引数:
argc
,argv
クラス,構造体,テンプレート
-
標準ライブラリ
- 文字列:文字列型と数値型の相互変換
- 入出力:標準入出力,ファイル入出力
- コンテナ:
vector
,map
,set
,queue
,stack
,pair
,tuple
- 数値計算:
cmath
,random
アルゴリズム:sort
,unique
,reverse
-
シミュレーションの実装
- ネットワークの成長モデル(Barabashi-Albert model)
- ディーラーモデル
課題 1
- C++(コンパイル言語)と Python(インタープリタ言語)のプログラムの実行方法の違いを理解してください
- Python では処理を高速化するために for 文の使用を避けることが推奨されます.理由を説明してください
補足: Visual Studio Code 上の準備
Visual Studio Code をお使いなら,拡張機能 C/C++ を入れておくと良いでしょう.IntelliSense という入力支援機能が入っており,プログラミングが楽になります.
エディタの自動整形機能も利用しましょう.Visual Studio Code では,保存時に自動整形する機能である Format on Save
が標準搭載されています.設定から有効にしてください.
補足: C++ を網羅的に学習したい方への案内
C++ を網羅的に学習したい方は下記のサイト等を利用できます.
- ゼロから学ぶ C++ https://rinatz.github.io/cpp-book/
- 一週間で身に付く C++ 言語の基本 https://cpp-lang.sevendays-study.com
特に,class を使えるようになると実装の幅が広がります.
Discussion