www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "C/C++" - gerundete anzahl n
gerundete anzahl n < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

gerundete anzahl n: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

        
Bezug
gerundete anzahl n: Antwort
Status: (Antwort) fertig Status 
Datum: 16:53 So 13.06.2010
Autor: Event_Horizon

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.

Bezug
                
Bezug
gerundete anzahl n: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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



Bezug
                        
Bezug
gerundete anzahl n: Antwort
Status: (Antwort) fertig Status 
Datum: 01:12 Mo 14.06.2010
Autor: Event_Horizon

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)

Bezug
                                
Bezug
gerundete anzahl n: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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]
Bezug
                                        
Bezug
gerundete anzahl n: Antwort
Status: (Antwort) fertig Status 
Datum: 22:31 Mo 14.06.2010
Autor: Event_Horizon

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.


Bezug
                                                
Bezug
gerundete anzahl n: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]