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

Warum wird If Anweisung ausgeführt?

 

Grünschnabel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 26.06.2015, 11:38     Titel: Warum wird If Anweisung ausgeführt?
  Antworten mit Zitat      
Liebe Community,

der Fehler liegt natürlich beim Anwender (also an mir) aber ich weiß nicht warum folgere if-Anweisung ausgeführt wird obwohl die if-Anweisung m. e. erfüllt ist. Kann mir jemand weiterhelfen, bzw. Tipps geben?!?

Code:
fid = fopen('./../../Results/Testfile_3.txt');
KeyStepNum= 'StepNum=';
tline = fgetl(fid);
i = 1;
TimeStep = 0.005;
Check = 2.55;            % Ein festgelegter Startwert für die Datei Testfile_3.txt

while tline ~=-1;
   
    temp{i}= tline;
    PosTimeStep = strfind (temp{i} , KeyStepNum );      % Position des zu suchenden String
   
    if ~isempty( PosTimeStep )                          % Falls String vorhanden ist, soll die if-Anweisung ausgeführt werden
       
      CurrTimeStep = sscanf (temp{i}( PosTimeStep + length(KeyStepNum):end), '%f'); % Es wird ein TimeStep (float) aus einem String gelesen
      disp([ 'i' num2str(i), '   Check ' num2str(Check), '   CurrTimeStep ' num2str(CurrTimeStep) ] ) % Ergebnisdarstellung
     
      if Check ~= CurrTimeStep   % Falls Check ungleich CurrTimeStep ist, soll Check um TimeStep erhöht werden
        disp (' Erhöht Check')
        Check = Check + TimeStep;
      end
    end
    tline = fgetl(fid);
    i = i + 1;
end

fclose(fid);


Der Printout beim Commant Window sieht wie folg aus:
Zitat:
i1 Check 2.55 CurrTimeStep 2.55
i3 Check 2.55 CurrTimeStep 2.55
i5 Check 2.55 CurrTimeStep 2.55
i7 Check 2.55 CurrTimeStep 2.55
i9 Check 2.55 CurrTimeStep 2.555
Erhöht Check
i11 Check 2.555 CurrTimeStep 2.555
Erhöht Check
i13 Check 2.56 CurrTimeStep 2.555
Erhöht Check
i15 Check 2.565 CurrTimeStep 2.555
Erhöht Check
i17 Check 2.57 CurrTimeStep 2.56
Erhöht Check
i20 Check 2.575 CurrTimeStep 2.56
Erhöht Check
i23 Check 2.58 CurrTimeStep 2.56
Erhöht Check
i26 Check 2.585 CurrTimeStep 2.56
Erhöht Check
i29 Check 2.59 CurrTimeStep 2.565
Erhöht Check
i32 Check 2.595 CurrTimeStep 2.565
Erhöht Check
i35 Check 2.6 CurrTimeStep 2.565
Erhöht Check
i38 Check 2.605 CurrTimeStep 2.565
Erhöht Check


Bei i=9 Check (2,55) ~= CurrTimeStep (2,555) wird die if-Anweisung ausgeführt. Check wird erhöht. RICHTIG!

Ab jetzt wird die if-Anweisung immer erhöht. Warum ?
M.E. ist die if-Anweisung z.b. für i = 11 erfüllt. Check (2,555) = CurrTimeStep (2,555) und somit soll Check nicht erhöht werden.
Question

Habt Ihr irgendwelche Ideen?!?

Vielen Dank im Voraus.
Der Grünschnabel

Testfile_3.txt
 Beschreibung:

Download
 Dateiname:  Testfile_3.txt
 Dateigröße:  7.8 KB
 Heruntergeladen:  401 mal
Private Nachricht senden Benutzer-Profile anzeigen


laternenjoe
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 25.02.15
Wohnort: Bochum
Version: ---
     Beitrag Verfasst am: 26.06.2015, 12:41     Titel:
  Antworten mit Zitat      
Du kannst doch besser, schnell debuggen und so nachvollziehen, warum die ausgeführt wird, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 26.06.2015, 13:06     Titel:
  Antworten mit Zitat      
Klassischerweise sehr kleine numerische Differenzen. Einfach mal vor der if Anweisung

Code:

Check-CurrTimeStep  
 


ausgeben lassen, und wahrscheinlich wird es statt da wo Null erwartet wird irgenwas mit 10^-16 sein.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 26.06.2015, 13:37     Titel:
  Antworten mit Zitat      
Hallo Andreas,
du hast vollkommen recht!!!!

Ich bekomme kleine Unterschiede in Zahlen. Wie kann ich das Problem vernünftig lösen?

Very Happy
Vielen Dank im Voraus.
Der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 26.06.2015, 14:08     Titel:
  Antworten mit Zitat      
Freut mich Laughing Das "Richtige" hängt von der Anwendung ab. Mancher Trick ist nämlich sehr risikoreich. Es gilt zu verstehen wo diese Effekte herkommen und je nach Applikation (wird da mal C Code draus generiert) muss man gewisse Dinge berücksichtigen.

Der einfachste Weg ist aber statt == oder ~= mit Toleranzbereichen zu arbeiten. "Ist der *Betrag* der Differenz kleiner als ein geeigneters Vielfaches von EPS, definiere ich es als Null".

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 26.06.2015, 14:31     Titel:
  Antworten mit Zitat      
Super Andreas,
vielen Dank für den Hinweis!!! Es scheint zu funktionieren. Vollständigkeitshalber setze ich noch einmal den Code mit den richtigen Ergebnissen rein.

Code:
while tline ~=-1;
   
    temp{i}= tline;
    PosTimeStep = strfind (temp{i} , KeyStepNum );
   
    if ~isempty( PosTimeStep )
       
      CurrTimeStep = sscanf (temp{i}( PosTimeStep + length(KeyStepNum):end), '%f');
     
       disp([ 'i' num2str(i), '   Check ' num2str(Check), '   CurrTimeStep ' num2str(CurrTimeStep) ] )  
     
       delta = Check-CurrTimeStep;
       
        if abs(delta) < 1.0e-10
            delta = 0;
        end
      if delta == 0
         
        disp (' Erhöht Check')
        Check = Check + TimeStep;
 
      end
       
    end
   
    tline = fgetl(fid);
    i = i + 1;
   
end


Vielen Dank und ein schönes Wochenende. Very Happy
Der Grünschnabel
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 - 2025 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.