/* S0330.java * 指数分布のシミュレーション * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S0330 extends Applet implements ActionListener { Button button0; public void init() { button0 = new Button(" 再実行 "); add(button0); button0.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); repaint(); } public void paint(Graphics g){ Window w ; w = new Window(); double T_END = 1000.0; /* シミュレーション終了時刻 */ double T_DISP = 20.0; /* 事象表示時刻 */ int TAU_MAX = 10; /* τの最大値 */ long j; /* 事象発生の回数 */ int f[] = new int[TAU_MAX + 1]; /* ヒストグラム */ int u; /* τの整数部分 */ double lambda = 1; /* λ */ double dt = 0.01; /* 微小時間 */ double t0 = 0.0; /* 一つ前の事象が発生した時刻 */ double t = 0.0; /* 現在の時刻 */ double tau = 0.0; /* 事象発生の間隔τ */ /* グラフィックの準備 */ int SPACE = 20; int HIGHT = 400; int WIDTH = 640; w.setWindow(0, 0.0, 0.0, T_DISP, 1.0, 0, (int)(2.5*SPACE), WIDTH, (int)(1.5*SPACE)); w.setWindow(1, 0.0, 0.0, T_DISP/2.0, 1.0, (int)(0.25*WIDTH), (int)(HIGHT-SPACE), (int)(0.75*WIDTH), (int)(4*SPACE)); w.axis(1, "tau", 1.0, "freq", 0.1, g); /* メイン */ g.setColor(Color.green); w.moveTo(1, 0, exponent(lambda, 0), g); while (tau <= TAU_MAX) { w.lineTo(1, tau, exponent(lambda, tau),g); tau = tau + dt; } j = 0; while (t <= T_END) { if ((lambda * dt) > Math.random()) { if (t < T_DISP) { w.line(0, t, 0, t, 1,g); } tau = t - t0; u = (int)tau; if (u <= TAU_MAX) { f[u] = f[u] + 1;} t0 = t; j = j + 1; } t = t + dt; } /* ヒストグラムを書く */ g.setColor(Color.red); for (u = 0; u < TAU_MAX ; u ++) { w.line(1, u + 0.5, 0, u + 0.5, (double)f[u] / j,g); } } public double exponent(double lambda, double tau) { return(lambda * Math.exp(-lambda * tau)); } }