Monte-Carlo Integration

Re: Monte-Carlo Integration

Beitragvon M.A. » 15.06.2010 12:51

the p0l0x hat geschrieben:muss man die fehlerabschätzung machen?

Schaden kann's nicht.
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Monte-Carlo Integration

Beitragvon Cashdogg » 15.06.2010 13:03

@test123

Danke, daran hat es gelegen.
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Monte-Carlo Integration

Beitragvon reynhold » 15.06.2010 18:34

Hmm, ich bin inzwischen komplett ratlos.
Mein Programm gibt mir zwar das richtige Volumen aus, allerdings stimmen meine Schwerpunktkoordinaten nicht mit den hier geposteten überein...

Code: Alles auswählen
using namespace std;

const int N_max = 1000000;
double vol_quader = 32;
int n = 0;
int summe = 0;

struct koord {
       double x;
       double y;
       double z;
       }r[N_max];
       
void zufallsgenerator (){

     for (int n=0; n<=N_max-1; n++){
         
         r[n].x = double(rand())/RAND_MAX*4 - 2 ;
         r[n].y = double(rand())/RAND_MAX*4 - 2 ;
         r[n].z = double(rand())/RAND_MAX*2 ;
         }
         }

void test (){
     
     for (int j=1; j<=N_max; j++) {
         int test =0;
         
         if (r[j].x < -1 || r[j].x + r[j].z > 2 || r[j].x*r[j].x + r[j].y*r[j].y + r[j].z*r[j].z > 4){
         test = 1;
         }
             
         if (test == 0){
                 
         summe += 1;
         r[summe].x = r[n].x;
         r[summe].y = r[n].y;
         r[summe].z = r[n].z;
         }
         
         }
         }
         
void berechnung (){
     
     double V = double (vol_quader*summe)/N_max;
     
     cout << "Das Volumen betraegt:" << endl;
     cout << V << endl;
     cout << endl;
     
     double x_s = 0;
     double y_s = 0;
     double z_s = 0;
     
     for (int j=1; j<=summe; j++) {
         
         x_s += r[summe].x;
         y_s += r[summe].y;
         z_s += r[summe].z;
         
         }
         
         x_s = x_s/summe;
         y_s = y_s/summe;
         z_s = z_s/summe;
         
     cout << "Die Koordinaten des Schwerpunktes lauten:" << endl;
     cout << endl;
     cout << "([" << x_s << "] ; [" << y_s << "] ; [" << z_s << "])" << endl;
     cout << endl;
     
}

int main (){
   
    zufallsgenerator();
    test();
    berechnung();
   
}


Wäre für einen Tipp sehr dankbar, weil ich hocke einfach zu lange schon dran, und finde den Fehler einfach nicht... :?
Benutzeravatar
reynhold
 
Beiträge: 184
Registriert: 26.10.2008 12:09

Re: Monte-Carlo Integration

Beitragvon CommanderTomalak » 16.06.2010 12:47

Machst du das aber kompliziert :shock:
ich schätze der Fehler liegt darin, wie du den Schwerpunkt aus deiner Summe ausrechnest:

Code: Alles auswählen
x_s = x_s/summe;
y_s = y_s/summe;
z_s = z_s/summe;

müsste eigentlich aussehen wie

Code: Alles auswählen
x_s = vol_quader*x_s/(V*N_max);
y_s = vol_quader*x_s/(V*N_max);
z_s =  vol_quader*x_s/(V*N_max);


abgesehen davon hast du zur Berechnung der Summe einen ziemlichen Umweg genommen. Wieso hast du ein 1 Million Felder großes Array angelegt? :shock: werte die Punkte lieber on the fly aus, ohne sie zwischen zu speichern, siehe meine Lösung. Is wesentlich einfacher und performanter ;)
"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 reynhold » 17.06.2010 10:49

Na ja, die Berechnung meines Schwerpunktes ist identisch zu deiner Form... ;)

Hab den Fehler im Endeffekt gefunden, einfach nur die Initialisierungszeile für die Zufallspunkte ins Main setzen, dann geht das einwandfrei. :D
Aber du hast natürlich recht, es ist schon ein wenig umständlich programmiert.
Benutzeravatar
reynhold
 
Beiträge: 184
Registriert: 26.10.2008 12:09

Vorherige

Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron