Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Softwarearchitekt (m/w)
Entwicklung mit Matlab / Simulink und MISRA-C
SEG Automotive Germany GmbH - Stuttgart-Weilimdorf

SW-Entwickler/in SiL Motorsteuerung
Erstellung und Erweiterung von kundenspezifischen Simulationsmodellen in MATLAB/Simulink
Robert Bosch GmbH - Schwieberdingen

Informatiker (m/w) für den Bereich Toolkette Embedded Software
Weiterentwicklung einer MATLAB- / Simulink-Toolkette
cbb-Software GmbH - Stuttgart

Entwickler Fahrerassistenzsysteme / Automatisiertes Fahren - Fahrversuch (m/w)
Entwicklung von Funktionen für assistiertes und pilo­tiert­es Fahren
Knorr-Bremse Systeme für Nutzfahrzeuge GmbH - Schwieberdingen

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Abbruchbedingung einer while-Schleife

 

draghkar
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2018, 19:52     Titel: Abbruchbedingung einer while-Schleife
  Antworten mit Zitat      
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:

Code:

a=2;
eps=10e-2;

lsg = zeros(30,1);        % Initialisierung des Lösungsvektors
lsg(1) = 1/a;
lsg(2) = 1/(a+lsg(1));
iter = 2;                 % Initialisierung des Iterationsschritts

while abs(lsg(iter)-lsg(iter-1)) >= eps     % Abbruchbedingung
    iter = iter+1
    lsg(iter) = 1 / (a+lsg(iter-1));        % Iterationsvorschrift
end  


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


Harald
Forum-Meister

Forum-Meister


Beiträge: 18.380
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 28.01.2018, 21:10     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
draghkar
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2018, 21:20     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.380
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 28.01.2018, 21:49     Titel:
  Antworten mit Zitat      
Hallo,

symbolische Variablen erstellt man mit syms oder sym . Hier z.B.
Code:
a=sym(2);
eps=sym(10e-2);

lsg = sym(zeros(30,1));


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
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 - 2018 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.