Messwerte mit Splines glätten?
-
Noch ne Frage. Muss man bei Splines immer zwingend ein ganzes Array auf einmal berechnen. Geht es nicht, dass man sich 4 Punkte sucht die um den zu interpoliernde Stelle rum liegen und dann mit einer Rechnung auswertet. Weil komischerweise funktioniert meine Lösung mit nem vorberechneten Array und die ohne nicht.
-
Wenn es die Messwerte sind macht es überhaupt keinen Sinn mit Splines zu interpolieren weil sie
1. rauschen
2. willkürlich sind
3. keiner math. Formel unterliegenEs gibt aber Möglichkeiten zu interpolieren. Dein Papi muss es dir aber sagen.
-
Ich will eben nicht genau interpolieren, das wäre ja kein Problem mit dem Newton-Verfahren. Die Werte bei einer Polynominterpolation weichen zu stark ab, deswegen möchte ich Splines verwenden.
-
MaSTaH schrieb:
Noch ne Frage. Muss man bei Splines immer zwingend ein ganzes Array auf einmal berechnen. Geht es nicht, dass man sich 4 Punkte sucht die um den zu interpoliernde Stelle rum liegen und dann mit einer Rechnung auswertet. Weil komischerweise funktioniert meine Lösung mit nem vorberechneten Array und die ohne nicht.
Klar geht das, die Lösung die in dem Mathematica File enthalten ist, ist eine analytische Lösung, d.h. durch Einsetzen Deiner X-Werte und ihren zugehörigen Funktionswerten erhälts Du jeweils abschnittsweise ein kubisches Polynom. Bei vier Stützstellen erhält's Du also drei kubische Polynome, natürlich können es auch nur drei Stützstellen sein, dann haste aber nur zwei Polynome. Ich an Deiner Stelle würde die analytische Lösung innerhalb Deiner Klasse verwenden, einsetzen ist dadurch sehr simpel und der Ablauf dürfte auch einigermaßen flott sein.
Wenn es die Messwerte sind macht es überhaupt keinen Sinn mit Splines zu interpolieren weil sie
1. rauschen
2. willkürlich sind
3. keiner math. Formel unterliegenRauschen wird jede Art von Interpolation, die Willkürlichkeit liegt im Rauschen begründet und einer math. Formel unterliegt keiner Interpolation, sondern einer math. Methode ! Interpolationsverfahren, wie Newton, Lagrange steigen rapide im Aufwand je mehr Stützstellen involviert werden. Splines hingegen beruhen auf der Lösung von Gleichungssystemen, die auf nicht vollständig besetzten Matrizen basieren. Dort explodiert der Aufwand nicht gleich.
-
aaaa3 schrieb:
Für Dein Problem sind Splines wahrscheinlich zu kompliziert. In Deinem Fall würde ich mal nach "Approximation" bzw. "Methode der kleinsten Quadrate" googeln.
Ups, hab deinen Eintrag gestern überlesen. Sorry .
Ich habe jetzt einen Quellcode zusammengebastelt der ganz gute Resultate bringt. Wenn die Werte nicht zu weit auseinander liegen schneidet die Kurve die Punkte und ansonsten gibt sie eine gute Approximation...
Danke euch allen.
-
man sollte auch versuchen nicht nur potenzen von X im polynom zu verwenden manchmal hat man mit a(1)*x+...+a(n)*cos(x)+a(n+1)*sin(x) bessere erfolge
-
Also, ich wollte noch mal sagen, dass Polynome zum Interpolieren meistens scheiße sind. Kubische Splines sind super.
@MastaH: Auf meiner Homepage findest du auch einen kleinen Artikel über kubische Splines.
-
sind kubische spines nicht nur lokale Aproximationen mit polynomen 3.grades?
das Problem mit Polynomen ist eigentlich, dass ein (Rundungs/Rechen)Fehler in den Koeffizienten vor x^25 stärkere wirkung hat als ein Fehler im Linerarglied.
Dies ist ein drung warum man nicht zwischen 2 Punkten mit y=a(1)*x^200+a(0)*x approximiert.
-
nicht kubisch, funzt trotzdem:
double interpol (double p0, double p1, double p2, double p3, double p4, double p5, double x) { return p2 + 0.04166666666*x*((p3-p1)*16.0+(p0-p4)*2.0 + x *((p3+p1)*16.0-p0-p2*30.0- p4 + x *(p3*66.0-p2*70.0-p4*33.0+p1*39.0+ p5*7.0- p0*9.0 + x *( p2*126.0-p3*124.0+p4*61.0-p1*64.0- p5*12.0+p0*13.0 + x *((p3-p2)*50.0+(p1-p4)*25.0+(p5-p0)*5.0))))); }
-
WebFritzi schrieb:
Also, ich wollte noch mal sagen, dass Polynome zum Interpolieren meistens scheiße sind. Kubische Splines sind super.
Woow, wir sind einer Meinung ^^
-
Für denkfaule:
double hermite (double y0, double y1, double y2, double y3, double x) { return (((1.5f * (y1 - y2) + 0.5f * (y3 - y0)) * x + (y0 - 2.5f * y1 + 2.f * y2 - 0.5f * y3)) * x + 0.5f * (y2 - y0)) * x + y1; }