Nullstellen

Nullstellen

Beitragvon reynhold » 30.05.2010 12:54

Moin moin, ich hätte da mal eine kleine Frage:

wenn ich möchte, dass mir mein Programm beim Sekantenverfahren nicht diese 2000 irgendwas Schritte ausspuckt, sondern z.B nur den ersten und den letzten anzeigt, damit übersichtlicher das Ergebnis betrachten kann, wie baue ich das ein?
Ich habe schon probiert einzubauen dass die Ausgabe der Sekanten-Fkt ab n>50 (also mehr als 50 Schritte) nur den ersten und den letzten Schritt anzeigt, interessanterweise kommen jetzt nur noch 50 Schritte. :lol:

Weiss jemand wie man so etwas prinzipiell machen kann?
Benutzeravatar
reynhold
 
Beiträge: 184
Registriert: 26.10.2008 12:09

Re: Nullstellen

Beitragvon mabl » 30.05.2010 16:56

Naja, also um z.b. jeden 10. Schritt auszugeben kann man schön die Modulofunktion nutzen:
Code: Alles auswählen
if(n%10 == 0)
    do_foo();
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Nullstellen

Beitragvon reynhold » 30.05.2010 16:58

Ah ok, dann werd ich das mal ausprobieren, danke.
Benutzeravatar
reynhold
 
Beiträge: 184
Registriert: 26.10.2008 12:09

Re: Nullstellen

Beitragvon Cashdogg » 31.05.2010 17:53

So bei mit funktioniert es auch mal wieder nicht so wie es soll. Irgendwie gibt mir mein Compiler für das xtest in den while-Schleifen immer ne Warnung. Vielleicht kann mir jemand mal wieder ein bisschen auf die Sprünge helfen.

Gruß Cashdogg
Dateianhänge
Nullstellenbestimmung.cpp
(1.96 KiB) 240-mal heruntergeladen
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Nullstellen

Beitragvon M.A. » 31.05.2010 18:15

Cashdogg hat geschrieben:So bei mit funktioniert es auch mal wieder nicht so wie es soll. Irgendwie gibt mir mein Compiler für das xtest in den while-Schleifen immer ne Warnung. Vielleicht kann mir jemand mal wieder ein bisschen auf die Sprünge helfen.

Gruß Cashdogg


Hab deins runtergeladen und durch den Compiler gejagt. Hat er kommentarlos geschluckt. Keine Fehlermeldung, keine Warnung.
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Nullstellen

Beitragvon Cashdogg » 31.05.2010 18:35

Kommt auch das selbe (richtige) raus?
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Nullstellen

Beitragvon mabl » 01.06.2010 08:03

M.A. hat geschrieben:
Cashdogg hat geschrieben:So bei mit funktioniert es auch mal wieder nicht so wie es soll. Irgendwie gibt mir mein Compiler für das xtest in den while-Schleifen immer ne Warnung. Vielleicht kann mir jemand mal wieder ein bisschen auf die Sprünge helfen.

Gruß Cashdogg


Hab deins runtergeladen und durch den Compiler gejagt. Hat er kommentarlos geschluckt. Keine Fehlermeldung, keine Warnung.

Das liegt daran, das Cashdogg das vermutlich in einer IDE macht die das Teil mit
Code: Alles auswählen
g++ -Wall Nullstellenbestimmung.cpp

compiliert. Wall bedeutet dabei, dass alle Warnungen des Compilers aktiviert sind, was generell eine gute Idee ist....
Die Fehler sind dann

Code: Alles auswählen
mabl@miraculix:~$ g++ -Wall Nullstellenbestimmung.cpp
Nullstellenbestimmung.cpp: In function ‘double Sekante(double, double)’:
Nullstellenbestimmung.cpp:60: warning: ‘xtest’ may be used uninitialized in this function
Nullstellenbestimmung.cpp: In function ‘double Bisektion(double, double)’:
Nullstellenbestimmung.cpp:29: warning: ‘xtest’ may be used uninitialized in this function


Der Fehler ist dabei wörtlich zu nehmen, denn es gibt die Möglichkeit, dass xtest bei dir nicht initialisiert wird, wenn nämlich die Schleife nicht durchläuft, weil die while Bedingung von Anfang an nicht zutrifft. Noch dazu hast du xtest zwei mal in der Schleife definiert. Als Beispiel mal eine Funktion verbessert:
Code: Alles auswählen
double Bisektion(double x0, double x1)
{
   if(f(x0)*f(x1)>0)
   {
      cout << "Die Nullstelle kann im angegebenen Intervall nicht bestimmt werden." << endl;
      return 0;
   }

   int n=0;
   double xtest=(x0-x1)/2;
   
   do
   {
      xtest=(x0-x1)/2;
      n++;

      cout << "Fuer den Schritt " << n << " ergibt sich das Intervall [" << x0 << "," << x1 << "]." << endl;
      cout << "Dabei erhalten wir fuer den Funktionswert f(x_test)=" << f(xtest) << "." << endl;
      cout << endl;

      if(xtest<x0)
         x0=xtest;
      if(xtest>=x0)
         x1=xtest;
   }
   while (abs(x1-x0)<0.0004 || abs(f(xtest))<0.001);
   return xtest;
}
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe


Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron