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

Problem mit logischen Operationen

 

Matlaberer
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2017, 17:59     Titel: Problem mit logischen Operationen
  Antworten mit Zitat      
Hey, ich habe mal eine Frage zu einem Problem bei logischen Operationen.
Ich habe einen Zeitvektor erstellt t = 0:0.1:24
Dann geguckt, welche Werte sind kleiner 12 x = (t<12)
Dann geguckt welchen Wert hat x bei 121 x(121) -> 0
Und dann geguckt was hat t bei 121 t(121) -> 12
Das sieht man in Bild 2. Das ist auch richtig so meiner Meinung nach.

Doch dann habe ich den Vektor t um 0.1 verkleinert. t = 0:0.1:24-0.1
Dann dasselbe gemacht wie zuvor. Nun ist x(121) -> 1 obwohl t(121) noch 12 ist.
Das verstehe ich nicht. Diesen Fall sieht man in Bild 1.

Danke schon mal für die Hilfe.

2.PNG
 Beschreibung:
Bild 2

Download
 Dateiname:  2.PNG
 Dateigröße:  7.57 KB
 Heruntergeladen:  275 mal
1.PNG
 Beschreibung:
Bild 1

Download
 Dateiname:  1.PNG
 Dateigröße:  7.75 KB
 Heruntergeladen:  280 mal
Private Nachricht senden Benutzer-Profile anzeigen


huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 03.07.2017, 20:08     Titel:
  Antworten mit Zitat      
Hi,

es ist eigentlich ganz simpel
Zitat:
Doch dann habe ich den Vektor t um 0.1 verkleinert. t = 0:0.1:24-0.1
Dann dasselbe gemacht wie zuvor. Nun ist x(121) -> 1 obwohl t(121) noch 12 ist.


Das ist dein Vektor t, der bei 0 startet, eine Schrittweite von 0.1 hat und bei 23.9 endet. Insgesamt also 240 Elemente im Vektor.

Egal welcher Schluss der Vektor hat. Es wird immer an der 121. Stelle des Vektors t 12 herauskommen, solange du als Startwert 0 und als Schrittweite 0.1 annimmst

der x wert an der 121 stelle ist natürlich 1, da sich der vektor um 1 verkürzt hat.

ich hoffe es ist ein wenig klarer
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlaberer
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2017, 21:25     Titel:
  Antworten mit Zitat      
Danke, verstehe es aber leider immer noch nicht so ganz.
Ich schneide von dem Vektor "t" nur die letzten 0.1 weg.
Er endet also bei 23.9.
Bei dem Befehl x = (t<12) muss er doch aber wieder vom Anfang los gehen und jedes Element mit 12 vergleichen.
An der Stelle 121 steht nun wieder die 12 in "t" und laut (t<12) müsste die 121 dann 0 sein.

Habe mal was getestet:
t = 0:0.1:(24-a)
a in 0.1 Schritten erhöht
Und die 1 und 0 in x(121) bei x=(t < 12) haben sich bei jeden Schritt abgewechselt.
Verstehe nicht wieso das Abschneiden von Werten am ende des Vektors einen Vergleich an einer Stelle mitten im Vektor ändern.
Könnte den Vektor t ja auch auf 121 kürzen. An der stelle 121 ist er 12. Also x = (t<12) muss bei x(121) 0 ergeben.
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: 03.07.2017, 22:07     Titel:
  Antworten mit Zitat      
Hallo Matlaberer,

Ich bin mit nicht sicher, aber es könnte ein einfacher numerischer Effekt sein.
Beginnen wir bei:
Code:
(0:0.1:1) == 0.3

Hier erhält man keinen TRUE Wert, obwohl man ja einen erwarten könnte. Das liegt daran, dass wegen der begrenzten Genauigkeit die dezimalen Fließkommazahlen keine exakte Representation im verwendeten Dual-System haben. Darum ist 0.1 + 0.1 + 0.1 ~= 0.3 .
Ein Vektor a:c:b wird vom colon Operator per kummulativer Addition erzeugt. Wenn man nun ganz von Anfang bis Ende durch addieren würde, käme man aber eventuell wegen der Rundungsfehler nicht beim Endpunkt an. Deswegen wird die erste Hälfte vom Startwert aus addiert, und die zweite vom Endwert her subtratiert. Jenach dem ob die Anzahl der Elemente gerade oder ungerade ist, könnte der betrachtete Wert also statt 12 auch 11.99999999999999 sein.

Könnte das die Ursache Deiner Beobachtung sein?
Wenn nicht, poste doch mal den Code, denn ich kann noch nicht ganz nachvollziehen, was Du machst.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2017, 00:21     Titel:
  Antworten mit Zitat      
Ah okay, das klingt so als wäre das die Erklärung, danke dir.
Hier noch zum Code (wenn jemand ein änliches Problem hat):
Es ging im Code nur darum, ein Signal zu definieren.
Von 0 bis 6s - 0.1s ist es 0.
von 6s bis 12s - 0.1s ist es -3.
von 12s bis 18s - 0.1s ist es 7.
und von 18s bis 24s ist es wieder 0.
Danach sollten noch mehrere Perioden hintereinander gehängt werden, aber es geht hier nur um den Anfang.

Code:

% Schrittgröße
dt=0.1;
% Signalabschnitt in Sekunden
B=6;

%Zeitvektor
t=0:dt:B*4-dt;
% Einzelne abschnitte des Signals
abs1 = 0*ones(1,(B)/dt);
abs2 = -3*ones(1,(B)/dt);
abs3 = 7*ones(1,(B)/dt);
%Zusammensetzen des Signals
MySign = [abs1 abs2 abs3 abs1];

%Signal über logische Operationen
MySign2 = -3.*(t>=B).*(t<(2*B))+7.*(t>=2*B).*(t<3*B);

%Unterschied
max(MySign - MySign2)
 

Ich finde die Methode über logische Operatoren eleganter. Jedoch kommt bei max(MySign - MySign2) 10 raus. Da bin ich dann drauf gestoßen, dass die logischen Operatoren nicht so arbeiten, wie ich es mir vorgestellt habe. Wenn ich das "-dt" weg lasse, stehen in MySign2 aber die richtigen Werte. Das hängt dann wohl mit dem von dir beschriebenen colon Operator zusammen. Ich denke das sollte es gewesen sein, Vielen Dank.
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.