|
MarcelF6 |
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.03.2012, 20:26
Titel: Lineare Interpolation
|
|
Guten Abend miteinander
Ich mache die (stückweise) lineare Interpolation und möchte dann gerne den maximalen Fehler im Vergleich zur Originalfunktion messen.
Allerdings gibt es dort einen Fehler (siehe "Fehler").
Meine Idee ist, dass man den Abstand nur bei den Stützstellen messen muss, da dort der Abstand jeweils am grössten sein müsste (oder?).
Da ich zum Einen nicht sicher bin, ob diese Vermutung korrekt ist und zum Anderen auch nicht auf einen funktionierenden Code kam, stelle ich die Frage hier.
MfG, Marcel
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 10.03.2012, 22:17
Titel:
|
|
Hallo,
Zitat: |
Meine Idee ist, dass man den Abstand nur bei den Stützstellen messen muss, da dort der Abstand jeweils am grössten sein müsste |
Im Gegenteil, an den Stützstellen ist der Fehler 0. Den maximalen Fehler zu bestimmen ist schwierig, da man dazu gewisse Annahmen über die Kurve treffen muss. Ansonsten könnte es ja sein, dass der Kurve irgendwo zwischendrin "abhaut".
In deinem Fall ist die Funktion als Formel gegeben, du könntest also das Maximum finden, indem du die Ableitung 0 setzt.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.03.2012, 22:57
Titel:
|
|
Ok, du hast Recht.
Die Ableitung ist 0 genau dann wenn x=0 ist.
Heisst das, dass dort der maximale Fehler liegt?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 10.03.2012, 23:08
Titel:
|
|
Hallo,
du solltest nicht die Ableitung der Funktion nehmen, sondern des Fehlerfunktional. Das muss auf jeden Interpolationsintervall gemacht werden. Dann bekommst du den maximalen Fehler auf jeden Interpolationsintervall, und damit auch den maximalen Fehler insgesamt.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.03.2012, 23:29
Titel:
|
|
oke..ist also eher etwas, das man von Hand machen sollte, oder?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.03.2012, 09:54
Titel:
|
|
Hallo,
nicht unbedingt; die Symbolic Math Toolbox kann da auch helfen.
Der Vorschlag etwas detaillierter:
- Ableitung von f berechnen
- Ableitung des Fehlers ist f' - m(i)
- Diesen Ausdruck 0 setzen
- Nach x auflösen (spätestens das kannst du wieder mit MATLAB machen). Die Lösung zwischen x(i) und x(i+1) ist die Stelle mit dem (betragsmäßig) größten Fehler. Falls es in einem Intervall mehrere solcher Stellen geben sollte, such dir die mit dem größten Fehler.
- Bilde das Maximum über alle Intervalle.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.03.2012, 14:33
Titel:
|
|
Hallo,
also bis zum Punkt "Ausdruck 0 setzen" ist alles ok, siehe:¨
Wie aber kann ich das GLS 0 setzen und dann nach x auflösen lassen? Ich habs mal mit fsolve versucht, allerdings war dies immer fehlerhaft.
Zum letzten Punkt: Dies lässt sich wieder mit max() erreichen, oder?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.03.2012, 14:57
Titel:
|
|
Hallo,
was ist df bei dir?
Inwiefern war die Lösung mit fsolve fehlerhaft?
Poste bitte den relevanten Code.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.03.2012, 15:10
Titel:
|
|
df ist einfach die Ableitung von f (von "Hand" definiert).
Ich habe:
Aber erhalte momentan die Fehlermeldung:
Zitat: |
Undefined function 'minus' for input arguments of type 'function_handle'.
Error in LinInterpol2 (line 44)
AblFehler = df-m(i); |
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.03.2012, 16:37
Titel:
|
|
Hallo,
Zitat: |
df ist einfach die Ableitung von f (von "Hand" definiert). |
Auch dazu gibts mehrere Möglichkeiten. Bitte poste doch bei sowas den Code anstatt zu versuchen, das zu beschreiben.
Anscheinend hast du df als Function Handle definiert. Dann würde ich es so machen:
In der nächsten Zeile solltest du einen Wert im Interval [x(i), x(i+1)] als Startwert nehmen, z.B. den Mittelpunkt des Intervalls.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.03.2012, 17:01
Titel:
|
|
Ok, ich habe nun sowas hier:
aber: ich bekomm nun (unerwartet) den Fehler:
Zitat: |
Error using plot
Vectors must be the same lengths.
Error in LinInterpol2 (line 37)
plot(x,y,'-rs'); hold on; |
Was tun? Ich denke, dass der max_error nicht korrekt ist - aber das Problem muss woanders liegen, denn auch ohne den max_error erscheint derselbe Fehler.
Der Code lautet soweit:
Zuletzt bearbeitet von MarcelF6 am 11.03.2012, 17:50, insgesamt einmal bearbeitet
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.03.2012, 17:27
Titel:
|
|
Hallo,
nutze doch für sowas den Debugger.
Das Problem wird sein, dass du in der letzten for-Schleife x nochmal neu- bzw. überschreibst.
Zudem ist die Sache mit dem maximalen Fehler so nicht sinnvoll.
Du könntest z.B. in der Schleife mit error(i) arbeiten, und nach der Schleife das Maximum über den Vektor error berechnen. Im übrigen würde ich die Variable anders benennen, da es auch eine Funktion error gibt.
Grüße,
Harald
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.03.2012, 18:18
Titel:
|
|
Leider scheint es nicht so einfach zu funktionieren:
Zitat: |
Nonscalar arrays of function handles are not allowed; use cell arrays instead
Error in LinInterpol2 (line 45)
fehler(i)= @(x) fsolve(AblFehler, d/2); |
|
|
|
MarcelF6 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 18.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.03.2012, 19:20
Titel:
|
|
Übrigens: wie würde man das implementieren, wenn man den Aufwand (also die Anzahl Stützstellen) messen will, um in der Maximumsnorm eine gewisse Genauigkeit zu erreichen?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.03.2012, 21:25
Titel:
|
|
Hallo,
schau dir bitte mal die Doku zu fsolve an. Die Verwendung von Function Handles ist in der Form unsinnig. Stattdessen
Der Startwert sollte von i abhängen. Achtung: du bekommst den x-Wert, an dem der max. Fehler vorliegt, du musst also noch den Fehler an dieser Stelle auswerten.
Zu der weiteren Frage: verschiedene Anzahlen von Stützstellen durchtesten und sehen, was ausreichend ist.
Ich würde im übrigen eine systematische Einarbeitung in MATLAB empfehlen, anstatt sich hier von Problem zu Problem zu hangeln...
Grüße,
Harald
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|