vielleicht habe ich die Mathematik einfach nicht verstanden.
Wenn ich eine (eigentlich unbekannte) Funktion habe (bspw.
sin
(x) ) aber einige Stützstellen kenne, dann kann ich aus diesen Stützstellen mit
spline
wunderbar inter- und sogar recht gut extrapolieren. Werden beide Grafen übereinandergelegt, so passt das sehr gut.
Nun benötige ich für einen ganz anderen Anwendungsfall eine Interpolation mit "eingespannten Enden". Das heißt, ich kenne im ersten und letzten Punkt der Wertetabelle die Ableitung (numerisch) dieser Funktion.
In der Matlab-Hilfe ist für diesen Fall ein schönes Beispiel gegeben. Wenn ich das auf mein Problem (
sin
(x) ) übertrage, scheint das aber nicht zu funktionieren.
x = 0:0.1:pi; % zur Darstellung der "unbekannten" Funktion
y = sin(x); % zur Darstellung der "unbekannten" Funktion
xA = x(18); xE = x(19); % Stützpunkte für die Berechnung der 1.Ableitung
yA = y(18); yE = y(19); % Stützpunkte für die Berechnung der 1.Ableitung
ma = (yE-yA) / (xE-xA); % Anstieg
na = [xE yE]; % Schnitt mit der y-Achse
fmn = ma * (x(end)-xE) + na(2); % Berechnung des Endpunktes für die Darstllung
xSpl = xA:0.17:pi; % Vorgabe für die Spline Berechnung
ySpl = spline(x(1:find(x==xA)),y(1:find(y==yA)),xSpl); % Berechnung der % Extrapolation, für die Funktion spline sind nur die Punkte bis zur % 1.Ableitung bekannt.
xSplcs = xA:0.05:2.25; % Extrapolationspunkte für die eingespannten Enden
cs = spline(x(1:find(x==xA)), [1 y(1:find(y==yA)) ma]);
ySplcs = ppval(cs,xSplcs);
%% figures figure(1) plot(x,y,'. - blue');
hold on
plot([xA xE],[yA yE],'o blue');
plot([na(1);x(end)],[na(2);fmn],'x - green');
plot(xSpl,ySpl,'v -- red');
plot(xSplcs,ySplcs,'x : magenta');
hold off
legend('sin(x)','Stützpunkte','f\prime(x)=cos(x)','spline Interpol','spline mit f\prime(x)','Location','best');
axis equal
Der Code ist (für mich) bis zu den "eingespannten Enden" plausibel. Nun meine Fragen:
1) Kann man mit
ppval
in Kombiation mit
spline
gar nicht extrapolieren?
2) Ist 1) sozusagen mathematischer Unsinn?
3) Mache ich einen entscheidenden Code-Fehler?
Bitte erkläre noch, warum Du meinst, dass es nicht zu funktionieren scheint.
Wenn Du das leidige und fiese
clearall
weglässt, kannst Du übrigens den Debugger verwenden. Alle Breakpoints und Debugger-einstellungen zu löschen ist eine extrem unpraktische Idee!
ich war der Meinung, wenn ich die Enden einspanne und an dem einen (rechten) Ende die Ableitung (siehe grüne Gerade) nehme, sich der extrapolierte spline ungefähr daran entlang bewegen müsste.
Tatsächlich ist dies eben nicht der Fall. Vielmehr wandert der spline noch innerhalb der letzten (bekannten) Stützstellen davon. Das ist mir suspekt.
Begründung: Wenn ich bei einer Messwertreihe, die durch eine Funktion ausgedrückt werden kann, weiß, dass sie ein asymptotisches Verhalten hat, dann möchte ich das auch gern so abbilden können.
Ist die
spline
-Funktion vielleicht die Falsche? Wie gesagt, es kann auch an meinem Verständnis für den mathematischen Zusammenhang liegen...
Das ist ein ziemlich großer Fehler bei der Berechnung der ersten Ableitung. Wie wäre dies:
Code:
xA = x(18); xE = x(18)+0.001; % Stützpunkte für die Berechnung der 1.Ableitung
yA = y(18); yE = sin(xE); % Stützpunkte für die Berechnung der 1.Ableitung
entschuldige, dass ich am WE nicht geantwortet habe - wir haben versucht am Wasser ein wenig Abkühlung zu finden
Du hast völlig Recht, dass die numerische 1.Ableitung genauer wird, je dichter man die Punkte aneinander legt. Nur löst das mein Problem noch nicht.
Bisher hatte ich diese spline-Funktion so verstanden, dass bei eingespannten Enden alle extrapolierten Punkte auf der Geraden (1.Ableitung/Tangente/lineare Funktion) liegen sollten. Oder zumindest sehr nah dran.
Und genau das versuche ich in der Grafik zu verdeutlichen. Zur Erklärung:
Blau: ist die Funktion, die ich als Grundmuster für meine "Messwerte" zu Grunde gelegt habe. Dabei hören die Messwerte mit den beiden blauen Kreisen, auch als "Stützpunkte" bezeichnet, auf. (von links aus gesehen) Der Funktionsverlauf ist nur deshalb weitergezeichnet um die spline-Funktion zu (über)prüfen.
Rot: ist das Ergebis der spline-Funktion, die nur die Messwerte bis einschlielich der blauen Kreise kennt. Man sieht schön, dass die spline-Funktion im Nahbereich eine gute Approximation an die tatsächliche Funktion erreichen kann.
Grün: ist die numerisch berechnete 1.Ableitung zwischen den letzten beiden bekannten Messwerten. (daher eine Gerade/Tangente)
Magenta: ist das Ergebnis der spline-Funktion mit den eingespannten Enden.
Nun war ich wie schon gesagt davon ausgegangen, dass Magenta sich eher an der grünen Gerade orientieren sollte.
Aber vielleicht ist das ein Trugschluß? Kann mir da ggf. jemand mathematisch weiterhelfen? Ich möchte gern verstehen warum das so ist bzw. wo ich einen Denkfehler mache.
entschuldige, dass ich am WE nicht geantwortet habe - wir haben versucht am Wasser ein wenig Abkühlung zu finden :wink:
Aber bitte! Es ist ja Dein Problem und wenn es über das Wochenende Zeit hat, ist das doch schön! Also kein Grund sich zu entschuldigen. :-)
Zitat:
Bisher hatte ich diese spline-Funktion so verstanden, dass bei eingespannten Enden alle extrapolierten Punkte auf der Geraden (1.Ableitung/Tangente/lineare Funktion) liegen sollten. Oder zumindest sehr nah dran.
Weshalb sollte das so sein? Der Spline erzeugt ja Stückchenweise Polynome vom Grad 3. mit stetigen Ableitungen zwischen den Stücken. Bei der Extrapolation werden die äußeren Polynome verlängert und da sie die Ordnung 3 haben sind sie im Allgemeinen nicht gerade, sondern sie können außerhalb eine Krümmung haben und sogar einen Wende-Punkt.
Bisher hatte ich diese spline-Funktion so verstanden, dass bei eingespannten Enden alle extrapolierten Punkte auf der Geraden (1.Ableitung/Tangente/lineare Funktion) liegen sollten. Oder zumindest sehr nah dran.
Weshalb sollte das so sein?
Naja, wenn ich schon eingespannte Enden vorgebe, dann sollte sich doch die Funktion daran orientieren. Was machen denn sonst diese Vorgaben für einen Sinn? Bisher war ich der (wahrscheinlich irrigen) Meinung, dass ich der spline-Funktion auf diesem Weg "mitteilen" kann, dass mir der weitere Verlauf der gesuchten/interpolierten Funktion außerhalb der Messwerte durchaus bekannt ist (Vorgabe einer Asymptote).
Wenn das mit der spline-Funktion so nicht funktioniert, gibt es da "was anderes" im Matlab, das mir eine gute interpolation und gleichzeitig eine Extrapolation entlang einer Asymptote liefert? Denn genau das möchte ich ja. Ich weiß wie meine Funktion "zum Ende hin" aussehen muss (Asymptote) und die Interpolation mit der spline-Funktion habe ich hinreichend geprüft. Die passt hervorragend. Nur manchmal muss ich ein kleines Stück in die Asymptote rein - und da passt es eben nicht mehr. Das ist ärgerlich.
Wenn Du eine Funktion suchst, die mit Geraden extrapoliert, benötigst Du eine lineare Interpolation. Diese erzeugt auch bei der Interpolation keine Überschwinger, im Gegensatz zur Spline-Interpolation.
Möchtest Du dies für eine wissenschaftliche Auswertung einsetzen? In dem Fall würde ich Dir dringend raten, Dich tiefer mit dem Thema auseinanderzusetzen. Einfach mal eben irgendeine Inter/Extra-Polation zu verwenden, wird nicht zu zuverlässigen Ergebnissen führen.
Du hast völlig Recht. Mit Sicherheit sollte ich da tiefer einsteigen - und deswegen war ja auch immer wieder mein Hinweis auf "mathematisches Unvermögen" dabei.
Da jedoch dieser kubische Spline zur Interpolation wie die Faust auf's Auge passt (das kann ich analytisch nachweisen), habe ich mir was Anderes einfallen lassen. Der Messbereich ist einfach erweitert wurden, so dass es keine Extrapolationen mehr gibt und alles fein passt.
Vielen Dank für Deine Zeit!
Thomas.
DerBrain87
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.10.2015, 13:56
Titel:
Der Post ist zwar nicht mehr ganz up2date aber da ich den Code sehr gut gebrauchen konnte - danke an dieser Stelle - Hier eine kleine erklärung, was es mit dem einspannen auf sich hat.
Wenn du Bei der Interpolation die Enden einspannst, sagst du lediglich, dass die Ableitung der Kurve am Anfangs- und Endpunkt in diese Richtung zeigt. Vor und nach dem Anfangs bzw. Endpunkt hast du keinen Zusammenhang mehr zwischen Ableitung der Splinefunktion und der von dir gewünschten Tangente. Du kannst jedoch, wenn du dieses "Tangentenverhalten" vor und nach der Interpolation haben möchtest dein Ergebnis einfach durch Stückeln der interpolationskurven erhalten.
Gruß DerBrain87
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
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.