Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Embedded Software- Entwickler (m/w) - Hardwarenahe Software für innovative Steuerungssysteme
Design, Implementierung und Test von Embedded Software
DR. JOHANNES HEIDENHAIN GmbH - Traunreut (Raum Rosenheim)

Entwicklungsingenieur/-in für Hard-/Software Assistenzsysteme
Steuergeräte- und Softwareverantwortung der Radarsensorik
Daimler AG - Stuttgart

Software-Entwicklungsingenieur (m/w) Referenzierungsmethoden autonomes Fahren
Automatisierung von Bewertungsmethoden und Kalibrierverfahren nach Kundenanforderungen
Elektronische Fahrwerksysteme GmbH - Ingolstadt

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Genauigkeitsproblem mit find-function

 

EricR
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.09.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 19.09.2017, 22:07     Titel: Genauigkeitsproblem mit find-function
  Antworten mit Zitat      
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.:

Code:

a = 8.95:0.01:8.98
b = 8.96
idx = find(a==b)
 


Ergebniss:

Code:

1×0 empty double row vector
 


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.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.09.2017, 22:52     Titel: Re: Genauigkeitsproblem mit find-function
  Antworten mit Zitat      
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:
Code:
0.1 + 0.1 + 0.1 - 0.3

Das ergibt nicht 0.0! Die meisten Programmieranfänger stolpern so darüber:
Code:
(0:0.1:1) == 0.3

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:
Code:
1e17 + 1 - 1e17

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
Private Nachricht senden Benutzer-Profile anzeigen
 
EricR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.09.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 20.09.2017, 05:58     Titel:
  Antworten mit Zitat      
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 'Smile.

Grüße.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.