高速道路において、事故や車線規制がなくてもある程度以上混んだ状況の元で渋滞が発生することを目にしたことがあると思います。このような渋滞を自然渋滞といいます。等間隔で走行する状態が不安定になり、直線的な道路のなかに混んだところ(渋滞クラスター)と空いたところがまだらに分布している状況が出現するのです。(このページの下に実験のビデオがあります。参考にしてください。)
このような道路の自然渋滞を説明する一数理モデルを例に,モデル方程式のたて方,数値シミュレーションプログラムの作り方を実習します.
n変数の微分方程式である以下のような「最適速度モデル」の数値計算と視覚化プログラムを実習します。モデルについての解説は、配布テキストを使って行います。
授業の進行状況に応じて、以下にコメントを付け加えていきます。
全体としては、冬休み明けまでに完成させる予定で進めます。今週は、プログラム全体の構成について理解し、チェックポイント1までを作成することを目標とします。(それができてないと、次へ進めないので、来週には、チェックポイント1までのプログラム例を示します。)
チェックポイント1までをまず完成させ、動作を確認し、チェックポイント2にむけて進んでください。
シミュレーション本体(時間発展をルンゲクッタあるいはオイラー法で計算し,描画する)の設計とコーディングをすすめます。
印刷テキストの流れ図を参考に,以下を行なってみましょう。
チェックポイント1がまだの人は、こちらを参考にしてください。
チェックポイント1の時点ではマスクしておくつもりの解答例を上記の参考(プログラム例)のページに載せてしまいました。参考プログラムには、微分方程式の右辺関数の部分も載っています。これをよく読んで理解し、図示するところを作成し課題4-1を完成させてください。
課題4−1ができたら、課題4−2に取り組んでください。
(締め切り: 12/15)
cpgsci(3); cpgcirc(x_draw[n], y_draw[n], 0.01);
どのように車(●)を書いたらよいか、ノートにイメージを描いてみましょう。構想ができてからプログラムにとりかかってください。
(注意:) 4-2のアニメーションは、車(●)を描き、それを下地の色で塗りつぶし、新しい位置に●を描くことの繰り返しで動いているように見せるものですが、PGPLOTでは描くごとにメモリーを消費していくので、多数回繰り返すとメモリーが足りなくなりハングアップする可能性があります。前のものをクリアするのではなくどんどん上塗りしていく仕組みになっています。
車全台の速度の平均値を計算する関数を作成し(あるいはメイン関数内に書き)、その時間変化を調べてみよう。感度パラメータ$a$や密度$\rho=N/L$の違いによりどのように変化するかをプロットしてみよう。
(締め切り: 12/27)
計算を速くするため、描画を行わないようにする。(コメントアウトするだけでもよいがプログラムが見にくくなるので、4-2のプログラムのコピーを別名で作成し、不必要なコードを取り除いたほうがよい。)
main関数の前に
double getAverageSpeed(double *x) { // // }
のような平均速度を計算し、値を変えすプログラムを書く。(10行以内でかけるはず。)
課題4-2で描画していた場所あたりで、上記の関数を呼び、時刻と平均速度をprintfで表示してみる。 たとえば、
L=160.000000, a=1.500000 100.000000, 0.963772 100.050000, 0.963771 100.100000, 0.963769 100.150000, 0.963767 .... 199.850000, 0.964205 199.900000, 0.964199 199.950000, 0.964193 200.000000, 0.964188のような出力になる。
計算上限の定数と同様に、記録する時刻の下限を定義し、 GET_V_MIN < t < UpdateMaxの時間範囲の平均速度を計算の最後に密度(N/L)とともに出力する。
#define UpdateMax 200000.0 #define GET_V_MIN 100000.0
次のように、ある密度$\rho=N/L$で流量$q = \rho\langle v\rangle$がピークとなり、その高密度側で、急な変化が2点でみられる。(大きな$N$の値で、長時間・多数のサンプルで平均すると、急な変化ではなく不連続な変化となって現れる。)
参考: $a=1.3$のときの、密度・流量図
上に掲げた2つの図(理論解析の結果とシミュレーション結果)を並べてみてほしい。
$a$を一定にして、$L$を変えてみることは左の図では水平方向に密度を少しずつずらし、平均速度と流量を計算してみると右図のようになるということである。$a=1.5$の場合、$\rho$が0.4と0.7付近、$1/\rho$では、2.5付近と1.5付近でが転移点になっている。この間の部分で部分渋滞が発生する。
作成するプログラムのイメージをつかむために,ブラウザ内で動作させる動作例(JavaScriptで作成)を下に掲載する.(注:感度パラメータaが V'(L/N)<a/2
では渋滞が発生,以上では起こらないことが,解析的にわかっている.下のシミュレーションでは a=2
が境目である.)