|
|
Abbruchbedingung einer while-Schleife |
|
draghkar |
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 28.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.01.2018, 18:52
Titel: Abbruchbedingung einer while-Schleife
|
|
Hallo zusammen, ich habe ein Problem bezüglich einer Abbruchbedingung im Rahmen einer größeren Funktion. Da ich den Fehler bereits eingrenzen konnte, hier nur der relevante Teil:
Nach meinem logischen Verständnis muss dort iter=3 rauskommen, da die while-Schleife 1x durchlaufen wird. (lsg(2)-lsg(1) = 2/5-1/2 = 0.1 und damit >= eps)
Stattdessen ist iter=2 und die Schleife wird gar nicht durchlaufen. Wieso ist das so?
Meine Vermutung lag in den Matlabeinstellungen bzgl. der Nachkommastellen. Subtrahiere ich bspw eine sehr kleine Zahl von eps, so stimmt das Ergebnis wieder.
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.01.2018, 20:10
Titel:
|
|
Hallo,
das ist nicht nur ein Problem von MATLAB, sondern generell von Binärarithmetik. Zahlen wie 0,4 haben im Binärsystem keine endliche Darstellung.
Im Dezimalsystem hat man quasi das gleiche Problem. 1/3 + 1/3 + 1/3 = 1, aber 0,33333 + 0,33333 + 0,33333 = 0,99999. Nun kannst du so viele 3er anfügen wie du willst, das Ergebnis wird zwar näher an 1 heranrücken, aber nie 1 sein.
Es gibt zwei Lösungen:
a) symbolisches Rechnen --> exakt, aber deutlich langsamer
b) Tests auf Gleichheit grundsätzlich vermeiden und generell minimale Ungenauigkeiten erwarten.
Grüße,
Harald
|
|
|
draghkar |
Themenstarter
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 28.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.01.2018, 20:20
Titel:
|
|
Danke für die schnelle Antwort!
a) Wie genau sähe das in diesem Beispiel aus? Mit der Iterationsvorschrift habe ich ja genaue Werte, an denen ich mich orientieren muss.
b) Die Abbruchbedingung ist leider ein Kriterium, das so Bestand haben muss.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.01.2018, 20:49
Titel:
|
|
Hallo,
symbolische Variablen erstellt man mit
syms
oder
sym
. Hier z.B.
Bei so einer Iteration ist üblicherweise das Ziel, auf Konvergenz zu überprüfen. Dafür ist die ganz genaue Einhaltung der Toleranz dann nicht relevant.
Grüße,
Harald
|
|
|
|
|
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.
|
|