Monte-Carlo Integration

Monte-Carlo Integration

Beitragvon CommanderTomalak » 11.06.2010 16:26

Hier ma mein Ergebnis:

Code: Alles auswählen
The volume of this object is 12.2127
The coordinates of the balance point are (0.105212, -0.00120664, 0.714322)



Code: Alles auswählen
/**
* Task 24
* Monte-Carlo-Integration
*/
void task24()
{
    coord3d crntPoint;
    double sum = 0;
    double Vq = 4*4*2; // Volume of cuboid
   
    // Walk the 10^6 random points and add 1 to the sum for every point within the object
    for(int i = 0; i < NUMPOINTS; i++)
    {
        crntPoint = generateRandomPoint();
       
        if(isInArea(crntPoint)) sum += 1;
    }
   
    // Calculate the volume of our object
    double V = Vq / NUMPOINTS * sum;
   
    cout << "The volume of this object is " << V << endl;
   
    // Calculate balance point
    coord3d sumPoint = {0, 0, 0};
   
    // Walk agein 10^6 random points
    for(int i = 0; i < NUMPOINTS; i++)
    {
        crntPoint = generateRandomPoint();
       
        // if point is within our object add point to sum vector
        if(isInArea(crntPoint))
        {
            sumPoint.x += crntPoint.x;
            sumPoint.y += crntPoint.y;
            sumPoint.z += crntPoint.z;
        }
    }
   
    // Divide through number of points, volume of object and multiply with volume of cuboid
    sumPoint.x *= Vq / (V*NUMPOINTS);
    sumPoint.y *= Vq / (V*NUMPOINTS);
    sumPoint.z *= Vq / (V*NUMPOINTS);
   
    cout << "The coordinates of the balance point are " <<
            "(" << sumPoint.x << ", " << sumPoint.y << ", " << sumPoint.z << ")" << endl;
   
}

/**
* Generate random coords in interval x [-2, 2], y [-2, 2], z [0, 2]
*/
coord3d generateRandomPoint()
{
    coord3d ret;
   
    ret.x = rand()/(double)RAND_MAX * 4 - 2;
    ret.y = rand()/(double)RAND_MAX * 4 - 2;
    ret.z = rand()/(double)RAND_MAX * 2;
   
    return ret;
}

/**
* Check if given point is in object
*/
bool isInArea(coord3d point)
{
    if(point.x < -1)
        return false;
   
    if(point.x + point.z > 2)
        return false;
       
    if(point.x*point.x + point.y*point.y + point.z*point.z > 4)
        return false;
   
    return true;
}
"Das Volk hat das Vertrauen der Regierung verscherzt. Wäre es da nicht doch einfacher, die Regierung löste das Volk auf und wählte ein anderes?"
- Bertolt Brecht
CommanderTomalak
 
Beiträge: 204
Registriert: 19.01.2009 00:42
Wohnort: Karlsruhe

Re: Monte-Carlo Integration

Beitragvon M.A. » 11.06.2010 16:42

Kann ich bestätigen.
Code: Alles auswählen
Berechnetes Volumen: 12.2036
Berechneter Schwerpunkt: ( 0.107636 , 0.00209941 , 0.717861 ) +/- 0.00225397
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Monte-Carlo Integration

Beitragvon alles is relativ » 13.06.2010 21:05

He irgendiwe versteh ich grad net wie du auf die Grenzen von x kommst? auf dem Blatt steht doch x größer/gleich -1!! ist deine grenze dann nicht zu klein? vlt häng ich auch grad nur aber ich kapiers irgendwie einfach net.... computer hassen mich ehhh :cry:
alles is relativ
 
Beiträge: 316
Registriert: 31.10.2008 22:37

Re: Monte-Carlo Integration

Beitragvon CommanderTomalak » 13.06.2010 21:09

Richtig, da steht

Code: Alles auswählen
if(point.x < -1)
        return false;


wenn x < 1 ist, wird zurückgegeben, dass der Punkt nicht in unserem Objekt drin ist. Wenn er, wie gefordert größer oder gleich eins ist, geht die Überprüfung weiter und erst, wenn es nichts zu beanstanden gibt, wird true zurückgegeben.
"Das Volk hat das Vertrauen der Regierung verscherzt. Wäre es da nicht doch einfacher, die Regierung löste das Volk auf und wählte ein anderes?"
- Bertolt Brecht
CommanderTomalak
 
Beiträge: 204
Registriert: 19.01.2009 00:42
Wohnort: Karlsruhe

Re: Monte-Carlo Integration

Beitragvon alles is relativ » 14.06.2010 14:20

he danke is mir heute in programmieren vorlesung irgendwie auch aufgegangen=) typischer fall von zu wenig nachgedacht=)Danke aber für die Antwort :D
alles is relativ
 
Beiträge: 316
Registriert: 31.10.2008 22:37

Re: Monte-Carlo Integration

Beitragvon Cashdogg » 14.06.2010 16:34

Warum addiere ich eine Eins zu meiner Summe, wenn der Punkt im Integrationsgebiet liegt :? ?

Edit: Ich hab's (ging ziemlich schnell, naja Gedankenblitze halt) die Dichte ist ja 1 damit wird die Funktion f Eins also unabhängig von dem jeweiligen Punkt.
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Monte-Carlo Integration

Beitragvon Cashdogg » 14.06.2010 17:40

Mhhh, kurzzeitig hat mein Porgramm mal einen vernünfigen Wert geliefert, aber das ist mittlerweile wieder passé :( . Hab mal meine Datei gepostet vielleicht findet jemand den/die Fehler.
Dateianhänge
Monte-Carlo-Integration.cpp
(2.2 KiB) 290-mal heruntergeladen
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Monte-Carlo Integration

Beitragvon Cashdogg » 14.06.2010 20:40

Komischerweise funktioniert es jetzt?! Aber bekommt ihr auch bei jedem neuen Ausführen einen anderen Wert raus (Bsp.: V=5...25)?
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Monte-Carlo Integration

Beitragvon test123 » 15.06.2010 00:23

probier mal das srand((unsigned int)time(0)) nur in die main zu packen und nich jedesmal neu aufzurufen, da dass sonst immer die gleichen Zufallswerte gibt.
test123
 
Beiträge: 10
Registriert: 28.10.2009 10:12

Re: Monte-Carlo Integration

Beitragvon the p0l0x » 15.06.2010 10:13

muss man die fehlerabschätzung machen?
the p0l0x
 
Beiträge: 59
Registriert: 05.11.2008 14:53

Nächste

Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron