Pi per Monte-Carlo Turbo Pascal

aus Paswiki Turbo Pascal, der freien Wissensdatenbank

Beschreibung

Dieses Programm, in Turbo Pascal geschrieben, ermittelt die irrationale Zahl Pi rechnerisch und grafisch mit dem Monte-Carlo-Algorithmus.

Erklärung

Der Monte-Carlo-Algorithmus ist ein Algorithmus, d.h. ein Lösungsschema, bei dem mit Zufallszahlen gearbeitet wird.

Zufallspunkte werden im Quadrat erzeugt

Hier werden Zufallszahlen zwischen auf 0 und 1 erzeugt ( zur grafischen Verdeutlichung jeweil mit 400 multipliziert ) und als Punktkoordinaten gedeutet.

Diese Zufallszahlen liegen in einem Quadrat mit den Gegenecken (0/0) und (1/1).

Für jeden Punkt wird nun berechnet, ob er im Quadrat ( immer der Fall ) oder auch im Kreis liegt.


Weil der Zufall auf lange Sicht kein Gebiet im Quadrat bevorzugt, verhält sich die Anzahl der Punkte im Viertelkreis ( hier mk ) zur Anzahl der Punkte im Quadrat ( hier mq ) wie der Inhalt des Viertelkreises zum Inhalt des Quadrats :


mk / mq = 0.25*pi / 1    =>   pi = 4 * mk / mq 

Programm

program monte_carlo_pi;
{$N+}
uses graph,crt;
var x,y,mq,mk,p:extended; i,v,anz,anz2:longint;  trei,modus:integer; s:string;

begin
trei:=detect;
initgraph(trei,modus,'');

directvideo:=false;
settextstyle(1,horizdir,2);
outtextxy(10,10,'Anzahl der Zufallspunkte ?');
gotoxy(1,3);
readln(anz);
writeln;
outtextxy(10,50,'Anzahl der Durchlaeufe ?');
gotoxy(1,6);
readln(anz2);
cleardevice;

line(50,0,50,460);
line(0,450,650,450);
line(450,50,450,450);
line(50,50,450,50);
circle(50,450,400);

settextstyle(0,horizdir,1);

randomize;

for v:=1 to anz2 do
begin
if v>1 then readkey;
cleardevice;
gotoxy(3,12);write(v,'.');

outtextxy(180,460,'fortlaufend Taste druecken');

line(50,0,50,460);
line(0,450,650,450);
line(450,50,450,450);
line(50,50,450,50);
circle(50,450,400);

mk:=0; mq:=0;

for i:=1 to anz do
begin

y:=random;
x:=random;
if (sqr(x)+sqr(y))<=1 then begin mk:=mk+1;mq:=mq+1;
putpixel(round((x*400))+50,450-round(y*400),12);
end
else begin mq:=mq+1;
putpixel(round((x*400))+50,450-round(y*400),14);
end;

end;
p:=p+4*(mk/mq);

end;

p:=p/anz2;

str(p:0:10,s);
s:=' PI = '+s;

settextstyle(1,horizdir,2);
outtextxy(100,10,s);
s:='';

str((((p/pi)-1)*100):0:5,s);

s:=s+' Prozent falsch';

settextstyle(15,horizdir,2);
outtextxy(350,20,s);

readln;
closegraph;

end.

Gastarbeiter 21:20, 26. Mär 2006 (CEST)


'Persönliche Werkzeuge
Extras