________________________________________________________________________________
Inhalt....: Spline-Interpolation
Kategorie.: Grundkurs
Mathematik: Numerik
MuPAD.....: 3.0.0
Datum.....: 2004-03-31
Autoren...: Kai Gehrs <acrowley@mupad.de>
Funktionen: plot, plot::Point2d, PointSize, plot::Function2d, Color,
Funktionen: numeric::cubicSpline
________________________________________________________________________________
Spline-Interpolation
Dieses Arbeitsblatt ist Bestandteil des MuPAD Grundkurses.
In der Praxis kommt es vor, dass man einen Datensatz (d.h. eine Menge von x-
und y-Koordinaten) gegeben hat und sich nun fragt, ob die Punkte einer gewißen
Gesetzmäßigkeit genügen. Man ist auf der Suche nach einer Funktion, deren
Graph möglichst glatt ist und durch die vorgebenen Punkte verläuft. Die Forderung
der "Glattheit" begründet sich u.a. darauf, dass man unter glatten Funktionen in der
Regel mehrfach differenzierbare Funktionen versteht, die sich dann mit Hilfe von
analytischen Methoden (z.B. Berechnung lokaler Maxima und Minima über die erste
bzw. zweite Ableitung) weiter untersuchen lassen.
Die Suche nach einer solchen Funktion ist z.B. im Kontext physikalischer Meßdaten
denkbar oder z.B. bei Börsenkursen zur Veranschaulichung des bisherigen Kurs-
laufs. Wir geben uns einen kleinen Datensatz vor und wollen im folgenden Stück
für Stück eine gute Interpolationsfunktion mit MuPAD bestimmen:
Daten:= [0, 0.1], [1.75, 0.9], [3.2, -0.01],
[4.6, -1.02], [6.7, 0.1]
![]()
Mit Hilfe des Befehls plot::Point2d erzeugen wir uns Punkte, die sich anschließend
mit Hilfe des plot-Befehls darstellen lassen:
Punkte:= plot::Point2d( Daten[i][1],
Daten[i][2],
PointSize = 3 ) $ i = 1..5:
plot(Punkte)

Ein erster naiver Ansatz zur Interpolation könnte darin bestehen, dass wir alle
benachbarten Punkte durch lineare Funktionen verbinden. Dazu verwenden wir
die aus dem Mittelstufenunterricht bekannte Gleichung zur Bestimmung der
Gerade durch zwei vorgebene (verschiedene) Punkte:
p:= (L1, L2) -> (L2[2]-L1[2])/(L2[1]-L1[1]) *
(x-L1[1]) + L1[2]
![]()
Die entsprechenden linearen Interpolationsfunktionen bestimmen wir nun für je
zwei benachbarte Punkte und zeichnen anschließend die erhaltene (zusammen-
gestückelte) Funktion:
interPol:= plot::Function2d( p(Daten[i], Daten[i+1]),
x = Daten[i][1]..Daten[i+1][1] )
$ i = 1..4:
plot(interPol)

Unsere Meßdaten von oben können wir nun spielend leicht mit der Interpolierenden
in ein gemeinsames Koordinatensystem zeichnen:
plot(interPol, Punkte)

Offenbar verläuft der Graph der Funktion, die wir bestimmt haben, tatsächlich
durch die vorgegebenen Punkte. Die interpolierende Funktion ist zwar stetig,
denn sie weist keinerlei Sprungstellen auf, aber sie ist an den vorgegebenen
Meßwerten nicht differenzierbar. Eine weitere Untersuchung der Funktion mit
Mitteln der Analysis ist also nur begrenzt möglich.
Um eine glattere Funktion zu erhalten, greifen wir nun auf die Routine
numeric::cubicSpline zurück. Wir werden hier nicht auf algorithmische Details
eingehen, wie man zu der Spline-Interpolierenden gelangt, sondern betrachten
die MuPAD Funktion numeric::cubicSpline als Black-Box Routine. Diese Vor-
gehensweise ist keinesfalls verwerflich, denn im Bereich der Numerik gibt es
eine Reihe von approximativen Verfahren, die in der Praxis als sogenannte
Black-Box Routinen verwandt werden und bei deren Benutzung man sich keine
genaueren Gedanken über etwaige mathematische Hintergründe macht.
Wie oben werden wir auch die mittels Spline-Interpolation gewonnene Funktion
sofort grafisch darstellen:
S1:= numeric::cubicSpline(Daten):
Spline:= plot::Function2d(S1(x), x = 0..7):
plot(Spline)

Der Verlauf der Funktion S1 ist wesentlich glatter als der unserer linearen Inter-
polierenden von oben. Wir zeichnen S1 und ihre erste und zweite Ableitung in ein
gemeinsames Koordinatensystem. Dabei färben wir die erste Ableitung blau und
die zweite Ableitung grün ein:
plot( Spline,
plot::Function2d( S1(x, [1]), x = 0..7, Color = RGB::Blue ),
plot::Function2d( S1(x, [2]), x = 0..7, Color = RGB::Green )
)

Offensichtlich läßt sich S1 nun durchaus mit den üblichen Mitteln der Analysis
studieren. Wir überprüfen graphisch, ob auch S1 durch die gewünschten Punkte
verläuft:
plot(Spline, Punkte)

Damit haben wir unser Zeil erreicht. Sicherlich ist es allerdings so, dass unsere
Meßwerte nur sehr unwahrscheinlicher Weise von genau der berechneten
Spline-Funktion S1 stammen. Dem Verlauf des Funktionsgraphen von S1 nach
zu Urteilen, müssten die ursprünglichen Werte von der Funktion sin(x) herrühren.
Wir zeichnen S1 und sin(x) in ein gemeinsames Koordinatensystem:
plot( Spline, plot::Function2d(sin(x), x = 0..7,
Color = RGB::Red) )

Der rote Graph ist der Graph der Funktion sin(x). Tatsächlich haben wir die
angeblichen Meßwerte als Punkte gewählt, die sich durch leichte Variation von
Punkten der Sinus-Funktion ergeben.
________________________________________________________________________________
Übungen:
1. Fügen Sie in die obige Liste von Daten drei weitere Punkte ein. Untersuchen Sie, wie stark sich
__ein kleines Maß an Zusatzfunktionen auf die Güte der Approximation der Sinus-Funktion mit Hilfe
__der Spline-Interpolierenden auswirken kann. Zeichnen Sie dazu Ihre neu gewonnene Spline-Inter-
__polierende mit der Sinus-Funktion wiederum in ein gemeinsames Koordinatensystem. Vergleichen
__Sie Ihre Grafik mit der oben angegebenen.
________________________________________________________________________________
Anmerkungen:
1. Weitere Anregungen finden Sie in der Buchreihe Mathematik 1 x anders. In dieser Reihe
wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gelöst. Die
Bücher können unter www.schule.mupad.de/literatur kostenfrei kopiert werden.
________________________________________________________________________________