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

Vorhandenes Element in Zeilenvektor nicht ansprechbar

 

HaKa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.03.2013, 21:53     Titel: Vorhandenes Element in Zeilenvektor nicht ansprechbar
  Antworten mit Zitat      
Hallo zusammen,

ich wende mich an euch mit einem Matlab-Problem, dessen Ursache ich zur Zeit nur auf einen Programmfehler zurückführen kann. Ich hoffe, ihr könnt diese Annahme wiederlegen.

Hintergrund: Ich habe eine Funktion f(x) die ich in einem gegebenen Intervall x (Bspw.: x=1:0.01:5) plotte und deren Ableitung ich schrittweise auswerten will.
x-Werte sind in der Variable x gespeichert, Funktionswerte in der Variable y. Um den Funktionswert an einer bestimmten Stelle auszuwerten benutze ich den logischen Ausdruck y(x==entsprechender x-Wert). Bei bestimmten Stellen bekomme ich jedoch nur einen leeren Rückgabewert u.a. immer bei dem Wert 2.28. Der folgende Screenshot verdeutlicht das Problem:



Das Problem tritt in der Matlab Version 2010a auf und wurde auf 3 unterschiedlichen Rechnern festgestellt.
Hat jemand von euch eine Erklärung für diesen Sachverhalt?

Beste Grüße


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2013, 23:03     Titel:
  Antworten mit Zitat      
Hallo,

aufgrund minimaler Rundungsfehler gibt es eben kein Element in dem Vektor, das haargenau 2.28 ist. Du musst dazu bedenken, dass Computer nicht im Dezimal, sondern im Binärsystem arbeiten und dass Zahlen wie 2.28 dort ohnehin nicht exakt dargestellt werden können.
Code:


Alternative wäre: suche nach dem Wert, der 2.28 am nächsten liegt:
Code:
[~, idx] = min(abs(x-2.28));
x(idx)


Weitere Klassiker in dieser Hinsicht:
Code:
0.1 + 0.1 + 0.1 == 0.3
sin(pi) == 0


Andere Programmiersprachen haben übrigens dasselbe Problem.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2013, 20:08     Titel:
  Antworten mit Zitat      
Vielen Dank für deinen Hinweis und deinen Lösungsvorschlag, Harald!
Das Auftreten von Rundungsfehlern bei Wechsel zwischen Binär- und Dezimalsystem ist mir bekannt, nur hätte ich nicht erwartet, dass es es auch bei einem so auf Mathematik foussiertem Programm bzw. Sprache so durchschlägt.
Kann ich das von dir beschriebene Workaround den als gängiges Verfahren bei der Untersuchung von Funktionen ansehen oder gibt es da noch bessere Möglichkeiten, vllt sogar vom Ansatz her?

Beste Grüße
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 24.03.2013, 20:34     Titel:
  Antworten mit Zitat      
Hallo,

ansonsten hilft in auch dieser "Trick":

Code:
x = 2:0.01:3;
x(x==2.28)
x = round(x*100)/100;
x(x==2.28)
 

Dann kannst Du den Rest so lassen und eben mit der gewünschten Genauigkeit mit deinen x-Werten arbeiten.
Ob Dir das besser gefällt weiß ich aber auch nicht.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.03.2013, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
nur hätte ich nicht erwartet, dass es es auch bei einem so auf Mathematik foussiertem Programm bzw. Sprache so durchschlägt.

Das wird es bei jeder numerischen Sprache. Wenn du exakte Ergebnisse willst, musst du symbolisch rechnen. Die Möglichkeit dazu bietet aus MATLAB heraus die Symbolic Math Toolbox.
Code:
x = sym(2:0.01:3);
x(x == 2.28)


Zitat:
Kann ich das von dir beschriebene Workaround den als gängiges Verfahren bei der Untersuchung von Funktionen ansehen

Das würde ich so sehen, ja. Allerdings nicht nur bei über eine Formel gegebenen Funktionen, sondern vor allem auch bei Messdaten.

In Fällen wie deinem sehe ich noch die Möglichkeit, den Index tatsächlich zu errechnen:
Code:
idx = round((2.28 - 2)*100 + 1)

Was in der tatsächlichen Anwendung am besten weiterhilft, musst du entscheiden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2013, 23:03     Titel:
  Antworten mit Zitat      
Vielen Dank für die ausführliche Hilfe, Harald! Smile

Beste Grüße
 
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.