Anfallende Daten verringern :-)
-
Hallo, ich habe ein kleines Problem mit meinem Programm.
Das Programm soll die Bewegungsgleichung des Fadenpendels "lösen".
Das Physikalische ist nicht so wichtig denke ich. Auf jeden Fall wird das ganze anhand einer For-Schleife realisiert, mit der über den Zeitraum x integriert wird und zwar anhand der Zeitintervalle dt.
Nun wird von mir in der Aufgabenstellung verlangt, dass ich die unten zu sehenden Daten in eine Datei schreibe und außerdem, dass ich als Zeitschritte dt=0.00001 und Zeitintervall x=100 wähle, was zu 3*10000000 Daten führt, die ich in eine Datei schreiben müsste
(Nicht nur, dass das Berechnen lange dauert, später muss ich den Graphen auch noch mit Gnuplot zeichen lassen und das würde wahrscheinlich nochmal dreimal so lange dauern.)
Naja, nun ist es durchaus möglich, dass ich nur jede 2te oder 10te Zeile überhaupt in die Datei schreibe. Wie ich versucht habe, dass zu realisieren, ist unten zu sehen
Das Problem, das ich dabei habe, ist , dass n zwar die ersten Male korrekt erhöht wird, aber nach einer gewissen Anzahl von Schritten geht das Programm in die Bedingung, erhöht aber n nicht und somit werden gar keine Werte mehr ausgegeben.
Ich weiß nicht, ob es erwähnenswert ist, aber wenn ich n und t auf float setze, werden allgemein weniger Werte ausgegeben.
Wäre schön, wenn jemand vielleicht eine Lösung für das Problem hätte.
Außerdem konnte ich das Programm noch nicht ordentlich ausführen, darum weiß ich nicht, ob meine Lösung sonderlich Effizient ist. Vielleicht hat jemand eine bessere Lösung?Achja, falls sich jemand fragt, warum ich nicht einfach dt erhöhe..
Das Problem dahinter ist, dass in manchen Fällen der Fehler zu groß wird und er sich dann so sehr aufschaukelt, dass die Lösung nicht mehr stimmt.Ich hoffe, mir kann jemand helfen.
Danke schonmal im Voraus
[code]#include <iostream> #include <cmath> #include <fstream> using namespace std; int main(){ double phi=(1/180)*3.141592654; double omega=1; double dt=0; double E=0; double x=0; double n=0; double t=0; fstream f; f.open("pendel.dat", ios::out); cout << "Obere Grenze?" ; cin >> x; cout << "Wie gross sollen die einzelnen Zeitschritte sein? "; cin >> dt; for(double t=0;t<=x;t+=dt){ phi=phi+omega*dt; omega=omega-phi*dt; E=0.5*omega*omega+0.5*phi; cout << "t="<< t << " n=" << n << endl; if(t==n){ cout << t << "\t" << phi << "\t" << E << "\t" << omega << endl; n+=2*dt; continue; } cout << endl; } f.close(); return (0); } [/code]
-
Esthir schrieb:
Nun wird von mir in der Aufgabenstellung verlangt, dass ich die unten zu sehenden Daten in eine Datei schreibe und außerdem, dass ich als Zeitschritte dt=0.00001 und Zeitintervall x=100 wähle, was zu 3*10000000 Daten führt, die ich in eine Datei schreiben müsste
(Nicht nur, dass das Berechnen lange dauert, später muss ich den Graphen auch noch mit Gnuplot zeichen lassen und das würde wahrscheinlich nochmal dreimal so lange dauern.)Man Alda, schreib nicht bei jedem Loop was raus. Check alles fett in nen vector rein und schreibs am Schluss raus. Dann gehts voll krass ab Alda!
-
Ok, danke für Tip