Fehler beim Bisektionsprogramm
-
Hallo,
ich habe hier ein Programm, welches die Nullstellen bestimmter Funktionen per Bisektion bestimmen soll.
Leider funktioniert mein Programm nur bei einigen Funktionen, bei den meisten läuft es nicht richtig oder hängt sich auf.#include<stdio.h> #include<math.h> double func(double x, int fn) { double func; if(fn==1) { func = sin(x); } if(fn==2) { func = -7*x+1; } if(fn==3) { func = (x*x) - 2; } if(fn==4) { func = 0.1428571429 + 1/x; } if(fn==5) { func = 2*x-2; } if(fn==6) { func = 4*x + 8; } if(fn==7) { func = (x*x*x)-(x*x)-x+0.04; } return func; } double nullstelle(double a, double b, double genau, int fn) { double mitte, erg; if((func(a,fn)<0) && (func(b,fn)>0)) { while(b-a>genau) { mitte=(a+b)/2; if((func(mitte,fn)<0) && (func(b,fn)>0)) { a=mitte; } else if((func(a,fn)<0) && (func(mitte,fn)>0)) { b=mitte; } } erg=(a+b)/2; return erg; } else printf("\nKeine Nullstelle im Intervall"); } main() { double a,b,genau; int fn; printf("\na : "); scanf("%lf",&a); printf("\nb : "); scanf("%lf",&b); printf("\ngenau : "); scanf("%lf",&genau); for(fn=1;fn<8;fn++) { printf("\n\n%i : %lf",fn,nullstelle(a,b,genau,fn)); } system("pause"); }
Wenn jemand die Zeit hat, sich mal anzugucken, warum die Funktion falsch ist, wäre ich sehr dankbar.
-
Hallo,
ich habe nur die Funktionen betrachtet, die du prüfen willst, und schon bei der Auswahl gibt es ein Problem: Ist dir bewusst, dass dieses Verfahren nur funktioniert, wenn die Funktionen zwischen a und b streng monoton steigend sind?
Schon beim Sinus ist das nicht für alle Intervalle der Fall, und wenn du gerade so ein Intervall prüfst, kann es z.B. zur Endlosschleife kommen (hängt sich auf).
MfG,
Probe-Nutzer
-
Würdest du bitte deinen code in "[cpp]" tags packen, nicht in "[code]" tags?
Ein bischen mit einrückung verändern währ auch geil...Danke
-
Ok werd ich machen.
An den Probe-Nutzer. Ja das ist mir auch aufgefallen. Aber finde ich keine Lösung, wie ich mit einer Vorzeichenänderung umgehen kann, sowie mit jeglicher Art von Funktionen, die nicht streng monoton steigen. Gibt es irgendwo Quellen darüber?Oder kann mit jemand da nen Denkansatz geben, was den Algorythmus betrifft?