gerundete anzahl n < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 16:25 So 13.06.2010 | Autor: | marike |
hallo,
ich habe eine frage:
wie kann ich aus einer tend(Zeitspanne) und einer schrittweite z.B 1/15
die geeignet gerundete anzahl n an gitterpunkten ermitteln?
danke
|
|
|
|
Hallo!
Was hast du vor?
Normalerweise teilt man die Spanne einfach durch die Schrittweite. der abgerundete Wert könnte für die Anwendung um 1 zu klein sein, daher noch 1 hinzu addieren.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:29 So 13.06.2010 | Autor: | marike |
hallo event h. ,
also ich habe eine e-funktion die eine stoffkonzentration mit ausgangsmenge n beinhaltet. Nun soll der user meines programmes
aufgefordert werden eine zeitspanne anzugeben. z.B 400 min. Ich möchte
zur berechnung das explizite verfahren nach euler anwenden z.b mit
einer schrittweite von h=1/15. Nun möchte ich das ganze mit einer for-schleife realisieren, dh. die schrittweite soll inform von ganzzahlen
übersetzt werden ... z.B for(int i=0;i<zeitspanne;i++) vektorT[i]=0+h
|
|
|
|
|
Hallo!
Hmmm, das führt aber zu einem Problem: Wenn die Schrittweite jetzt mal übertrieben 2min wäre, könnte das Programm niemals die Konzentration nach 401min berechnen, wenn der Benutzer das wünscht.
Generell läßt sich mein Vorschlag aber gebrauchen.
Aber was hälst du davon?
Benutzereingabe durch geplante Schrittweite teilen, Ergebnis nach unten abrunden und +1 rechnen. (Alternativ: aufrunden)
Damit weißt du, wieviele Schritte du berechnen mußt, um den Wert der Benutzereingabe zu erreichen (und ggf ein wenig darüber hinaus zu gehen)
Jetzt teilst du die Benutzereingabe durch die so ermittelte Anzahl der Schritte. Du bekommst eine NEUE Schrittweite, die ein wenig kleiner als die vorher geplante ist. Aber: mit dieser Schrittweite erreichst du punktgenau den vom Benutzer eingegebenen Wert, und für das Euler-Verfahren sollte das kein Problem darstellen.
Beispiel:
Schrittweite soll 0,2 sein, Benutzer will Konzentration nach 5,1s wissen. macht [mm] 25,4\bar{9} [/mm] Schritte, oder aufgerundet 26 Schritte.
Nach 25 Schritten hättest du 5,0s, nach 26 Schritten 5,2s, du kannst die Benutzervorgabe also gar nicht erreichen.
Deshalb rechnest du: 5,1/26=0,19615
Das ist etwas weniger als die ursprünglichen 0.2, aber damit erreichst du nach 26 Schritten 5,1s.
Aus Vorahnung:
In C kannst du auf normalem Wege kein Array variabler Größe erzeugen, also nicht
int vek[n];
wobei n vorher berechnet wird. (In Java geht das aber)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:21 Mo 14.06.2010 | Autor: | marike |
hallo event h. vielen dank für deine hilfe hat mir auf jedenfall weitergebracht,
nun habe ich das programm geschrieben und habe exact vorgegebene
grössen... zeit = 50 s
Dateianhänge: Anhang Nr. 1 (Typ: doc) [nicht öffentlich]
|
|
|
|
|
Hallo!
Ja, das sieht doch super aus! Ohne zu genau in den Code einzusteigen sieht das doch nach nem lauffähigen Programm aus.
Das mit dem new double ist ein guter Trick, hab ich auch noch nicht gewußt / dran gedacht.
Einen Bug habe ich allerdings:
Du definierst
double * Zeit = new double[n]
und greifst anschließend in der FOR-Schleife auf die Felder 0, 1, 2, 3, ..., n zu. Das Element Zeit[n] existiert aber nicht, und damit schreibst du außerhalb des vorgesehenen Bereichs.
So ein paar Anmerkungen:
In den for-Schleifen verwendest du gerne for(int i=0; i<n+1;i++). Besser zu lesen wäre for(int i=0; i<=n; i++)
Generell wäre es schön, wenn du mehr mit Einrückungen arbeiten würdest, das macht es auch einfacher lesbar. Z.b. so:
double EulerEx(double Ex [],int n,double LAMDA,double h,double X) //Definition von EulerEx
{
Ex[0]=X;
for(int i=1;i<(n+1);i++)
Ex[i] =Ex[i-1]+h*(-LAMDA)*Ex[i-1];
cout<<"************Werte Explizit*********"<<endl;
for(int i=0;i<n+1;i++){
cout<<Ex[i]<<endl;
}
return 0;
}
Weiter: Wozu dient
double pow(double, double);
? Die Funktion wird eigentlich in cmath definiert, ein Prototyp ist nicht notwendig, ne Implementierung sehe ich ja auch nicht.
Und:
char menu;
Das muß nicht global sein, sondern kann ruhig in der main() definiert werden.
Wozu brauchst du
double * Exactsolution=0;
Exactsolution=&ES;
?
Noch was, was ich hier immer wieder lese:
Die beiden Euler-Funktionen sind vom Typ double. Sie geben aber immer nur eine 0 zurück, also eigentlich gar keine Information.
Mach aus ihnen ein
void EulerEx(...)...
und beende die Routinen mit nem einfachen
return;
ganz so, wie du es mit der main() gemacht hast.
Denn wenn ein Programmierer sich fremden Code anschaut, interessiert ihn in erster Linie, was man rein steckt, und was raus kommt. Da die Funktionen "nichts zu melden haben", sollten sie void sein.
Andererseits sollte ein Programm stets einen Wert zurück liefern, damit andere Programme, die es aufrufen, erkennen können, ob alles OK war, oder ob es fehler gab. In Normalfall sollte ein Programm den Wert 0 zurückgeben. Daher sollte die main() als int main() deklariert werden, und mit return 0; abgeschlossen werden. Dieser Standard ist neuerdings sogar Pflicht.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:37 Mo 14.06.2010 | Autor: | marike |
okay danke fürs anschauen, einige der dinge du mir gesagt
hast sind mir bereits schon aufgefallen. Das Programm ist
noch in Bearbeitung muss so einige Dinge wie Approximation
etc. noch einbauen... aber danke für deine ratschläge und tipps
die wirklich einige bringen..
gruss
|
|
|
|