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

eklatanter Logikfehler

 

yukterez
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 19.11.11
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 27.11.2011, 00:52     Titel: eklatanter Logikfehler
  Antworten mit Zitat      
Ich habe einen offenbaren Bug gefunden:

Code:

>> vpa(msmars-mphobos-mdeimos-mpmars, 100)
ans =
0.0
>> vpa(msmars-mpmars-mphobos-mdeimos, 100)
ans =
-9863168.0
 

Die Variablen sind wie folgt definiert (obwohl das hier auch nichts mehr zur Sache tut)

Code:

mpearth=(5.97219E24)
msol=(mpearth/8130059*8230059*328900.56)
mphobos=(1.072E16)
mdeimos=(1.8E15)
msmars=(msol/3098708)
mpmars=(msmars-mphobos-mdeimos)
 

Der Unterschied liegt zwar wie sich´s gehört im Bereich von

Code:

>> mpmars/9863168
ans =
     6.50594500459527e+016
 

Aber eigentlich müsste bei beiden Schreibweisen (siehe oberster Code) das gleiche rauskommen ! Vielleicht liegt der eklatante Logikfehler aber auch in meiner Notation.

Das gleiche passiert übrigens auch bei Freemat:

Code:

--> load var1
--> msmars-mphobos-mdeimos-mpmars
ans =
 0
--> msmars-mpmars-mphobos-mdeimos
ans =
 -9863168
 
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 27.11.2011, 08:03     Titel:
  Antworten mit Zitat      
Das wurde dir doch das letzte mal alles schon erklärt:

Du hast bei den Doubles eine relative Unsicherheit von etwa 16 Nachkommastellen, rechnest du mit 10^24, so ist die 16. Nachkommastelle nunmal 10^8. Du machst jedes mal so, als ob das eine neue Information oder ein neuer Bug wäre, den du erstaunlicherweise rausgefunden hast. Deine Neugier aller Ehre, aber hierzu gibt es 100000 Google-Einträge, weil dies nicht MATLAB-spezifisch sondern double-spezifisch (alle Programmiersprachen) ist!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2011, 10:55     Titel:
  Antworten mit Zitat      
Hallo,

VPA macht nur im Zusammenhang mit symbolischen Objekten wirklich Sinn.

Wenn du symbolisch rechnest, kommen allerdings ohnehin schon exakte Ergebnisse heraus:

Code:
mpearth=sym(5.97219E24)
msol=sym(mpearth/8130059*8230059*328900.56)
mphobos=sym(1.072E16)
mdeimos=sym(1.8E15)
msmars=sym(msol/3098708)
mpmars=msmars-mphobos-mdeimos

msmars-mphobos-mdeimos-mpmars

msmars-mpmars-mphobos-mdeimos


Wenn du die letzten Berechnungen mit VPA durchführst, kommen zwar einmal minimal von 0 verschiedene Resultate heraus; das wird aber bei einer begrenzten Anzahl von Stellen immer so sein.

Code:
mpmars=vpa(msmars-mphobos-mdeimos,100)

vpa(msmars-mphobos-mdeimos-mpmars, 100)

vpa(msmars-mpmars-mphobos-mdeimos, 100)


Auch dass bei Berechnungen mit begrenzter Stellenanzahl unterschiedliche Ergebnisse herauskommen können, selbst wenn die Ergebnisse bei beliebiger Genauigkeit eigentlich gleich sein sollten, sollte nach dem nächsten Beispiel nicht weiter überraschen:
Code:
1 + eps/2 - 1
1 - 1 + eps/2


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 27.11.2011, 12:49 Uhr von Jan S
Von Bugs MATLAB nach Programmierung
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.11.2011, 12:56     Titel: Re: eklatanter Logikfehler
  Antworten mit Zitat      
Hallo yukterez,

Ich habe das Thema von "Bugs MATLAB" nach "Programmierung" verschoben.

Matlab wird zunächst von hunderten Ingenieuren getestet, danach von tausenden Beta-Testern und schließlich von der gesamten Matlab-Community. Natürlich gibt es immer wieder Bugs in Matlab, da Bugs ein inherentes Phänomen in großen komplexen Systemen sind.
Wenn man aber als Nutzer über einen unerwarteten Effekt stolpert, sind in 99.9% der Fälle lediglich die Erwartungen falsch, die Berechnungen aber richtig. Man sollte also zunächst zurückhaltend sein, wenn man einen Bug vermutet. Wenn zudem FreeMat das gleiche Ergebnis liefert, spricht das sehr dafür, dass kein "eklatanter Logikfehler" vorliegt, sondern Deine Erwartungen nicht korrekt sind.

Die Effekte der begrenzten Rechengenauigkeit wurden Dir hier im Forum bereits eingehend erläutert. Um die Auswirkungen in ihrer Gesamtheit zu verstehen, ist zwar ein Studium der Numerik erforderlich. Aber die Grundzüge der IEEE-Arithmetik kannst Du auch bei WikiPedia nachlesen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
yukterez
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 19.11.11
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 28.11.2011, 13:54     Titel: ok (:
  Antworten mit Zitat      
Es stimmt schon, daher habe ich ja geschrieben

Zitat:
Vielleicht liegt der eklatante Logikfehler aber auch in meiner Notation.

Ich habe meine Variablen für solche Fälle auf sym umgestellt, mich hat aber bei der normalen Rechnung dennoch gewundert, dass ich bei

a - b - c - d
ein anderes ergebnis erhalte als bei
a - c - d - b
erhalte,
weil es nur eine subtraktion ist, aber wenn ihr sagt dass das ok ist bin ich beruhigt (: es stimmt schon, es wurde mir schon einmal erklärt, aber manchmal muss man 2x fragen (ein ganzes studium der numerik geht sich auf meine alten tage nicht mehr aus, aber mit eurer Hilfe hab ich´s trotzdem hingekriegt :)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2011, 17:16     Titel:
  Antworten mit Zitat      
Hallo,

ein einfacheres Beispiel, in dem ein ähnliches Problem auftritt, habe ich ja schon geschickt:
Code:
1 + eps/2 - 1
1 - 1 + eps/2  


Eine etwas unwissenschaftliche, aber vielleicht zum Verständnis beitragende Erklärung:
Ein numerischer Fehler wird ja nun auch nicht eingeführt, um Nutzer zu ärgern, sondern ist ein auf den ersten Blick zufälliges Resultat minimalster Ungenauigkeiten und daher bei komplexeren Anwendungen oft nicht wirklich nachvollziehbar. Eben deswegen rechnet man mit 16 Stellen, obwohl sie ja eigentlich kaum jemand interessieren: damit es nichts ausmacht, wenn man "ein paar Stellen" an Genauigkeit verliert.
Trotz allem ist es natürlich eine gute Idee, bei der Implementierung der Algorithmen mitzudenken und beispielsweise die Subtraktion ähnlich großer Zahlen nach Möglichkeit zu vermeiden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 19.11.11
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 28.11.2011, 22:11     Titel:
  Antworten mit Zitat      
Ja, jetzt geht´s sogar mit dem eps (:

Code:
>> a=sym(eps/2)
a = 1/9007199254740992
 
>> vpa(1 + a - 1, 16)
      vpa(1 - 1 + a, 16)
 
ans = 0.0000000000000001110223024625157
ans = 0.0000000000000001110223024625157

>> eps/2
ans =                             1.110223024625157e-016
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2026 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.