WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rechengenauigkeit???

 

calcy
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2009, 18:46     Titel: Rechengenauigkeit???
  Antworten mit Zitat      
Hi,

bin Anfänger und verstehe absolut nicht mit welcher Genauigkeit matlab rechnet.

-0.59+10.06+4.06 = 13.53
-0.42+11.29+2.66 = 13.53

ABER

(-0.59+10.06+4.06)-(-0.42+11.29+2.66) = 1.7764e-15

WARUM rechnet matlab nicht Null als Ergebnis aus????????????????????????

Vielen Dank.

Gruss,

calcy
Private Nachricht senden Benutzer-Profile anzeigen


Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 27.12.2009, 19:11     Titel:
  Antworten mit Zitat      
Matlab rechnet standardmäßig mit 64Bit Fließkommazahlen (Basis 2) nach IEEE754. In dieser Darstellung können bereits deine Zahlen nicht mehr exakt dargestellt werden und du verlierst Genauigkeit. Das würdest du auch schon bei den ersten Berechnungen sehen, aber dort fällt es entweder einfach durch die begrenzte Anzeige nicht auf, oder die Fehler heben sich vielleicht wieder auf (z.B. durch intern durchgeführte Rundungen).

http://de.wikipedia.org/wiki/IEEE_754
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2009, 19:25     Titel:
  Antworten mit Zitat      
Hallo Tim,
vielen Dank für dieschnelle Antwort!
Was muss ich tun damit matlab so rechnet, dass die obige Rechnung tatsächlich null ergibt?
Den null ist nach Adam Riese ja die richtige Antwort.
Finde diese Genauigkeit ehrlich gesagt ziemlich störend.
Es hat leider ungeheuer viel Zeit gekostet herauszufinden, dass ich nicht falsch programmiere sondern matlab "falsch" rechnet.

Ich darf meine Daten wohl nicht mit dem Zahlenformat "f" im Rahmen von textscan einlesen sondern muss ein anderes Format wählen. Hab schon "f32" und "n" versucht. Leider ohne Erfolg. Welches ist das richtige Format für mich?

Viele Grüsse,

Calcy

Zuletzt bearbeitet von calcy am 27.12.2009, 19:36, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.12.2009, 19:27     Titel:
  Antworten mit Zitat      
Hallo,

probiers mal mit
Code:

Da siehst du, dass du eben nicht genau 13.53 herausbekommst. Solche Ungenauigkeiten sind i.d.R. nicht relevant. Am ehesten sorgen sie bei Vergleichen auf Gleichheit Probleme. Da hilft statt
Code:
auf kleine Abweichung zu testen
Code:
abs(x-y) < 1e-10


Edit: calcy's Antwort war noch nicht da. Es wird nicht 0 ergeben. Weder in MATLAB noch in den meisten anderen Programmiersprachen.
Abhilfe bietet da eigentlich nur symbolisches Rechnen, in MATLAB mit der Symbolic Math Toolbox möglich. Da kommt dann auch genau 0 heraus.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2009, 19:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

genau solche Vergleiche:

Code:


sind für meine Rechnungen zentral.
Wenn ich in Excel rechne kommt bei obiger Rechnung aber null heraus.
Gibt es keine Möglichkeit Matlab zu zwingen ebenso wie Excel zu rechnen?

Gruss,

Calcy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.12.2009, 20:26     Titel:
  Antworten mit Zitat      
Hallo,

auch in Excel kommt nicht 0 heraus. Versuch:

in A1: =-0,59+10,06+4,06
in A2: =-0,42+11,29+2,66
in A3: =(A1-A2)*1000000000000
in A4: =(A1=A2)

Ergo: auch in Excel kommt nicht 0 heraus (hätte mich auch sehr überrascht). Was meiner Ansicht nach noch schlimmer ist: Excel spiegelt vor, dass 0 herauskommt, und es trifft nicht zu! (siehe A3). Und die Krönung: es spiegelt dem Anwender vor, dass 2 Werte, die intern offensichtlich voneinander verschieden sind, gleich wären!!

Wenn es dir um Vergleiche geht, empfehle ich den von mir zuvor beschriebenen Weg.

Grüße,
Harald

P.S.: Viele ehemalige Excel-Anwender nutzen MATLAB, weil es eben NICHT so rechnet wie Excel. Die meines Erachtens naheliegendere Frage wäre: kann man Excel nicht zwingen, so zu rechnen wie MATLAB?
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2009, 21:03     Titel:
  Antworten mit Zitat      
also mich verwirrt das alles ziemlich.
Habe dein Beispiel in open office calc angewendet. Bei mir kommt exakt null heraus! AUf ein Bildschirmfoto hab ich verzichtet. Warum sollte auch etwas anderes als null heraus kommen????
Würde gern verstehen warum matlab so rechnet.
Auch wenn man das hier vielleicht nicht sagen darf aber open office calc liefert ein Ergebnis das mathematisch korrekt ist nämlich null, schließlich sind beide Summen identisch!
Matlab macht das nicht. Es mag gute Gründe dafür geben, die ich unbedingt verstehen sollte. Sonst ierscheint mir das Arbeiten mit Matlab ziemlich "anstrengend". Man muss sich doch darauf verlassen können, dass zwei gleich große Summen auch als gleich groß behandelt werden? Wie gesagt ich verstehe das leider "noch" nicht. Wäre dir sehr dankbar wenn du mir das erklären würdest.

Gruss,

Calcy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.12.2009, 21:29     Titel:
  Antworten mit Zitat      
Hallo,

ich verwende Office 2007, und da kommt eindeutig nicht 0 heraus. Das Beispiel sollte reichen, und auch ich verzichte auf Screenshot. Es wird nur (eigentlich fälschlicherweise) als 0 angezeigt.

Zitat:
Warum sollte auch etwas anderes als null heraus kommen????

Weil Computer mit Binärzahlen arbeiten (0 und 1), und deine Zahlen sind binär nicht exakt darstellbar. Dadurch ergeben sich Rundungsfehler.

Zitat:
Auch wenn man das hier vielleicht nicht sagen darf aber open office calc liefert ein Ergebnis das mathematisch korrekt ist nämlich null, schließlich sind beide Summen identisch!


Was bei Excel offenbar passiert ist, dass zwei Ergebnisse, die sehr ähnlich zueinander sind, als gleich angesehen werden, auch wenn sie es nicht sind. im Klartext: auch in Excel sind die beiden Summen nicht identisch (siehe Zelle A3 im vorherigen Beispiel; 0 * x sollte ja 0 sein). Excel betrachtet diese Zahlen aber aufgrund des geringen Unterschieds als gleich (!). Excel macht also nach einem Fehler noch einen Fehler in der Hoffnung, den ersten aufzuheben. Das mag bequem sein, ist aber IMHO unsinnig.
Aus numerischer Sicht ist es schlicht nicht empfehlenswert, zwei Zahlen auf Gleichheit zu testen. Immer besser testen, ob die Abweichung unterhalb einer bestimmten Toleranz liegt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2009, 22:17     Titel:
  Antworten mit Zitat      
vielen Dank Harald. Das war eine wichtige Lektion.
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2009, 10:43     Titel:
  Antworten mit Zitat      
Hallo Harald (oder jeder andere Matlab-Guru Very Happy ),

gibt es vielleicht eine globale Anweisung, die ich an den Anfang meines codes setzen könnte, welche besagt, dass Matlab im Folgenden sämtliche Differenzen zwischen zwei Werten die kleiner als 1e-10 ist als gleich interpretieren soll?

Solch eine Anweisung wäre sehr praktisch für mich.

Vielen Dank.

Gruss,

Calcy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2009, 11:13     Titel:
  Antworten mit Zitat      
Hallo,

hier eine kleine Funktion dazu:
Code:
function tf = gleich(a,b)

tf = (abs(a-b) < 1e-10);


Das einzige, was dadurch nicht bzw. nicht wie erwartet geht, ist der Aufruf a == b. Da aber hinter diesem auch nur der Aufruf einer Funktion eq(a, b) steckt, ist das IMHO so eine gute Lösung.

Statt a == b also dann immer gleich(a,b) schreiben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2009, 11:43     Titel:
  Antworten mit Zitat      
Danke Harald, nur funktioniert die Funktion in meinem m.file nicht. Es erscheint folgende Fehlermeldung

Function definitions are not permitted at the prompt or in scripts.

Habe im Forum gelesen, dass ich mein m.file erst mit einer weiteren Function beginnen lassen muss. Was könnte das für eine Function sein?

Das verstehe ich leider auch nicht.

Gruss,

Calcy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2009, 11:59     Titel:
  Antworten mit Zitat      
Hallo,

du solltest den Code in einem separaten m-File abspeichern, damit er auch anderen Skripten/Funktionen zur Verfügung steht. Ansonsten sagt die Fehlermeldung eigtl schon alles.

Ein Skript kann leicht in eine Funktion umgewandelt werden. Gib in der Hilfe mal function ein.

Grüße,
Harald

Zuletzt bearbeitet von Harald am 28.12.2009, 12:04, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
calcy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 11.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2009, 12:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

mein Problem ist folgendes:

Ich habe eine 468 mal 25 Matrix.
Matlab soll nun Zeilenweise bei Differenzen kleiner als 1e-10 zwischen zwei Elementen diese beiden Elemente gleich setzen.
Also angenommen
Code:

Matrix(1, :)
 

sieht so aus
Code:

Matrix(1, :) = 2.0484 5.0515 ... 5.0515
 

Das zweite und das 25. Element sind gemäß Anzeige am Bildschirm identisch. Aber tatsächlich intern in Matlab verschieden. Dann sollen diese beiden Elemente gleich gesetzt werden. Dabei ist es egal ob das 2. = dem 25. gesetzt wird oder umgekehrt.
Matlab soll also jede mögliche Paarung innerhalb jeder Zeile der Matrix prüfen.

Kannst du mir sagen wie so etwas umzusetzen ist?

Vielen Dank im Voraus.

Viele Grüsse,

clacy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2009, 12:54     Titel:
  Antworten mit Zitat      
Hallo,

zunächst die Frage: wozu das ganze?

Eine Möglichkeit, das umzusetzen, wäre z.B., alle Werte auf 9 Stellen zu runden:
Code:
Matrix = round(Matrix * 1e9)/1e9


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

Gehe zu Seite 1, 2  Weiter

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button 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.