Aufgabe 1.2

Aufgabenstellung:

Das nebenstehende Quadrat der Kantenlänge 1 wird durch einen Einheitskreis mit Mittelpunkt in der linken unteren Ecke des Quadrates unterteilt. Die Größe der Teilfläche innerhalb des Kreises ist Pi/4, die Gesamtfläche des Quadrates ist 1.

Wir nutzen obigen Sachverhalt, um Pi näherungsweise zu berechnen.

Angenommen, wir haben eine Zufallsgenerator, der gleichverteilt Punkte in das Quadrat "schießt". Ein Punkt P=(x,y) liegt innerhalb des Kreises, wenn sein Abstand d von der linken unteren Ecke <= 1 ist, sonst liegt er außerhalb.

Die Wahrscheinlichkeit, daß d <=1 ist, ist also Pi/4, der Fläche des Viertelkreises.

Wenn man n Zufallspunkte generiert und davon m Punkte im Viertelkreis liegen, solle m/n den Wert Pi/4 approximieren, und je größer n ist, desto genauer sollte die Näherung werden.

Schreiben Sie ein Programm PiApprox, das eine solche Pi-Approximation liefert.

Das Programm werde beendet, wenn N=10000 Punkte generiert sind, oder die Näherung sich nicht mehr in der 3. Nachkommastelle ändert. Es sollen aber mindestens 1000 Punkte zunächst ausgewertet werden.

Das Programm gebe bei jedem Näherungsschritt aus:

Nummer des Näherungsschrittes, Koordinaten des Punktes, bisher errechnetes Pi.

Hinweis: Die Pascalfunktion random liefert Zufallszahlen zwischen 0 und 1. Durch zweimaligen Aufruf x := random und y := random kann man fortlaufend Zufallspunkte generieren.

Bitte geben Sie ein lauffähiges, gut kommentiertes Pascal-Quellprogramm als Lösung ab.

Lösung:

program Test;

const maxtests=100000; { 1 Million für G4/1000 geht in 2 Sekunden }
const mintests=10000;

var inside,             { Punkte im Kreis }
    testcount: integer; { Anzahl Tests }

procedure test;
var x:double;
var y:double;
var d:double;
begin
testcount:=testcount+1;
x:=random;
y:=random;
{ WriteLn("x=",x:10:8,"  y=",y:10:8); }

d:=sqrt(x*x+y*y); { nach Pythagoras }

{ WriteLn("d=",d:10:8); }

if d<=1 then
    inside:=inside+1; { innen }
end;

var e,last:double;

procedure main;
var i,n:integer;
begin
e:=0; 
n:=0;
while (testcount<maxtests) do { Noch ein Testpacket? }
    begin
    n:=n+1;
    last:=e;
    for i:=1 to mintests do test; { ein Testpacket = mintests Tests }

    e:=4.0*inside/testcount;         { pi berechnen}
    WriteLn("PI[",n,"]=",e:10:8);
    
    if (abs(last-e)<0.0001) then     { Wenn sich nix mehr tut, dann ist Schluß }
        begin
        exit;
        end;
    end;

end;

begin
Randomize;        { Zufallszahlengenerator anschmeißen }
main;
WriteLn("PI: ",e:10:8);
WriteLn("Anzahl Test: ",testcount);
end.

Kompilieren:

Christian-Schmitzs-G4:~/test cs$ gpc -o test main.pas

Testlauf:

Christian-Schmitzs-G4:~/test cs$ ./test
PI[1]=3.12000000
PI[2]=3.12200000
PI[3]=3.13733333
PI[4]=3.12800000
PI[5]=3.12560000
PI[6]=3.14066667
PI[7]=3.12800000
PI[8]=3.12700000
PI[9]=3.12444444
PI[10]=3.12840000
PI[11]=3.13236364
PI[12]=3.12966667
PI[13]=3.13107692
PI[14]=3.13057143
PI[15]=3.13013333
PI[16]=3.13300000
PI[17]=3.12588235
PI[18]=3.12822222
PI[19]=3.12631579
PI[20]=3.13580000
PI[21]=3.13523810
PI[22]=3.13563636
PI[23]=3.13686957
PI[24]=3.13183333
PI[25]=3.13136000
PI[26]=3.13030769
PI[27]=3.13185185
PI[28]=3.13014286
PI[29]=3.13062069
PI[30]=3.13186667
PI[31]=3.13496774
PI[32]=3.13612500
PI[33]=3.13563636
PI[34]=3.13635294
PI[35]=3.13577143
PI[36]=3.13688889
PI[37]=3.13762162
PI[38]=3.13800000
PI[39]=3.13989744
PI[40]=3.14070000
PI[41]=3.13951220
PI[42]=3.14295238
PI[43]=3.14186047
PI[44]=3.13854545
PI[45]=3.13777778
PI[46]=3.13913043
PI[47]=3.13906383
PI: 3.13906383
Anzahl Test: 47000



Links
MBS Real Studio Plugins

In Erinnerung and den lächelnden Mac Plus, den man beim Start von Mac OS 1 bis X.1 sieht...