
|
Was bedeutet das Beispiel?
|
Eine Monte Carlo Vortäuschung wird durchgeführt, um den Wert von pi zu berechnen. Zuerst wird eine Kreis innerhalb einer 2D Graphik gezeichnet. Ein Tausend zufällige Treffer erreichen die Graphik. Die Treffer, die innerhalb der Kreis fallen, werden in der Berechnung benutzt, während die außerhalb der Kreis liegende Treffer nicht beachtet werden.
Wenn Sie Origin oder die Origin Einschätzungskopie besessen, öffnen Sie das Beispielsprojekt, "Value of Pi.OPJ". Das Projekt finden Sie in dem \Origin\Samples\Programming\Value of Pi Unterordner. Als andere Möglichkeit ist das Beispielsprojekt als ZIP-Datei ladbar. Das Projekt enthält eine Graphfik mit einer Schaltfläche, die die Demonstration anfangen läßt. Zusätzliche Informationen erscheinen in dem Notes-Fenster.
Wenn Sie das Projekt und der C Kode (PDF) ansehen, gibt es einige Wichtigkeiten zu bemerken:
In der Schaltfläche Start
-
Die Funktion wird innerhalb der Schaltfläche Start aufgerufen
ValueOfPi();
-
Danach wird der Textlabel, der den endlichen pi-Wert andeutet, aktualisiert:
page.active=1;
txtPi.text$= \g(p)\-(simulation) = $(data1_pival[10000]);
In dem C Kode
-
Datensatzobjekte werden mit Worksheetspalten verbunden
Dataset dsInX("Data1_InX"); // holds x pos of hits inside circle
Dataset dsInY("Data1_InY"); // holds y pos of hits inside circle
Dataset dsOutX("Data1_OutX"); // holds x pos of hits outside circle
Dataset dsOutY("Data1_OutY"); // holds y pos of hits outside circle
Dataset dsNThrow("Data1_nThrow"); // total hits
Dataset dsPiVal("Data1_PiVal"); // value of pi from hit ratio
-
Der erste Treffer auf der Graphik wird mittels eines Zeitmessers und eines Generators zufälligen Ziffern erzeugt
uint wTick =GetTickCount();
double dR = rnd(wTick);
-
die spätere Treffer werden mithilfe einer 'for'-Schleife und des Generators zufälligen Ziffern erzeugt. Danach wird der Abstand zwischen jedem Treffer und dem Ursprung (X=0, Y=0) berechnet, um festzustellen, ob ein Treffer inner- oder ausserhalb der Kreis gelandet habe. Befindet sich der Treffer innerhalb der Kreis, steigert sich ein Variable, namens iCircle, per 1. Nach der Trefferberechnung wird der pi-Wert kalkuliert.
for(int iTotal=1; iTotal<10001; iTotal++)
{
// generate x,y random pair between -1 and +1
double dRx = 1 - 2 * rnd();
double dRy = 1 - 2 * rnd();
// compute distance from origin to determine if within circle
double dDist = sqrt( dRx^2 + dRy^2 );
if(dDist <= 1) // is inside circle
{
iCircle += 1;
dsInX.SetSize(iCircle); // plot point inside circle
dsInY.SetSize(iCircle);
dsInX[iCircle - 1] = dRx;
dsInY[iCircle - 1] = dRy;
}
else // is not inside circle
{
dsOutX.SetSize(iTotal - iCircle); // plot point outside circle
dsOutY.SetSize(iTotal - iCircle);
dsOutX[iTotal-iCircle - 1] = dRx;
dsOutY[iTotal-iCircle - 1] = dRy;
}
// now compute pi
double dPiValue = 4.0 * iCircle / iTotal;
// update datasets
dsNThrow.SetSize(iTotal);
dsPiVal.SetSize(iTotal);
dsNThrow[iTotal - 1] = iTotal;
dsPiVal[iTotal - 1] = dPiValue;
// update both graphs periodically based on the value of the number of shots
int iPlot = log10(iTotal);
iPlot = 10^iPlot;
if ( (iTotal % iPlot) == 0) LT_execute("page.active=1; plot -l; page.active=2; plot -l;");
