|
|
Kubische Spline Interpolation |
|
JayS001 |

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 01.03.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 03.03.2010, 15:05
Titel: Kubische Spline Interpolation
|
 |
Hallo,
hab wieder eine neues Problem.
Ich versuche Punkte aus zwei Arrays (x und y) durch einen Spline zu verbinden. Dies möchte ich aber nicht durch die Matlab Funktion spline machen, sondern manuell. Das hat den Grund, das ich das Programm in VB übertragen möchte und es da, soweit ich weiß, keine Spline Funktionen gibt. Zudem brauche ich die Ableitung der einzelnen Punkte des Splines.
Hat jemand sowas schonmal gemacht oder Ahnung wie es geht?
Gibt es eine Möglichkeit, an die Ableitungen der Spline Funktion von Matlab zu gelangen?
Hab schon versucht die Spline Funktion zu programmieren, bin aber noch nicht wirklich weiter gekommen.
Gruß
Jens
|
|
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 03.03.2010, 17:47
Titel:
|
 |
mit der spline Funktion wird ein stückweises Polynom erzeugt. Die Koeffizienten dieses Polynoms stehen in pp.coefs. Du kannst also ganz einfach das stückweise polynom ableiten,indem du alle teilstücken ableitest (mit polyder). Oder ganz einfach ppdiff (file exchange) verwenden.
|
|
|
JayS001 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 01.03.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.03.2010, 16:14
Titel:
|
 |
|
 |
|
Danke!
Leider funktioniert es mit polyder nicht wirklich gut.
Hab hier im Forum aber was anderes gefunden, was ich aber nicht genau verstehe. Habe jetzt folgendes Programmiert:
pp=spline([0 600 1200 1491 3091 3934 4534 5534 6434 7154],[0 [0 0 0 0 800 800 400 200 100 40] 0]);
xx=linspace(x(1),x(n),splinepoints);
erg=ppval(pp,xx);
plot(xx,erg,'k');
hold on
[breaks,coefs,l,k,d] = unmkpp(pp);
dpp = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
plot(xx,ppval(dpp,xx),'b-');
hold on;
[breaks,coefs,l,k,d] = unmkpp(dpp);
dpp2 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
plot(xx,ppval(dpp2,xx),'r-');
Mir scheinen die Skallierung der Ableitungen aber nicht zu passen. Wenn der Weg Schwarz dargestellt ist, kommt mir die Ableitung zur Geschwindigkeit und der Beschleunigung zu gering vor. Wenn ich es nachrechne, passt es auch nicht, außer ich hab mich verrechnet
Wird bei dieser Art der Ableitung runterskalliert oder muss ich noch was anderes beachten?
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.03.2010, 11:18
Titel:
|
 |
versuch mal die Funktion:
sollte aber auch so alles richtig sein.
mit dieser Zeile wird die Ableitung berechent:
repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1)
|
|
|
JayS001 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 01.03.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2010, 09:45
Titel:
|
 |
Ja, danke!
Leider scheint es mit der Skallierung immer noch nicht zu Passen. Hab jetzt folgendes probiert:
%-----------------Ableitungen--------------------------------------
[breaks,coefs,l,k,d] = unmkpp(pp);
pp2 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_beschleunigung=linspace(x(1),x(n),splinepoints-2);
y_beschleunigung=polyder(ppval(pp2,linspace(x(1),x(n),splinepoints)));
%plot(linspace(x(1),x(n),splinepoints-2),y_beschleunigung);
[breaks,coefs,l,k,d] = unmkpp(pp2);
pp3 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_ruck=linspace(x(1),x(n),splinepoints-1);
y_ruck=polyder(ppval(pp3,linspace(x(1),x(n),splinepoints)));
%plot(linspace(x(1),x(n),splinepoints-1),y_ruck);
Die Beschleunigung sieht jetzt besser aus, der Ruck hat sich aber nicht verändert. Noch irgendeine Idee?
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2010, 10:56
Titel:
|
 |
poste doch mal ein lauffähiges Minimalbeispiel, bei dem dein Problem auftritt. Dann kann man den Fehler bestimmt besser finden. Diese Zeile versteh ich außerdem nicht richtig:
y_beschleunigung=polyder(ppval(pp2,linspace(x(1),x(n),splinepoints)));
was willst du damit berechnen?
|
|
|
JayS001 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 01.03.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2010, 14:10
Titel:
|
 |
Hier das Minibeispiel:
pp=spline([0 600 1200 1491 3091 3934 4534 5534 6434 7154],[0 [0 0 0 0 800 800 400 200 100 40] 0]);
xx=linspace(x(1),x(n),splinepoints);
erg=ppval(pp,xx);
plot(xx,erg,'k');
hold on
[breaks,coefs,l,k,d] = unmkpp(pp);
pp2 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_beschleunigung=linspace(x(1),x(n),splinepoints-2);
y_beschleunigung=polyder(ppval(pp2,linspace(x(1),x(n),splinepoints)));
plot(linspace(x(1),x(n),splinepoints-2),y_beschleunigung);
[breaks,coefs,l,k,d] = unmkpp(pp2);
pp3 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_ruck=linspace(x(1),x(n),splinepoints-1);
y_ruck=polyder(ppval(pp3,linspace(x(1),x(n),splinepoints)));
plot(linspace(x(1),x(n),splinepoints-1),y_ruck);
In der Zeile leite ich nochmal ab, wie es genau funktioniert, kann ich aber auch nicht sagen. Hab mir das irgendwie zusammengebastelt und es sieht, bis auf den Ruck, ganz gut aus.
|
|
|
JayS001 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 01.03.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.03.2010, 09:22
Titel:
|
 |
|
 |
|
Hallo,
hab eben Festgestellt, dass das Minibeispiel was ich letztens gepostet habe, garnicht funktionsfähig war. Hat bei mir nur funktioniert weil schon Variablen vordefiniert waren.
Hier auf jedenfall die lauffähige Version, die Ableitungen stimmen aber immer noch nicht.
x=[0 600 1000 1381 1887 3087 4265 5367 6267 6987 ; 40 100 100 200 200 800 700 349 400 40];
pp=spline(x(1, ,x(2, );
xx=linspace(x(1,1),x(1,10),2000);
erg=ppval(pp,xx);
plot(xx,erg,'k');
hold on
[breaks,coefs,l,k,d] = unmkpp(pp);
pp2 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_beschleunigung=linspace(x(1,1),x(1,10),2000-2);
y_beschleunigung=polyder(ppval(pp2,linspace(x(1,1),x(1,10),2000)));
plot(linspace(x(1,1),x(1,10),2000-1),y_beschleunigung,'r');
[breaks,coefs,l,k,d] = unmkpp(pp2);
pp3 = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d);
x_ruck=linspace(x(1,1),x(1,10),2000-1);
y_ruck=polyder(ppval(pp3,linspace(x(1,1),x(1,10),2000)));
plot(linspace(x(1,1),x(1,10),2000-1),y_ruck,'g');
hold off
Wodurch der Smiley kommt, wisst ihr ja alle
|
|
|
|
|
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 - 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.
|
|