Technische Universität München SoSe 20 Institut für Informatik Prof Dr Thomas Huckle Dipl-Inf Christoph Riesinger Dipl-Math Jürgen Bräckle Numerisches Programmieren, Übungen Musterlösung 6 Übungsblatt: Stückweise Interpolation ) Hermite-Interpolation i) Mit den Interpolationsbedingungen () p(x 0 ) = y 0, p(x ) = y, p (x 0 ) = y 0, p (x ) = y sowie dem allgemeinen Ansatz für kubische Polynome bzw dessen Ableitung p(t) = a 0 + a t + a 2 t 2 + a t, t [0; ] = [x 0 ; x ] p (t) = a t + 2a 2 t + a t 2, t [0; ] = [x 0 ; x ] ergibt sich das folgende lineare Gleichungssystem: p(t = 0) = a 0! = y 0 p(t = ) = a 0 + a + a 2 + a! = y p (t = 0) = a! = y 0 + 2a 2 + a p (t = ) = a! = y Nach etwas Umsortieren erhalten wir in Matrix-Vektor-Notation a y 2 0 a 2 0 0 0 a = y y 0 0 0 0 a 0 y 0 und Umformen auf Zeilenstufenform liefert y 0 2 y + y 0 0 0 y 0 0 0 0 y 0
Mit Rückwärtssubstitution ergibt sich somit als Lösung a 0 = y 0 a = y 0 a 2 = y + y 2y 0 y 0 a = y ( y + y 2y 0 y 0 ) y 0 y 0 = 2y 0 + y 0 2y + y Damit erhalten wir das kubische Polynom p(t) = y 0 + y 0t + ( y + y 2y 0 y 0 )t 2 + (2y 0 + y 0 2y + y )t bzw sortiert nach y 0, y, y 0 und y : p(t) = y 0 ( t 2 + 2t ) + y (t 2 2t ) + y 0 (t 2t 2 + t ) + y ( t 2 + t ) Mittels Koeffizientenvergleich bzgl den Variablen y 0, y, y 0 und y erhalten wir schließlich die kubischen Basispolynome H i, i = 0,, 2,, des Hermite-Ansatzes Sie ergeben sich zu p(t) = y 0 H 0 (t) + y H (t) + y 0 H 2 (t) + y H (t) H 0 (t) = t 2 + 2t H (t) = t 2 2t H 2 (t) = t 2t 2 + t H (t) = t 2 + t ii) Die 4 Bedingungen für das Teilintervall [x i, x i+ ] lauten p(x i ) = y i, p(x i+ ) = y i+ p (x i ) = y i, p (x i+ ) = y i+ Um in [x i, x i+ ] die Basispolynome H 0 (t) bis H (t), t [0; ], nützen zu können, müssen wir unsere Variable x vorher noch mit der Funktion t i (x) auf das Intervall [0; ] transformieren Das erreichen wir mit x x i t i (x) := = x x i [0; ] x i+ x i h i Damit ist die meiste Arbeit getan, es muss lediglich noch ein Detail beachtet werden: Wenn wir die transformierte Funktion ableiten, müssen wir die Kettenregel berücksichtigen Das gibt einen zusätzlichen Faktor h i, wie man folgendermaßen sieht: d dx (f(t i(x))) = d dt (f(t i(x))) dt dx = d dt (f(t i(x))) = d x i+ x i dt (f(t i(x))) h i Um nun das kubische Teilpolynom p i (t(x)) mit Hilfe des Hermite-Ansatzes festzulegen, müssen wir bei den Summanden mit y i und y i+ einen Faktor h i dazunehmen, weil dort bei der Ableitung ein /h i auftauchen würde, das bei der Interpolation nicht auftauchen darf! Somit erhalten wir für ein Teilintervall [x i, x i+ ]: p i (t i (x)) = y i H 0 (t i (x)) + y i+ H (t i (x)) + h i y i H 2 (t i (x)) + h i y i+ H (t i (x))
In Abb ist beispielhaft das interpolierende Hermite-Polynom zur Funktion sin(x) auf dem Intervall [0; 4π] dargestellt Dieses Bild wurde mit der matlab-routine vishermitesinm erstellt, das auch auf der Webpage unter der Rubrik Tutorium zum Download bereitgestellt ist Für die Benutzung der Datei unter octave muss lediglich der entsprechende plot-bereich ein- bzw auskommentiert werden 08 Hermite Interpolation mit 5 Werten auf [0;4π] f(x) = sin(x) Hermite Polynom Stuetzstellen 06 max error = 02459 04 02 0 02 04 06 08 0 2 4 6 8 0 2 4 Abbildung : Visualisierung eines Hermite-Polynoms als Interpoland von sin(x) auf [0; 4π] 2) Interpolation mit kubischen Splines i) Ziel: Darstellung von s(x) [xi ;x i+ ] mittels stückweiser kubischer Polynome p i (x) (analog zur Aufgabe )) Interpolationsbedingung: s(x i ) = y i, i = 0,, n (n + Bedingungen) C 2 -Stetigkeit: entscheidend nur die Klebestellen x,, x n, dazwischen kann man jedes stückweise kubisches Polynom immer problemlos stetig ableiten: s (x i+ ) = y i+, i = 0,, n 2 (C -Stetigkeit, notwendig für C 2 ) () s (x i+ ) = y i+, i = 0,, n 2 (n Bedingungen) (2) ii) Wir werden sofort in Teilaufgabe iii) sehen, warum wir die zweiten Ableitungen der
Hermite-Basispolynome brauchen Hier berechnen wir sie schnell: H 0 (t) = 6 + 2t = H (t) = 6 2t = H 2 (t) = 4 + 6t = H (t) = 2 + 6t = { 6, für t = 0 6, für t = { 6, für t = 0 6, für t = { 4, für t = 0 2, für t = { 2, für t = 0 4, für t = iii) Wie in Aufgabe ) können wir für die stückweisen kubischen Polynome p i (x) den Hermite- Ansatz machen, auch wenn wir die ersten Ableitungen y i (i =,, n ) aus () noch nicht kennen Wieder benötigen wir die Transformationsfunktion t i (x) = (x x i )/(x i+ x i ) = (x x i )/h, die mit unseren äquidistanten Stützstellen immer dasselbe h benutzt, um unseren x-wert ins Intervall [0; ] zu bekommen: p i (t i (x)) = y i H 0 (t i (x)) + y i+ H (t i (x)) + h y i H 2 (t i (x)) + h y i+ H (t i (x)) () Die Bedingungen (2) erlauben uns nun, die y i (i =,, n ) zu bestimmen, indem wir einfach die zweite Ableitung der Funktionen p i (t(x) = ) und p i+ (t(x) = 0) an den Klebestellen x i+ (i = 0,, n 2) gleichsetzen: p i (t = ) = s (x i+ ) = p i+(t = 0), i = 0,,, n 2 [ yi H h 2 0 () + y i+ H () + h y i H 2 () + h y i+ H () ] = = h 2 [ yi+ H 0 (0) + y i+2 H (0) + h y i+ H 2 (0) + h y i+2 H (0) ] Der Faktor /h 2 kommt vom zweimaligen Ableiten der Basispolynome (Kettenregel mit t i (x), vgl Aufg )) Jetzt sortieren wir das noch kurz nach Summanden mit y auf der linken und y auf der rechten Seite: h h 2 [ y i H 2 () + y i+ (H () H 2 (0)) y i+2 H (0) ] = = h 2 [ y i H 0 () + y i+ ( H () + H 0 (0)) + y i+2 H (0)] Wenn wir jetzt die Werte für H i erhalten wir für i = 0,, n 2: an der Stelle 0 bzw aus Teilaufgabe ii) einsetzen, [ y h i 2 + y i+ (4 ( 4)) y i+2 ( 2) ] = = h 2 [ y i 6 + y i+ ( ( 6) + ( 6)) + y i+2 6] [ y i + 4y i+ + y i+2] = h [y i+2 y i ]
Das ist ein lineares Gleichungssystem der Dimension n (analog zu Ergebnis aus Vorlesung, dort heißen die H i nur α i+ ): 4 y y 2 y 0 h 4 y y 0 2 = y y h y n 2 y n y n 4 y n y n y n 2 h y n Dabei müssen die Randbedingungen y 0 und y n gesetzt werden Eine Möglichkeit ist zb y 0 = 0 = y n oder auch die echte Ableitung der zu interpolierenden Funktion bei x 0, x n 08 Cubic spline through 5 interpolation nodes on [0;4π] with y prime 0 = y prime n = cos(x) function f cubic spline interpolated nodes max error = 08242 06 04 02 0 02 04 06 08 0 2 4 6 8 0 2 4 Abbildung 2: Visualisierung einer kubischen Spline-Funktion als Interpoland von sin(x) auf [0; 4π] für 5 Punkte In Abb 2 ist die kubische Splinefunktion zur Funktion sin(x) auf dem Intervall [0; 4π] dargestellt Man erkennt deutlich den Unterschied zur Hermite-Interpolation (selbe Situation) Allerdings hat das Hermite-Polynom mit Ableitungen an den Zwischenknoten mehr Informationen von der zu interpolierenden Funktion erhalten Splines sind per Konstruktion Funktionen, die möglichst glatt durch die vorgegebenen Interpolationspunkte laufen, da sie die Krümmung der Gesamtfunktion minimieren Starke Oszillationen wie beispielsweise bei der Polynominterpolation hohen Grades können so nicht auftreten Abbildung 2 wurde mit der matlab-routine spline easynm erstellt, das auch auf der Webpage unter der Rubrik Tutorium zum Download bereitgestellt ist Für die Benutzung der Datei unter octave muss lediglich der entsprechende plot-bereich ein- bzw auskommentiert werden
iv) Zum Abschluss bestimmen wir noch explizit eine Spline-Funktion Als Werte sind hierfür gegeben: i 0 2 x i 0 2 y i 2 0 2 y i 9?? 0 Die Spline-Funktion s(x) ist stückweise definiert über s(x) = p i (t i (x)) für x [x i, x i+ ] mit der Transformation auf das Einheitsintervall und den kubischen Funktionen [x i, x i+ ] [0, ], x t i (x) = x x i h i p i (t i (x)) = y i H 0 (t i (x)) + y i+ H (t i (x)) + h y i H 2 (t i (x)) + h y i+ H (t i (x)) Es sind also noch die fehlenden Ableitungen y i zu bestimmen, bevor wir die Funktion vollständig aufstellen können Da die Stützstellen äquidistant sind, können wir das lineare Gleichungssystem aus Teilaufgabe (iii) verwenden, um y und y 2 zu bestimmen Speziell für diesen Fall lautet es ( ) ( ) 4 y h 4 y 2 = ( ) y2 y 0 h h 2 y 0 y y h y Setzen wir h = sowie die y-werte ein, so erhalten wir ( ) ( ) ( 4 y 2 2 4 y 2 = 9 ) 0 0 ( = 9 ) und als Lösung ergibt sich schließlich ( ) y = y 2 ( ) Wir erhalten damit als Spline-Funktion p 0 (t 0 (x)) für x [, 0[ mit t 0 (x) = x + s(x) = p (t (x)) für x [0, [ mit t (x) = x p 2 (t 2 (x)) für x [, 2] mit t 2 (x) = x mit p 0 (t) = 2 H 0 (t) + 9 H 2 (t) H (t) p (t) = 2 H (t) H 2 (t) + H (t) p 2 (t) = 2 H 0 (t) + H (t) + H 2 (t)
5 25 2 5 05 0 05 05 0 05 5 2 Abbildung : Visualisierung der berechneten Spline-Funktion s(x) Zu Splines gäbe es noch viel zu sagen Es sind eine Reihe von Verallgemeinerungen möglich (nicht äquidistant, Kontrollpunkte abseits der Kurve,) Details hierzu werden üblicherweise in Vorlesungen zu CAD diskutiert Eine schöne Eigenschaft der Splines soll nicht unerwähnt bleiben: Eine Veränderung in einem Kontrollpunkt wirkt sich immer nur lokal auf einen kleinen Bereich der Kurve aus, der Großteil der Kurve bleibt unverändert
Wiederholung: Interpolation a) Dreiecksschema: Die Berechnungen im Einzelnen: x i i\k 0 2 0 0 y 0 = 0 y = 2 2 y 2 = 0 [x 0 ] f = sin(0) = 0 [x ] f = sin( π 2 ) = [x 2 ] f = sin(π) = 0 [x 0, x ] f = [x ]f [x 0 ]f x x 0 = 0 0 = [x, x 2 ] f = [x 2]f [x ]f x 2 x = 0 2 = [x 0, x, x 2 ] f = [x, x 2 ]f [x 0, x ]f = x 2 x 0 2 0 Als Interpolant ergibt sich damit: = p(x) = [x 0 ]f + [x 0, x ]f (x x 0 ) + [x 0, x, x 2 ]f (x x 0 ) (x x ) = 0 + (x 0)) + ( )(x 0))(x ) = 0 + (x 0) (x 0)(x ) b) Erweiterung des Dreiecksschemas: = x x(x ) = x(2 x) = 2x x 2 x i i\k 0 2 0 0 y 0 = 0 20 y = 2 20 2 2 y 2 = 0-0 y = 2 Die Berechnungen im Einzelnen: [x ] f = sin( π 6 ) = 2 [x 2, x ] f = [x ]f [x 2 ]f x x 2 = 0 2 2 = 0 [x, x 2, x ] f = [x 2, x ]f [x, x 2 ]f = + 0 x x = 2 20 [x 0, x, x 2, x ] f = [x, x 2, x ]f [x 0, x, x 2 ]f = 2 + 20 x x 0 0 = 20
Als neuer Interpolant ergibt sich damit: p(x) = x(2 x) x(x )(x 2) 20 c) d) Spline-Interpolation p (u) = p (u) u u 4 u 0 u 4 + p 2 (u) u u 0 u 4 u 0 = p (u) + u u 0 u 4 u 0 (p 2 (u) p (u)) Interpolation mit lokalen Polynomen niedrigen Grades, dadurch keine starken Oszillation an den Rändern auf Grund eines hohen Polynomgrads geringere Komplexität der Berechnungen (O(n) statt O(n 2 ), wobei in diesem Fall n = 00 gilt) e) Der erste Fehler befindet sich in Zeile 07: Dort muss es in der letzten Klammer heißen: /(xs[i+k]-xs[i]); Der zweite Fehler steckt in Zeile 09: Die Rückgabe muss im ersten Element des f-feldes erfolgen: 09 return f[0]; f) Die Methode foo() berechnet die zweidimensionale Polynominterpolation nach Aitken- Neville und testet, ob die Stützwerte passende Dimensionen haben (in x- und y-richtung gleich viele)