Fehlerhafte Nst Berechnung einer bestimmten Fkt. (Bisektion)

Alfredo789

Mitglied
Es geht um die nicht auskommentierte Funktion in der Methode "fkt1", alle anderen funktionieren.
Kann mir jemand sagen woran genau es liegt das diese Funktion nicht genau berechnet werden kann ?
Link zur Erklärung des Bisektionsverfahren (4 min):

Java:
public static void main(String[] args) {

    double Nst = bisektion(-1000, 1000, 0.01); 
// Funtkioniert mit Epsilon 1Mio (eig. Wert für Epsilon näherungsweise 0 z.B. 0.01)

        System.out.println("Ermittelte Nullstelle: " + Nst);
        System.out.println("Funktionswert an dieser Stelle: " + fkt1(Nst));
       
    }

    public static double fkt1(double x) {

    double fx;
    //fx = x * x * x - 24 * x * x + 59 * x + 420;
    //fx = -x + 5;
    fx = -1/Math.exp(x) + 1e20; // Programm läuft endlos 
                                              Fkt. übersetzt: -1/2.178^x + 10^20
                          //  bei rekursiver Umsetzung läuft´s mit anschließender Fehlermeldung
    return fx;
    }

    public static double bisektion(double lower, double upper, double epsilon) {

    double mid = 0;
    int Zähler = 0;

    while (!((fkt1(mid) < epsilon) && (fkt1(mid) > 0))) { 
    // solange nicht zwischen epsilon u. null liegt

        Zähler++; // Schleifenzähler

        mid = (lower + upper) / 2;

        if (fkt1(lower) * fkt1(mid) <= 0) { // wenn das Ergb. negativ dann Verschiebung von                                                                    rechts nach links u. andersrum
        upper = mid;            
        } else {            
        lower = mid;            
        }
      //Veranschaulichung
        System.out.println( "Middle: " + fkt1(mid) + " yLower: " + fkt1(lower) + " yUpper: " +                                        fkt1(upper));
    }
    System.out.println("Anzahl d. Schleifendurchgänge: " + Zähler);
    return mid;
    }
 

knilch

Bekanntes Mitglied
Hi,
Eine Bedinung, dass mit dem Bisektions-Verfahren die Nullstellen ermittelt werden kann, ist:
f(a) * f(b) < 0. wobei a die untere Intervalls-Grenze und b die obere Intervalls-Grenze ist.
Wenn du nun die Funktion: f(x) = -1/e^x + 10^20 nimmst und diese für a=-1000 und b=1000 berechnest, dann bekommst du: f(a)=10^20 und f(b)=10^20 --> f(a)*f(b) > 0. Somit kannst du die Nullstellen für diese Funktion nicht ermitteln.
Egal, wie gross du die Intervalls-Grenzen a und b wählst, du kommst immer auf das gleiche Resultat.
Der Grund ist die Funktion hat den Term 10^20. Dieser ist sehr, sehr hoch und damit spielt der Term: -1/e^x keine Rolle mehr.
Nur so am Rande. Nimm mal statt 10^20 --> 10, 100, 1000, ... (aber nicht so hohe Werte wie 10^20). Dann werden mit dem Algorithmus Nullstellen gefunden..
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Kleine Ergänzung zu Knilch's Beitrag:
Das Problem ist eben, dass Gleitkommazahlen nur eine begrenzte Genauigkeit haben. Bei double Werten hat man etwa eine Genauigkeit von 14 Stellen.
Dies führt nun zum von Knilch genannten Problem:
Der Grund ist die Funktion hat den Term 10^20. Dieser ist sehr, sehr hoch und damit spielt der Term: -1/e^x keine Rolle mehr.
Heißt also: -1/Math.exp(x)+ 1e20 bleibt weiterhin 1e20
 

Alfredo789

Mitglied
yMiddle: 622592.0 yLower: -81920.0 yUpper: 622592.0

lower: -46.051701859880914 upper: -46.05170185988091
mid: -46.05170185988091
Das sind die Werte die immer gleich bleiben.
1. Frage
Wie kommen diese Werte zustande ?
2. Frage
Weshalb wird wenn Epsilon = 1 Mio eine Nst berechnet ?

Hoffe ich gehe euch nicht auf die nerven :confused: und danke für eure Hilfe :D:D
 
Zuletzt bearbeitet:

knilch

Bekanntes Mitglied
Hi,
Ich muss meine Aussage korrigieren.
Ich hab leider einen Fehler in meinen Berechnungen gemacht...
die Berechnung f(a) * f(b) <0 für f(x) = -1/e^x + 10^20 mit a=-1000 und b=1000 gibt einen Wert < 0. Somit kann diese NS ermittelt werden.
Mein Fehler war, dass ich den Funktionswert für untere Intervall falsch berechnet hab.
Hier meine Korrektur:
f(a) = -1/e^-1000 + 10^20 = -e^1000 + 10^20 --> -1.97e434
f(b) = -1/e^1000 + 10^20 = -1/e^1000 + 10^20 --> 10^20
Somit ist f(a)*f(b)= -1.97e434 * 10^20 = -1.98e454 was natürlich < 0 ist.
Ich hab deine Bisektions-Methode mal angepasst:
Damit kannst du nun die die NS |-1000, 1000| mit epsilon = 0.01 ermitteln:
Code:
public static double bisektion(double a, double b, double epsilon) {
   double mid = 0;
   int counter = 0;
   if(fkt1(a)*fkt1(b) < 0 ){
     do {
       counter++;
       mid = (a + b) / 2;
       if((fkt1(mid) * fkt1(a)) <= 0)
         b = mid;
       else
         a = mid;
       System.out.println( "Middle: " + mid + " yLower: " + a + " yUpper: " + b);
     } while(Math.abs(a-b) > epsilon);
   }
   System.out.println("Anzahl Iterationen: " + counter);
   return mid;
}

SORRY für meine Verwirrung !!!
 

knilch

Bekanntes Mitglied
Hi,
Zu deinen Fragen:
lower: -46.051701859880914 upper: -46.05170185988091
mid: -46.05170185988091
Das sind die Werte die immer gleich bleiben.
1. Frage
Wie kommen diese Werte zustande ?

Das Ganze hängt wie InfectedBytes beschrieben, mit der Genauigkeit, mit der Dezimalzahlen dargestellt werden können.
Du kannst mal folgendes Testen:
Java:
public static void main(String[] args) {
  double d0 = -46.05170185988091;
  double d1 = -46.051701859880911;
  double d2 = -46.05170185988092;

  System.out.println("d0: " + fkt1(d0));
  System.out.println("d1: " + fkt1(d1));
  System.out.println("d2: " + fkt1(d2));
}
public static double fkt1(double x) {
  System.out.println("x: " + x);
}
Das Resultat sieht dann so aus:
x: -46.05170185988091
d0: 622592.0
x: -46.051701859880914
d1: -81920.0
x: -46.05170185988092
d2: -786432.0

Wie du nun beim 2. x bei der Ausgabe siehst, steht dort: x: -46.051701859880914 obwohl in main d1 = -46.051701859880911 deklariert wurde.
hier macht sicht nun das Problem dass die Genauigkeit nicht stimmt, bemerkbar...
Für 13 bis 14. Digigts hinter dem Koma werden die Werte ohne Probleme übernommen. Sobald aber 15 Stellen hinter dem Komma vorkommen stimmen die Werte nicht mehr.
Das Resultat siehst du dann, wenn fkt1(d1) und fkt1(d2) berechnet werden. Obwohl d0, d1 und d2 für uns praktisch gleich sind, ist das für den Computer nicht der Fall.

Du hast in der Methode: bisektion den Vergleich:
...
Java:
...
if (fkt1(lower) * fkt1(mid) <= 0)
  upper = mid;  
else  
  lower = mid;
...
weil fkt1(lower) immer negativ wird (da hier das Problem mit der Genauigkeit auftritt) wird immer upper = mid gesetzt. Somit hast du einen endlosen loop.
(da die Abbruchbedingung in while (!((fkt1(mid) < epsilon) && (fkt1(mid) > 0))) {...}) mit epsilon=0.001 nie zutrifft.

2. Frage
Weshalb wird wenn Epsilon = 1 Mio eine Nst berechnet ?
Wenn du deine Methode mal so änderst:
Java:
public static double bisektion(double lower, double upper, double epsilon) {
  double mid = 0;
  int Zähler = 0;

  while (!((fkt1(mid) < epsilon) && (fkt1(mid) > 0))) {
  Zähler++;
  mid = (lower + upper) / 2;

  if (fkt1(lower) * fkt1(mid) <= 0) // wenn das Ergb. negativ dann Verschiebung von  rechts nach links u. andersrum
  upper = mid;   
  else   
  lower = mid;   

  System.out.println((fkt1(mid) < epsilon) + " " + (fkt1(mid) > 0));
  System.out.println(!((fkt1(mid) < epsilon) && (fkt1(mid) > 0)));
  System.out.println( "Middle: " + mid + " yLower: " + lower + " yUpper: " + upper);
  System.out.println( "Middle: " + fkt1(mid) + " yLower: " + fkt1(lower) + " yUpper: " + fkt1(upper));
  }
  System.out.println("Anzahl d. Schleifendurchgänge: " + Zähler);
  return mid;
}
Dann kannst du das Verhalten in der Konsole ansehen.
epsilon = 1Mio ergibt meiner Menung nach keinen Sinn.
Epsilon soll die Genauigkeit bei Dezimalstellen angeben, und nicht für integers.
Ich denke, dass du deinen Algorithmus anpassen musst, damit du die Funktionen mit 1 > epsilon > 0 NS findest.
 

knilch

Bekanntes Mitglied
Nur so am Rande:
Was ist eine NS: Dies ist eine Stelle, bei der der f(x)=0 ist. Also ist x= -46.05168104171753 keine NS, da der Funktionswert >> 0 ist:
Middle: -46.05168104171753 yLower: -46.051740646362305 yUpper: -46.05168104171753
Anzahl Iterationen: 25
Ermittelte Nullstelle: -46.05168104171753
Funktionswert an dieser Stelle: 2.08179466878976E15
Das Problem wird auch hier wieder sein, dass x zuweinig genau berechnet werden kann. x=-46.05168104171753 ist schon mal gut, aber noch zuwenig genau..
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Blender3D AWT Fehlerhafte Zeit bei Calender und Date DateFormat Allgemeine Java-Themen 8
Z Fehlerhafte Schriftdarstellung in Java Allgemeine Java-Themen 4
S FOP liefert fehlerhafte PDF Allgemeine Java-Themen 13
D Fehlerhafte Thread Verwendung beim arbeiten mit Sockets Allgemeine Java-Themen 6
byte Fehlerhafte Bilder reparieren? Allgemeine Java-Themen 11
J JREx + Win2k + SP4 -> fehlerhafte GUI ? Allgemeine Java-Themen 7
pkm Berechnung der Fakultät von Fließkommazahlen anhand von Stirlingformel Allgemeine Java-Themen 4
I Berechnung Lagerbestands / Verfügbarkeitsprüfung Allgemeine Java-Themen 1
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
D Berechnung des Cosinus Allgemeine Java-Themen 4
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
P Performate Zeiteiteiteilungs- Berechnung Allgemeine Java-Themen 4
B TileMap berechnung? Allgemeine Java-Themen 8
P jodaTime Berechnung Geburtstag Allgemeine Java-Themen 1
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
B BlueJ Potenz Berechnung Allgemeine Java-Themen 16
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
M Berechnung verbessern Allgemeine Java-Themen 8
W OOP Berechnung des Skalarprodukts Allgemeine Java-Themen 9
H Demonstrationsprogramm zur CRC-Berechnung Allgemeine Java-Themen 2
D Berechnung von Sonnenauf und Sonnenuntergang Allgemeine Java-Themen 2
E Berechnung in Arraylist Allgemeine Java-Themen 10
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
N Optimierung einer Berechnung Allgemeine Java-Themen 17
G java.sql Time Berechnung Allgemeine Java-Themen 6
Eldorado Berechnung von Koordinaten, die zufällig aussehen Allgemeine Java-Themen 5
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
J Berechnung anhand einer XML-Datei Allgemeine Java-Themen 3
Private Void rekursive vs. iterative Lösung für Berechnung der Fakultät Allgemeine Java-Themen 12
S YUV to RGB (einfache Berechnung) Allgemeine Java-Themen 5
G Programm zur Berechnung von Summe, Median, Erwartungswert, usw von einem Array Allgemeine Java-Themen 7
C Bilder rotieren, Denkfehler in der Berechnung? Allgemeine Java-Themen 2
B Berechnung von Punkten/ If-else Strategie?! Allgemeine Java-Themen 51
T Berechnung in zweidimensionalem Array Allgemeine Java-Themen 3
X hashCode() Berechnung Allgemeine Java-Themen 5
R Tabelle - Berechnung der "Zeilenart" Allgemeine Java-Themen 2
L Berechnung mit Module bis bes.timme Zahl erreicht. Allgemeine Java-Themen 4
P CRC Berechnung Allgemeine Java-Themen 2
J berechnung von potenzen und wurzel-ziehen ohne klasse " Allgemeine Java-Themen 14
D Problem bei einer Berechnung (pow?) Allgemeine Java-Themen 3
P Java-Programm zur Berechnung globaler Minimas und Maximas-ff Allgemeine Java-Themen 4
B Primzahlen Berechnung optimieren Allgemeine Java-Themen 7
A Probleme bei der Berechnung von Pi! Java Problem Allgemeine Java-Themen 2
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben