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

Ablauf der for- und if-Funktionen

 

nemax
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 13.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2009, 10:38     Titel: Ablauf der for- und if-Funktionen
  Antworten mit Zitat      
Hallo,

ich habe zwei Fragen, für die ich keine Erklärung habe:


1. eine einfache Substration der Form c = a - b bringt unsinnige Werte heraus,

wie 1.0451e-17 = 5.2253e-18 - 0;

Hat jemand dafür eine Erklärung ?



2. Weiterhin habe ich eine Kombination aus der for- und if-Schleifen folgender Form:

for i = 1:length(x)
if i == 1
Befehl 1
else
Befehl 2
end
Befehl 3
end

Wenn ich den Debuger bei dem Befehl 3 stope, dann erhalte ich nicht nur die Werte aus dem Befehl 1 sondern auch aus Befehl 2. Was im Grunde nicht möglich sein sollte, weil die for-Schleife beim Stopen des Debager in der Position "Befehl 3" noch die Bedingung i==1 erfüllt. Daher sollten die Werte aus dem "Befehl 2" zu diesem Zeitpunkt noch nicht vorhanden sein - oder ?

Habe ich recht oder übersehe ich etwas ?
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 21.05.2009, 17:34     Titel:
  Antworten mit Zitat      
Hi nemax,

zu erstens kann ich nur vermuten, dass es was mit der Ungenauigkeit von Matlab zu tun hat. Vielleicht bestimmte Werte zu einem gewissen Grad runden.

Zu zweitens, dass sehe ich so wie du, das sollte nicht funktionieren. Hab es sicherheitshalber mal getestet:

Code:

x=randn(10,1);


for k = 1:length(x)
if k == 1
a=1
else
b=2
end
x(k)=3
end
 


Ist mit diesem Code so, dass man b nicht sehen kann wenn der Debugger bei x(k)=3 stehen bleibt. Vielleicht ist der Wert noch von einer vorhigen Berechnung da. Könntest ja noch ein clear vorher einbauen. Das i hab ich mal durch k ersetzt, weil i bei Matlab wie j auch für die komplexe Zahl steht.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 21.05.2009, 17:52     Titel:
  Antworten mit Zitat      
Noch ein Tipp am Rande:
Wenn du mit IF auf bestimmte feste Werte überprüfst, die vorher schon festliegen, dann nimm SWITCH.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
nemax
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 13.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2009, 18:21     Titel:
  Antworten mit Zitat      
derOli hat Folgendes geschrieben:
Hi nemax,

zu erstens kann ich nur vermuten, dass es was mit der Ungenauigkeit von Matlab zu tun hat. Vielleicht bestimmte Werte zu einem gewissen Grad runden.


Ich habe zu beginn die gleiche Vermutung gehabt, aber dann doch diese Variante verworfen. Wenn ich Matlab für wissischaftliche Arbeiten verwende, erfordert es eine exakte Berechnung. Und bei meinem Beispiel oben muss es noch elementarer sein. Denn wenn ich 0 von einem Wert abziehe, dann muss es gleich bleiben.

derOli hat Folgendes geschrieben:
Zu zweitens, dass sehe ich so wie du, das sollte nicht funktionieren. Hab es sicherheitshalber mal getestet:

Code:

x=randn(10,1);


for k = 1:length(x)
if k == 1
a=1
else
b=2
end
x(k)=3
end
 


Ist mit diesem Code so, dass man b nicht sehen kann wenn der Debugger bei x(k)=3 stehen bleibt. Vielleicht ist der Wert noch von einer vorhigen Berechnung da. Könntest ja noch ein clear vorher einbauen. Das i hab ich mal durch k ersetzt, weil i bei Matlab wie j auch für die komplexe Zahl steht.

Viele Grüße,

der Oli


Ja, den clear-Befehl habe ich bereits vorher eingebracht. Ohne den ging es nicht. Smile
Ich habe jetzt Debuger nochmal angesehen. Ich muss mich zum Teil korrigieren. In dem oben beschriebenen Fall sind die Werte aus Befehl 2 im Workspace nicht zu sehen. Aber wenn man mit der Maus über die Variablen geht, sieht man trotz dessen einen Wert.

Bis jetzt ist mir dieser Unterschied zwischen Workspace und Mauszeiger nicht aufgefallen.

Zuletzt bearbeitet von nemax am 21.05.2009, 18:24, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
nemax
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 13.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2009, 18:23     Titel:
  Antworten mit Zitat      
steve hat Folgendes geschrieben:
Noch ein Tipp am Rande:
Wenn du mit IF auf bestimmte feste Werte überprüfst, die vorher schon festliegen, dann nimm SWITCH.

Gruß
Alex


Wieso ? Ich meine, welcher Grund liegt hierfür ?
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 21.05.2009, 19:52     Titel:
  Antworten mit Zitat      
Der Grund ist die Laufzeit der Programme. If-Abfragen dauern länger als switch-case-Verzweigungen.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 21.05.2009, 20:19     Titel:
  Antworten mit Zitat      
Hi,

bei meinem oben geposteten Beispiel zeigt mir auch der Mauszeiger nichts an. Probier das mal aus ob es bei dir anders ist. Kannst du das 1. Problem noch etwas genauer Beschreiben.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.05.2009, 20:45     Titel:
  Antworten mit Zitat      
Hallo Nemax,

ich habe versucht, das erste Problem nachzuvollziehen, und es ist mir leider (oder besser gesagt: zu meiner Beruhigung) nicht gelungen.

Code:
a = 5.2253e-18;
b = 0;
c = a - b;


Dann hat c bei mir den gleichen Wert wie a.

Ich würde noch mal um ein konkretes Beispiel bitten. Wenn man von etwas 0 abzieht und etwas anderes herauskommt, fände ich das in der Tat beunruhigend. Sollte b allerdings eine fehlerbehaftete 0 (z.B. sin(pi)) sein, dann ist das ganze schon weniger erstaunlich.

Ein grundsätzliches Problem könnte auch Auslöschung sein, die bei Subtraktion zweier sehr nah beieinanderliegender Zahlen entsteht (klassisches Beispiel: Differenzenquotienten). Das ist aber kein MATLAB-spezifisches Problem, sondern eines, das bei numerischen Berechnungen grundsätzlich auftritt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
nemax
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 13.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2009, 10:34     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo Nemax,

ich habe versucht, das erste Problem nachzuvollziehen, und es ist mir leider (oder besser gesagt: zu meiner Beruhigung) nicht gelungen.

Code:
a = 5.2253e-18;
b = 0;
c = a - b;


Dann hat c bei mir den gleichen Wert wie a.

Ich würde noch mal um ein konkretes Beispiel bitten. Wenn man von etwas 0 abzieht und etwas anderes herauskommt, fände ich das in der Tat beunruhigend. Sollte b allerdings eine fehlerbehaftete 0 (z.B. sin(pi)) sein, dann ist das ganze schon weniger erstaunlich.

Ein grundsätzliches Problem könnte auch Auslöschung sein, die bei Subtraktion zweier sehr nah beieinanderliegender Zahlen entsteht (klassisches Beispiel: Differenzenquotienten). Das ist aber kein MATLAB-spezifisches Problem, sondern eines, das bei numerischen Berechnungen grundsätzlich auftritt.

Grüße,
Harald


Danke Harald,

ich habe den Code

a = 5.2253e-18;
b = 0;
c = a - b;

gesondert eingegeben, ich siehe da. Das Ergebnis stimmt, wie es sein sollte. Wenn ich also das Ganze noch mals revidiere, dann kommen ich zum Schluß, dass es an meinem Code liegen muss.

Es sei denn, mein Matlab spinnt. Die "R2008a 7.6.0" Version weist doch keine Bugs auf ? Ich erkündige mich, nur um sicher zu sein. Confused
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.