|
|
Genauigkeitsproblem mit find-function |
|
EricR |
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 19.09.17
|
|
|
|
Wohnort: München
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.09.2017, 22:07
Titel: Genauigkeitsproblem mit find-function
|
|
|
|
|
Hallo zusammen,
das ist meine erste Frage hier im Forum und zunächst einmal möchte ich allen ein RIESEN Kompliment aussprechen. Das Forum war schon unzählige Male eine Quelle der Erleuchtung für Matlab-gestresste Nutzer wie mich;). Vielen Dank dafür!
Jetzt aber zum Problem. Ich bin bei der Nutzung der "find"-function auf das Problem gestoßen, das Matlab bei der Erstellung von Vektoren recht schnell an (Genauigkeits)-Grenzen kommt und dadurch für "find" nicht mehr exakt genug ist.
Bsp.:
Ergebniss:
Wo liegt bei so einem recht einfachen Vektor das Problem? Kann da schon die Rechner(un)genauigkeit dazwischen funken? Und wieso tritt das Problem bei:
a = 8.94:0.01:8.98
nicht auf?
Meine bisherigen Lösungen:
1. "round"-function verwenden: a = round(a,7); b = round(b,7)
2. nutzen des Absolutfehlers: idx = find(abs(a-b)<10^-5)
Das Problem bei beiden Lösungen ist, das sich dadurch die Rechenzeit für sehr große Vektoren a und b extrem verlängert.
Gibt es eine weitere Möglichkeit die x-te Nachkommastelle in "find" direkt zu vernachlässigen (so was wie: find(a==b, ..., Vergleiche bis x-te Nachkommastelle))?
Danke schonmal im Voraus.
|
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 19.09.2017, 22:52
Titel: Re: Genauigkeitsproblem mit find-function
|
|
|
|
|
Hallo EricR,
Diese Frage ist der absolute Klassiker unter den FAQ. Du findest dazu hunderte, eher tausende Antworten im Netz.
Das Problem ist nicht die
find
funktion. Um genau zu sein ist es nicht mal ein "Problem", sondern der erwartete Effekt, wenn man berücksichtigt, dass Fließkommazahlen in Matlab im "IEEE754" double Format gespeichert werden (suche nach diesem Ausdruck im Netz). Das betrifft nicht nut Matlab, sondern alle Software für numerische Berechnungen und in den Prozessoren ist dies auch so implementiert.
IEEE754 definiert, wie Dezimalzahlen im Binärformat gespeichert werden. Allerdings haben die meisten Dezimalzahlen haben keine exakte Darstellung im Binärformat. So kommt es, dass bei Ausdrücken, die nur wenige Nachkommastellen im Dezimalsystem haben, bei der Berechnung als doubles trotzdem welche auftauchen. Das Standard-Beispiel ist:
Das ergibt nicht 0.0! Die meisten Programmieranfänger stolpern so darüber:
Man kann nun noch ein
find
dazu nehmen, aber das ändert die Ursache nicht.
Zitat: |
wieso tritt das Problem bei: a = 8.94:0.01:8.98 nicht auf? |
Zufall. Naja, fast Zufall. Es hängt damit zusammen, wie die Binärzahlen zwischen zwei Dezimalzahlen verteilt sind.
Deine beiden Ansätze sind genau richtig. Es gibt keinen Ausweg.
Man kann auch mit Integerwerten arbeiten, aber auch hier gibt es Einschränkungen:
Man könnte erwarten, dass dies 1 ergibt. Es ist aber 0. Denn man kann in einem Double nur eta 16 Stellen speichern. Und damit ist 1e17+1 genau so groß wie 1e17.
Wenn einem 16 Stellen und Integerwerte ausreichen, arbeitet
find
effizient. Wenn nicht, braucht man ein Interval. Dass das mehr Rechenzeit kostet liegt in der Natur der Numerik auf Rechnern, die mit dem IEEE754 Format arbeiten.
Zitat: |
Gibt es eine weitere Möglichkeit die x-te Nachkommastelle in "find" direkt zu vernachlässigen (so was wie: find(a==b, ..., Vergleiche bis x-te Nachkommastelle))? |
Nachdem Du dies gelesen hast, kommst Du vielleicht schon von alleine drauf: Die Frage ist nicht sinnvoll. Es gibt einfach keine "x-te Nachkommastelle". Manche Zahlen werden einfach als 0.3799999999999999 dargestellt, auch wenn man noch so sehr meint, es müsste 0.38 mit 2 Nachkommastellen sein.
Herzlich willkommen in der Welt der Numerik!
Gruß, Jan
|
|
|
EricR |
Themenstarter
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 19.09.17
|
|
|
|
Wohnort: München
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.09.2017, 05:58
Titel:
|
|
Vielen Dank für die schnelle und ausführliche Antwort.
Ich hatte schon gedacht das ich nicht der erste mit so einem Problem bin. Mir hat aber anscheinend der richtige Suchbegriffe gefehlt '.
Grüße.
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|