Nullstellenberechnung...
-
Hiho. Ich soll ein Programm schreiben, mit dem man Nullstellen berechnen kann. Die Annäherung mit dem Iteratiosnverfahren soll genommen werden. Irgendwie funktioniert das aber nicht
#include <stdio.h> #include <math.h> int main() { double a,b,mittel,ende=0.0001; scanf ("%lf", &a); scanf ("%lf", &b); while (fabs(b-a)>ende) { mittel=(a+b)/2; if ( ( (a+1) * (b+1) ) < 0 ) { b=mittel; } else { a=mittel; } } printf("%lf", mittel); return 0; }
Die Rechnung dazu gibts da: http://www.matheraum.de/redirect/www.mathe-online.at/nml/materialien/innsbruck/bisektion/bisektion.pdf
pls help
cya
-
Also ich habe ich aus dem Code nicht gesehen, von welcher funktion Du die Nullstellen berechnen willst.
Habe mal schnell in meine "Mathe 2" Mittschrift nachgeguckt:
#include <stdio.h> #include <math.h> #define SIGN(x) (x < 0 ? -1 : 1) #define DELTA 0.0001 /* y = f(x) ist eine funktion R -> R */ double f(double x) { return (x * x) - 1.0; } /* Findet eine Nullstelle von f im intervall [x1, x2] */ double bisection(double x1, double x2) { double m; for (;;) { m = (x1 + x2) / 2.0; if (fabs(f(m)) <= DELTA) //wenn f an der stelle m "so gut wie" null ist, sind wir fertig return m; if (SIGN(f(m)) == SIGN(f(x1))) x1 = m; else x2 = m; } } int main(int argc, char **argv) { double x1 = 0.0, x2 = 5.0; if (SIGN(f(x1)) == SIGN(f(x2))) { fprintf(stderr, "f muss verschiedene Vorzeichen an den Stellen x1 und x2 haben.\n"); return 1; } printf("Nulstelle von f im intervall [%lf, %lf]: %lf\n", x1, x2, bisection(x1, x2)); return 0; }
-
O_o
schon viel zu kompliziert für meinen Verhältnisse
Kann man das nicht einfach so simpel machen? Ich habe meinen Quelltext nochmal bearbeitet, aber den Fehler kann ich irgendwie trotzdem nicht finden#include <stdio.h> #include <math.h> int main() { float a,b,mitte,ende=0.000000001; scanf ("%f", &a); scanf ("%f", &b); while ((fabs(b-a))>ende) { mitte=(a+b)/2; if ( ( (a-1) * (b-1) ) < 0.0 ) { b=mitte; } else { a=mitte; } } printf("%f", mitte); return 0; }
die gleichung ist y=x-1 die ns dazu ist 1
kommt aber irgendwie immer null raus
-
if(f(a)*f(mitte) < 0) => die NST liegt im Intervall [a, mitte] else => die NST liegt im Intervall [mitte, b]
(Natürlich nur, wenn eine NST im Intervall [a, b] liegt, die Funktion stetig ist usw.)
a-1 = f(a), b-1 = f(b)
-
hmm. wie minstn das?
weil ich muss ja das irgendwie wechseln. aber ich weiss nich wo das hin soll
-
Ich meine
... if ( ( (a-1) * (b-1) ) < 0.0 ) { b=mitte; } else { a=mitte; } ...
müßte eher so aussehen
... if ( ( (a-1) * (mitte-1) ) < 0.0 ) { b=mitte; } else { a=mitte; } ...
Außerdem solltest du die Bisektion in eine Funktion auslagern, der man einen Funktionspointer und die Intervallgrenzen übergibt o.ä. und eine max. Iterationszahl festlegen, falls mal irgendwas schief läüft und der Algorithmus nicht konvergiert.
Edit:
Eine Überprüfung, ob a < b ist und f(a)*f(b) für die Anfangswerte auch wirklich < 0 ist, wäre auch nicht verkehrt...
-
hmm. jo das leutet ein. schließlich wird mit mitte weiter gerechnet.
habe jetzt diesen code:#include <stdio.h> #include <math.h> int main() { double a,b,mitte,ende=0.0001; scanf ("%f", &a); scanf ("%f", &b); while ((fabs(b-a))>ende) { mitte=(a+b)/2; if ( ( (a-1) * (mitte-1) ) < 0.0 ) { a=mitte; } else { b=mitte; } } printf("%f", mitte); return 0; }
kommt irgendwie immer noch 0 raus
-
Vergleiche noch mal deinen Code mit dem darüber...
-
geiiil. ich glaub es funzt!! THX!!!!
ps: ich hab a und b vertauscht^^