OriginLab Corporation - Data Analysis and Graphing Software - 2D graphs, 3D graphs, Contour Plots, Statistical Charts, Data Exploration, Statistics, Curve Fitting, Signal Processing, and Peak Analysis
  Das Unternehmen    Produkte    Unterstützung    Solutions    Neuigkeiten    Downloadbereich   
 


Produkte :  Origin :  Programmierung :  Origin C

 

Der pi-Wert

 
Demo-Version herunterladen
Preis- und Bestellinformationen

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.

Wie es benutzt wird...

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.

Zu bemerken...

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;");