problem mit function



  • //temporaere Impulse 
            temp_p[i][0] = pold[i][0] + delta/2 * F1_p[i][0]; 
            temp_p[i][1] = pold[i][1] + delta/2 * F1_p[i][1]; 
            temp_p[i][2] = pold[i][2] + delta/2 * F1_p[i][2]; 
    
            temp_omz = omzold + delta/2 * F1_omz; 
    //p(t+delta/2) 
    
    /*x-Kompon.*/    F2_p[i][0] = temp_F[i][0] - gam * temp_p[i][1] 
                     - zet(temp_F,temp_p) * temp_p[i][0] 
                     - nustir/temp * Fdotp(temp_F,temp_p) * temp_omz * temp_p[i][1];
    

    ich denke ich weiß jetzt, wo der hund begraben liegt: du du benutzt uninitialisierte arrayfelder.

    du denkst warscheinlich, du kannst zet(temp_F,temp_p) berechnen, weil die arrays oben bereits initialisiert worden sind. das ist falsch! du initialisierst tatsächlich nur ein feld von temp_p! die felder temp_p[2][] werden erst in den nächsten schleifendurchläufen berechnet. und temp_p[0][] berechnest du überhaupt nicht!

    tut mir leid, aber der ganze code ist murks 😃 kannst du weitgehend neu schreiben.



  • 😡 oh ja indem ich folgendes tue

    for (i=start; i<particles;i++)
    		{
    
    //r(t+delta/2)
    		F2_r[i][0] = (pold[i][0]+ delta/2 * F1_p[i][0]) + gam * (rold[i][1]+ delta/2 * F1_r[i][1]) ;
    		F2_r[i][1] = pold[i][1] + delta/2 * F1_p[i][1];
    		F2_r[i][2] = pold[i][2] + delta/2 * F1_p[i][2];
    
    		//temporaere Teilchenkraft 
    		temp_F[i][0] = F[i][0]+ delta/2 * tempKraft[i][0];
    		temp_F[i][1] = F[i][1]+ delta/2 * tempKraft[i][1];
    		temp_F[i][2] = F[i][2]+ delta/2 * tempKraft[i][2];
    		//temporaere Impulse
    		temp_p[i][0] = pold[i][0] + delta/2 * F1_p[i][0]; 
    		temp_p[i][1] = pold[i][1] + delta/2 * F1_p[i][1];
    		temp_p[i][2] = pold[i][2] + delta/2 * F1_p[i][2];
    
    		temp_omz = omzold + delta/2 * F1_omz;
    //p(t+delta/2)
    
    		F2_p[i][0] = temp_F[i][0] - gam * temp_p[i][1] 
    			     - zet(temp_F,temp_p) * temp_p[i][0] 
    			     - nustir/temp * Fdotp(temp_F,temp_p) * temp_omz * temp_p[i][1];
    		F2_p[i][1] = temp_F[i][1]			- zet(temp_F,temp_p) * temp_p[i][1] 
    							+ nustir/temp * Fdotp(temp_F,temp_p) * temp_omz * temp_p[i][0];
    		F2_p[i][2] = temp_F[i][2]			- zet(temp_F,temp_p) * temp_p[i][2] ;
    
    //omz(t+delta/2)
    		F2_omz = omz_dt(temp_F,temp_p);
    
    		}
    

    ... mache ich tatsächlich einen riesen Fehler ... die Größen zet, Fdotp und omz_dt hängen natürlich von allen temp_F und temp_p ab. Ich benötige zuerst das gesamte Array von temp_F und temp_p um F2_p berechnen zu können. Alles mit 0 zu initialiesieren hat deshalb geholfen, weil die 0 eine gutartige Zahl ist, die die Beiträge, die ich falsch berechne einfach löscht. Ohne Initialisierung mit 0 stand in diesen Arrays zu Beginn nur Datenmüll, was das sofortige Auftreten von nan erklärt.

    Das ist alles ein Copy and paste Fehler denn bei der Berechnung von F1_p müsste es wie oben gut gehen, da ich dort nur rold, pold und F benötige, die als vollständig gefüllte Arrays vorliegen.

    Aber dass der gesamte Code murks ist würd ich jetzt nicht behaupten. Meine Änderung sollte die folgende sein:

    //Kraft am Ort F1_r ausrechnen	
    	Gesamtkraft(F1_r,tempKraft); //tempKraft liegt als vollständiger Satz vor :)
    
    	//Schleife über alle Teilchen	
    	for (i=start; i<particles;i++)
    		{
    
    //alle F1_p, und F1_r, sowie pold liegen vollständig vor
    
    		F2_r[i][0] = (pold[i][0]+ delta/2 * F1_p[i][0]) + gam * (rold[i][1]+ delta/2 * F1_r[i][1]) ;
    		F2_r[i][1] = pold[i][1] + delta/2 * F1_p[i][1];
    		F2_r[i][2] = pold[i][2] + delta/2 * F1_p[i][2];
    
    //auch alle tempKraft habe ich		
    		//temporaere Teilchenkraft 
    		temp_F[i][0] = F[i][0]+ delta/2 * tempKraft[i][0];
    		temp_F[i][1] = F[i][1]+ delta/2 * tempKraft[i][1];
    		temp_F[i][2] = F[i][2]+ delta/2 * tempKraft[i][2];
    		//temporaere Impulse
    		temp_p[i][0] = pold[i][0] + delta/2 * F1_p[i][0]; 
    		temp_p[i][1] = pold[i][1] + delta/2 * F1_p[i][1];
    		temp_p[i][2] = pold[i][2] + delta/2 * F1_p[i][2];
    //F1_omz gibt es aus dem vorherigen Schritt, ist auch kein Array		
    		temp_omz = omzold + delta/2 * F1_omz;
    
    		} //hier endet die Schleife über alle Teilchen
    
    //hier beginnt wieder Schleife über alle Teilchen	
    // ich besitze temp_F und temp_p vollständig, da schleife oben wieder geschlossen
    //ich arbeite also mit den physikalisch richtigen Werten
    	for (i=start; i<particles;i++)
    		{
    
    		F2_p[i][0] = temp_F[i][0] - gam * temp_p[i][1] 
    			     - zet(temp_F,temp_p) * temp_p[i][0] 
    			     - nustir/temp * Fdotp(temp_F,temp_p) * temp_omz * temp_p[i][1];
    		F2_p[i][1] = temp_F[i][1]			- zet(temp_F,temp_p) * temp_p[i][1] 
    							+ nustir/temp * Fdotp(temp_F,temp_p) * temp_omz * temp_p[i][0];
    		F2_p[i][2] = temp_F[i][2]			- zet(temp_F,temp_p) * temp_p[i][2] ;
    
    //omz(t+delta/2)
    		F2_omz = omz_dt(temp_F,temp_p);
    
    		}
    

    Danke für den Tip ... ich wär da so schnell nicht drauf gekommen ... mal schauen ob's dann geht ...

    jesus (schämt sich ein wenig ... )

    edit: temp_p[0] und so brauche ich eigentlich nicht, ich setze auf das Teilchen 0 meinen Koordinatenursprung. In meinem mitbewegte Koordinatensystem dürfen keine Kräfte auf Teilchen 0 wirken (sonst wär das Koordinatensystem nicht fest auf 0 ) deshalb durchlaufe ich alle Schleifen mit dem Startwert 1 (#define start 1). Ich hab das so gewählt, weil ich später auch mal die Dynamik des Systems gegenüber einem festen Beobachtungsort sehen wollte, dann muss ich nur start auf 0 setzen und schon wird alles für Teilchen 0 mitberechnet. solnage ich das nciht tue bleiben alle Parameter für Teilchen 0 wie sie anfangs initialisiert wurden


Anmelden zum Antworten