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

zwei if Schleifen nur eine funktioniert

 

BlackDice
Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 12.03.2021, 12:24     Titel: zwei if Schleifen nur eine funktioniert
  Antworten mit Zitat      
Moin zusammen,
irgendwie will meine if Bedingung nicht so wie ich will. Es wird garantiert ein total einfacher Fehler sein. Ich finde ihn nur nicht.

Ich habe jeweils ein Field und ein DropDown Menü mit denen ich eine Start- und eine Stoppfrequenz berechne. Meine Startfrequenz soll nicht höher als 5kHz gehen und die Stoppfrequenz nicht niedriger als 5µHz.

Wenn ich in das Feld für die Startfrequenz 5kHz eingebe ist alles in Ordnung. Erst wenn ich einen höheren Wert wähle wird der Wert mit 5kHz überschrieben.
Das gleiche soll bei der Stoppfrequenz auch passieren. Da bekomme ich aber auch wenn ich 5µHz eingebe die msgbox.

Code:
                   %Start Frequenz berechnen
                    if strcmpi(app.StartFrqFDS_DropDown.Value,'µHz')
                        StartFrqFaktor = app.mikro;
                    elseif strcmpi(app.StartFrqFDS_DropDown.Value,'mHz')
                        StartFrqFaktor = app.milli;
                    elseif strcmpi(app.StartFrqFDS_DropDown.Value,'Hz')
                        StartFrqFaktor = 1;
                    elseif strcmpi(app.StartFrqFDS_DropDown.Value,'kHz')
                        StartFrqFaktor = app.Kilo;
                    end
                    app.StartFrequenz = app.StartFrqFDS_Field.Value * StartFrqFaktor;
                   
                    %Warnung, wenn die Startfrequenz größer ist als 5kHz
                    if app.StartFrequenz > 5e3
                        msgbox('Startfrequenz zu groß', '','warn')
                        app.StartFrqFDS_Field.Value = 5;
                        app.StartFrqFDS_DropDown.Value = 'kHz';
                        StartFrqFaktor = app.Kilo;
                    end
                    app.StartFrequenz = app.StartFrqFDS_Field.Value * StartFrqFaktor;
                   
                    %Stop Frequenz berechnen
                    if strcmpi(app.StopFrqFDS_DropDown.Value,'µHz')
                        StopFrqFaktor = app.mikro;
                    elseif strcmpi(app.StopFrqFDS_DropDown.Value,'mHz')
                        StopFrqFaktor = app.milli;
                    elseif strcmpi(app.StopFrqFDS_DropDown.Value,'Hz')
                        StopFrqFaktor = 1;
                    elseif strcmpi(app.StopFrqFDS_DropDown.Value,'kHz')
                        StopFrqFaktor = app.Kilo;
                    end
                    app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor;
                   
                    %Warnung, wenn die Stopfrquenz kleiner ist als 5µHz
                    if app.StopFrequenz < 5e-6
                        msgbox('Stopfrequenz zu klein', '','warn')
                        app.StopFrqFDS_Field.Value = 5;
                        app.StopFrqFDS_DropDown.Value = 'µHz';
                        StopFrqFaktor = app.mikro;
                    end
                    app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor;


Viele Grüße
Fabian

Zuletzt bearbeitet von BlackDice am 12.03.2021, 12:39, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 12.03.2021, 12:35     Titel: Re: zwei if Schleifen nur eine funktioniert
  Antworten mit Zitat      
BlackDice hat Folgendes geschrieben:
Da bekomme ich aber auch wenn ich 5µHz eingebe die Warnung ausgespuckt.


Welche Warnung?
Bitte exakt schreiben. Welche Zeile, etc.

Hast du versucht per debuggen den Fehler genau einzugrenzen? Die Werte in den Variablen zu überprüfen?
Code:

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 12.03.2021, 12:38     Titel:
  Antworten mit Zitat      
ohhh Entschuldige. Die msgbox erscheint.

Wenn ich im Debugmodus mir die Werte angucke dann habe ich auch 5e-6 in der app.StopFrequenz stehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 12.03.2021, 12:39     Titel:
  Antworten mit Zitat      
Dann debugge doch bitte mal.
Setze dir einen Breakpoint vor der Messagebox.
Prüfe die Werte, gehe Schritt für Schritt weiter.

Falls du nicht weißt wie:
https://de.mathworks.com/help/matla.....process-and-features.html
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 12.03.2021, 12:43     Titel:
  Antworten mit Zitat      
Das habe ich in der app.StopFrequenz stehen.

Code:
app.StopFrequenz: 1x1 double = 5.0000e-06


Dieses Problem habe ich aber auch nur wenn ich auf < 5e-6 vergleiche. Wenn ich das mit höheren Werten mache funktioniert das.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 12.03.2021, 13:05     Titel:
  Antworten mit Zitat      
Du möchtest deine Stopfrequenz doch nach unten auf 5µHz begrenzen. Dies scheint es doch zu tun?

Ansonsten kann von meiner Seite des Bildschirms aus nicht nachvollzogen werden, was VOR der Prüfung der stopFrq. in dieser gespeichert ist. Ebenfalls nicht, was in den beiden Werten steht, aus der sie berechnet wird

Code:
%Stop Frequenz berechnen
if strcmpi(app.StopFrqFDS_DropDown.Value,'µHz')
    StopFrqFaktor = app.mikro;  %% <-- WAS steht in app.mikro?
elseif strcmpi(app.StopFrqFDS_DropDown.Value,'mHz')
    StopFrqFaktor = app.milli;
elseif strcmpi(app.StopFrqFDS_DropDown.Value,'Hz')
    StopFrqFaktor = 1;
elseif strcmpi(app.StopFrqFDS_DropDown.Value,'kHz')
    StopFrqFaktor = app.Kilo;
end
app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor; %% <-- WAS steht in app.StopFrqFDS_Field.Value?

%Warnung, wenn die Stopfrquenz kleiner ist als 5µHz
%% Welchen Wert hat die StopFrq. VOR dieser Zeile?
    msgbox('Stopfrequenz zu klein', '','warn')
    app.StopFrqFDS_Field.Value = 5;
    app.StopFrqFDS_DropDown.Value = 'µHz';
    StopFrqFaktor = app.mikro;
end
app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor;

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 12.03.2021, 13:15     Titel:
  Antworten mit Zitat      
Mmmartina hat Folgendes geschrieben:
Du möchtest deine Stopfrequenz doch nach unten auf 5µHz begrenzen. Dies scheint es doch zu tun?

Ja das tut es. Wenn ich 4Hz eintrage wird der Wert auf 5µHz geändert und die msgbox erscheint. Das passiert abetr auch wenn ich 5µHz eintrage. Die erscheint wenn ich in der oberen Begrenzung 5kHz eintrage nicht.


Code:
mikro = 0.000001


Code:
app.StopFrqFDS_Field.Value: 1x1 double =  5


Code:
app.StopFrequenz: 1x1 double = 5.0000e-06


mein Programm springt bei diesen Werten in die if Schleife.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.03.2021, 12:03     Titel: Re: zwei if Schleifen nur eine funktioniert
  Antworten mit Zitat      
Hallo BlackDice,

Ich würde zunächst den Code vereinfachen.
Code:
% Ersetze:
if strcmpi(app.StartFrqFDS_DropDown.Value,'µHz')
   StartFrqFaktor = app.mikro;
elseif strcmpi(app.StartFrqFDS_DropDown.Value,'mHz')
   StartFrqFaktor = app.milli;
elseif strcmpi(app.StartFrqFDS_DropDown.Value,'Hz')
   StartFrqFaktor = 1;
elseif strcmpi(app.StartFrqFDS_DropDown.Value,'kHz')
   StartFrqFaktor = app.Kilo;
end
app.StartFrequenz = app.StartFrqFDS_Field.Value * StartFrqFaktor;

% Durch:
FaktorList = [1e-6, 1e-3, 1, 1000];
UnitList   = {'µHz', 'mHz', 'Hz', 'kHz'};
Faktor     = FaktorList(strcmp(app.StartFrqFDS_DropDown.Value, UnitList));
StartFrequenz = app.StartFrqFDS_Field.Value * Faktor;


Es gibt übrigens keine "if Schleifen".

Wie Martina schon schreibt: Der Debugger zeigt dir genau was warum passiert, wenn du Zeile für Zeile durch den Code gehst.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 13.03.2021, 13:46     Titel:
  Antworten mit Zitat      
@Jan, danke das macht es auf jeden Fall kompakter.

Wie schon geschrieben. Ich habe mit den Debugger jede Zeile angeguckt. In meiner app.StopFrequenz steht 5.00000e-6 drin aber trotzdem wird in diese if Bedingung gesprungen. Wenn ich 6µHz als untere Grenze nehme gibt es das Problem nicht.


Viele Grüße
Fabian
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 13.03.2021, 17:59     Titel:
  Antworten mit Zitat      
Also ich hab mal alles andere aus meinem Programm rausgeschmissen und nur noch die Begrenzung für die untere Frequenz drin gelassen. Das Problem habe ich nur wenn ich 5 als Grenzfrequenz festlege. Bei 4 oder 6 gibt es keine Probleme. Ich bin mit dem Debugger mehrmals alle Zeilen durchgegangen. Ich hab auch mal ein Bild angehängt bei dem man den Inhalt von "StopErg" sehen kann. Vielleicht hat ja noch irgendjemand eine Idee woran das liegen könnte?

Code:
  properties (Access = public)
        FaktorList = [1e-6, 1e-3, 1, 1e3];
        UnitList   = {'µHz', 'mHz', 'Hz', 'kHz'};
    end
   
    methods (Access = private)
       
        function Freq(app)
            Faktor = app.FaktorList(strcmp(app.StopDD.Value, app.UnitList));
            app.StopErg.Value = app.StopF.Value * Faktor;
           
            if app.StopErg.Value < 5e-6
                msgbox('Stopfrequenz zu klein', '','warn')
                app.StopF.Value = 5;
                app.StopDD.Value = 'µHz';
                app.StopErg.Value = 5e-6;
            end
        end
    end


https://ibb.co/dMCFmfV
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hatte hier schon mitgelesen, verstehe aber beim letzten Beitrag das erste Mal, was eigentlich die Frage ist. Wenn die Frage von vorneherein so klar gestellt gewesen wäre, hätte man sie auch im ersten Versuch beantworten können.

Das Problem sind numerische Berechnungen. Computer arbeiten im Binärsystem, und dort haben Zahlen wie 1e-6 keine Repräsentation mit einer endlichen Stellenanzahl.
Code:
5*1e-6 - 5e-6
5*1e-6 < 5e-6

Du kannst dir das vorstellen wie 1/3 im Binärsystem: 1/3 = 0.333333333, also 3 * 1/3 = 0.999999999. Das blöde ist nun, man kann die Genauigkeit erhöhen wie man will: wenn man noch so viele 3er anfügt, hat man im Ergebnis ebenso viele 9er, aber nie die Zahl 1.

Abhilfe, wenn man 5e-6 genau zulassen will: den Schwellwert minimal kleiner wählen, z.B. 5e-6 - eps(5e-6)

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 14.03.2021, 12:27     Titel:
  Antworten mit Zitat      
Moin Harald, danke für die Erklärung.
Was ich aber dann nicht verstehe ist warum das bei 4e-6 oder 5e-9 funktioniert.

Viele Grüße
Fabian
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

das würde ich als "Glückssache" ansehen. Numerische Fehler können ja in beide Richtungen auftreten, sich aufheben, etc.

Um das zu verstehen, müsste man sich wohl ansehen, wie die Zahlen im Binärsystem repräsentiert sind und wie im Binärsystem die Multiplikation durchgeführt wird. Die Ambition habe ich nicht.

In Hexadezimaldarstellung sieht man schön, dass das letzte Bit mal nicht übereinstimmt, mal schon
Code:
format hex
5e-6
ans =
   3ed4f8b588e368f1
5*1e-6
ans =
   3ed4f8b588e368f0
5e-9
ans =
   3e35798ee2308c3a
5*1e-9
ans =
   3e35798ee2308c3a
4e-6
ans =
   3ed0c6f7a0b5ed8d
4*1e-6
ans =
   3ed0c6f7a0b5ed8d


Edit: eine Multiplikation mit 4 ist verhältnismäßig unkritisch, da sich die Mantisse nicht ändert, sondern nur der Exponent - ähnlich einer Verschiebung des Dezimalkommas.
Code:
1e-6
ans =
   3eb0c6f7a0b5ed8d
4*1e-6
ans =
   3ed0c6f7a0b5ed8d


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 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.