OV model with slow viehicles

1車線のOVモデルのプログラムをつくってみる

プログラミング3のページを参考に、そこに書いてあることを、javaでコーディングしてみる。

http://cosmos.ee.yamanashi.ac.jp/~toyoki/lectures/prog3/numModel.html

前段階の学習(常微分方程式の数値解法)(プログラミングIIIのプリントより)

https://drive.google.com/open?id=0B6lH1nU-JHEcNzZJVVV4MVhzSUU

ブラウザの中では文字化けするかもしれません。ダウンロードして見てください。

ステップ1: 基本構造と初期条件の設定

class ov {
    // グローバル変数のセット
    protected static double sensitivity, beta;   // セルの数、初期の車台数、パラメータ
    protected static double[]  x, v;    // 車の位置、速度


    ///////////// メインメソッド //////////////////
    public static void main(String[] args) {
	int step=0;  // 時間

	setInitialCondition();
	// 描画
	gr.drawCars(x, numberOfCars);


	// 時間発展の繰り返し
	for(int i =0; i < 100; i++) {

	   // update();
	   // setBoundaryCondition();
	    // 状態の書き出し
	}
    }

    //////////// 初期値設定 ///////////////////
    public static void setInitialCondition() {
	// initial_n台の車を等間隔に
	// 速度は乱数により設定
    }

    /////////// 時間発展 /////////////////////
    public static void update() {
	// 速度を計算し、それに基づいて車を進める
    }

    ////////// 境界条件処理(車の生成、消滅) ////
    public static void setBoundaryCondition() {

    }


}

ステップ2: 車の初期位置を画面に描いてみる

新たに、描画するためのクラスを定義するdrawConfiguration.javaを次のように作成する。

import java.io.*;
import java.awt.*; // uses the abstract windowing toolkit
import javax.swing.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class drawConfiguration extends JPanel {
    static Graphics g;
    static JFrame gWin;
    double screenWidth, roadLength;
    int frameTop, frameLeft; // platform-dependent width of frame's top and left
    int marginX=20, marginY=20;


    // コンストラクタ
    drawConfiguration(int fSize, double rLength) {
    	screenWidth = (double) fSize;
	roadLength = rLength;
    	// シミュレーション本体画面の初期化
    	gWin = new JFrame("OV Model");
    	gWin.setLocation(20, 150); // screen coordinates of top left corner
    	gWin.setResizable(false);
    	gWin.setVisible(true); // show it!
    	Insets theInsets = gWin.getInsets();
    	gWin.setSize(fSize + theInsets.left + theInsets.right + marginX*2, fSize
    			+ theInsets.top + marginY*2+ theInsets.bottom+30); /* 下30は文字出力用*/
    	this.frameTop = theInsets.top;
    	this.frameLeft = theInsets.left;
    }

    // 車の描画
    public void drawCars(double[] x, int numberOfCar) {
	double x_coordinate, y_coordinate;
	double pi2 = Math.PI * 2.0;
	double radius = 0.9 * screenWidth /2.0;

	// 描画する画面(Graphics)を特定する
    	this.g = gWin.getGraphics();

	// 画面全体をクリア
	g.setColor(new Color(255,255,255));
    	g.fillRect(0, 0, gWin.getWidth(),gWin.getHeight());

	int x_center = gWin.getWidth()/2;
	int y_center = x_center;

	System.out.println(x_center+ ", " + y_center +", "  +  gWin.getHeight());

	// 車の位置を描画
	g.setColor(new Color(0,0,255));
	for(int i=0; i< numberOfCar; i++) {
	    x_coordinate = radius * Math.cos(pi2*x[i]/roadLength) + x_center;
	    y_coordinate = radius * Math.sin(pi2*x[i]/roadLength)  + y_center;
	    System.out.println(x_coordinate + ", " +y_coordinate);
	    g.fillOval((int) x_coordinate -5, (int) y_coordinate -5, 10, 10); // 半径10
	}
    }

}

main()メソッド内で、このクラスのインスタンスを作成し、配置を描画するメソッドdrawConfiguration()に位置の情報をを渡す。

import java.io.*;

class ov {
    // グローバル変数のセット
    protected static int numberOfCars = 100;
    protected static double sensitivity, beta;   // セルの数、初期の車台数、パラメータ
    protected static int[]  x, v;    // 車の位置、速度
    protected static drawConfiguration gr;   // グラフィック用クラスの宣言


    ///////////// メインメソッド //////////////////
    public static void main(String[] args) {
	int step=0;  // 時間
 	gr = new drawConfiguration(600, roadLength);  // グラフィック用クラスのインスタンス化

	setInitialCondition();
	// 描画
	gr.drawCars(x, numberOfCars);                           // 描画メソッドの利用

	// 時間発展の繰り返し
	for(int i =0; i < 100; i++) {
//	    update();
//	    setBoundaryCondition();
	    // 状態の描画
  	    gr.drawCars(x, numberOfCars);
	}
	// 直ぐに終わらないための措置 (処理系によっては、なくても良いかもしれない)
	System.out.println("終了には、何かのキーを入力してください");
	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	try{
	    String  str = in.readLine();
	    System.out.println(str);
	    System.exit(0);
	} catch(Exception e) {
	    System.exit(1);
	}
	System.exit(0);
    }

   // 以下略

ステップ3: 微分方程式の数値解法のプログラムを作成する

2車線モデルのプログラムをつくる