| | HOME | 目次 | | 2009 (C) H.Ishikawa |
| 5.1 | モンテカルロ法の古典−−ビュフォンの針−− | ||
| 5.2 | 乱数によりπを求めるもう1つの例−−モンテカルロ法による数値積分−− | ||
| 5.3 | 乱数により球の体積を求める−−モンテカルロ法による多重積分−− | ||
| 演習 |
| 図5.1.1 ビュフォンの針 |
![]() |
| 図5.1.2 ビュフォンの針 実行結果 |
![]() |
| S0510.java ビュフォンの針 | Download | 実行 | |
/* S0510.java
* ビュフォンの針
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0510 extends Applet implements ActionListener {
Button button0;
Button button1;
boolean sw = false;
public void init() {
button0 = new Button(" 実行 ");
button1 = new Button("クリア");
add(button0);
add(button1);
button0.addActionListener(this);
button1.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if (label.equals(" 実行 "))
sw = true;
else
sw = false;
repaint();
}
public void paint(Graphics g) {
Window w;
w = new Window();
int height;
int width;
int NUMBER = 1000; /* 落とした針の本数 */
double MAX = 8.0;
double P = 0.5; /* 確率p */
int j; /* forのカウンタ */
int xl; /* forのカウンタ */
int n1 = 0; /* 針が交わった回数 */
double x0, y0; /* 針の中央の座標 */
double x1, y1, x2, y2; /* 針の先端の座標 */
double th; /* θ */
/* スクリーンの大きさを読み取る */
width = getSize().width;
height = getSize().height;
/* グラフィックの準備 */
w.setWindow(0, 0, 0, MAX, MAX * height / width, 0, height, width - 1, 0);
for (xl = 0; xl <= MAX; xl++) {
w.line(0, xl, 0, xl, MAX, g); /* 平行線 */
}
g.setColor(Color.green); /* 緑 */
/* メイン */
if (sw == true) {
for (j = 1; j <= NUMBER; j++) {
x0 = MAX * Math.random();
y0 = MAX * height / width * Math.random();
th = 2 * Math.PI * Math.random();
x1 = x0 + Math.cos(th) / 2;
y1 = y0 + Math.sin(th) / 2;
x2 = x0 - Math.cos(th) / 2;
y2 = y0 - Math.sin(th) / 2;
w.line(0, x1, y1, x2, y2, g);
if ((int)x1 != (int)x2) { /* (1)針の両端の座標の整数部が異なっている時 */
n1 = n1 + 1;
}
}
g.setColor(Color.black);
g.drawString("pi = " + (double)(j) /(double)(n1) * 2.0, 20, 10);
}
}
}
|
| この章始め |
![]() |
・・・・・ | 式5.2.1 |
![]() |
・・・・・ | 式5.5.2 |
| 図5.2.1 1/4円 |
![]() |
![]() |
・・・・・ | 式5.2.3 |
![]() |
・・・・・ | 式5.2.4 |
| 図5.2.2 モンテカルロ法によるπの計算結果 |
![]() |
| S0520.java モンテカルロ法によるπの計算 | Download | 実行 | |
/* S0520.java
* モンテカルロ法によるπ
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0520 extends Applet implements ActionListener {
Button button0;
Button button1;
boolean sw = false;
public void init() {
button0 = new Button(" 実行 ");
button1 = new Button("クリア");
add(button0);
add(button1);
button0.addActionListener(this);
button1.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if (label.equals(" 実行 "))
sw = true;
else
sw = false;
repaint();
}
public void paint(Graphics g) {
Window w;
w = new Window();
int height;
int width;
int NUMBER = 10000; /* 雨滴の数 */
int SPACE = 30;
int j; /* forのカウンタ */
int xl; /* forのカウンタ */
int n1 = 0; /* 円の中に入った雨滴 */
double x0, y0; /* 雨滴の座標 */
double pi = 0.0; /* πの近似値 */
/* スクリーンの大きさを読み取る */
width = getSize().width;
height = getSize().height;
/* グラフィックの準備 */
w.setWindow(0, 0, 0, 1, 1, SPACE, height/2 + SPACE, height/2 + SPACE, SPACE);
w.axis(0, "", 1.0,"", 1.0, g);
w.setWindow(1, 0, 0, NUMBER, 4,
SPACE, height - SPACE, width - SPACE, height/2 + 2*SPACE);
w.axis(1, "j", NUMBER / 10, "pi",1.0, g);
/* メイン */
if (sw == true) {
w.moveTo(1, 0.0, 0.0, g);
for (j = 1; j <= NUMBER; j ++) {
x0 = Math.random();
y0 = Math.random();
if (x0 * x0 + y0 * y0 < 1.0) { /* 円の中に入った場合 */
n1 = n1 + 1;
g.setColor(Color.blue);
w.putPixel(0, x0, y0, g);
}
pi = (double)n1 / j * 4;
g.setColor(Color.green);
w.lineTo(1, (double)j, pi, g);
}
g.setColor(Color.black);
g.drawString(" pi = " + pi, 10, 10);
stop();
}
}
}
|
| この章始め |
![]() |
・・・・・ | 式5.3.1 |
![]() |
・・・・・ | 式5.3.2 |
| 図5.3.1 球 |
![]() |
| 図5.3.2 モンテカルロ法による球の体積計算結果 |
![]() |
| S0530.java モンテカルロ法による球の体積計算 | Download | 実行 | |
/* S0530.java
* モンテカルロ法による球の体積計算
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0530 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();
int SPACE = 20;
int HIGHT = 400;
int WIDTH = 640;
int NUMBER = 1000; /* 乱数の組の数 */
int j; /* forのカウンタ */
int n1 = 0; /* 球の中に入った数 */
double x0, y0, z0; /* 点の座標 */
double v = 0.0; /* 体積の近似値 */
w.setWindow(0, 0, 0, NUMBER, 8, SPACE, HIGHT-SPACE, WIDTH-SPACE, SPACE);
w.axis(0, "j", NUMBER / 10, "v", 1, g);
g.setColor(Color.green);
w.moveTo(0, 0.0, 0.0, g);
for (j = 1; j <= NUMBER; j ++) {
x0 = Math.random();
y0 = Math.random();
z0 = Math.random();
if (x0 * x0 + y0 * y0 + z0 * z0 < 1.0) { /* 球の中に入った場合 */
n1 = n1 + 1;
}
v = (double)n1 / j * 8;
w.lineTo(0, j, v, g);
}
g.setColor(Color.black);
g.drawString(" v = " + v, 10, 10);
stop();
}
}
|
| この章始め |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| この章始め |
| | HOME | 目次 | | 2009 (C) H.Ishikawa |