Ing Mathematik: Approximation und Interpolation: Unterschied zwischen den Versionen

Aus testwiki
Zur Navigation springen Zur Suche springen
imported>Intruder
 
(kein Unterschied)

Aktuelle Version vom 8. Januar 2025, 17:30 Uhr

Vorlage:Navigation zurückhochvor buch


Interpolation

Gegeben seien z.B. Messwerte (Stützpunkte). Diese sollen durch eine Funktion (Interpolante, Interpolierende, inter = zwischen, polire = glätten, schleifen) abgebildet werden.

Zu diesem Zweck gibt es eine Reihe von Methoden. Einige davon sollen nun besprochen werden.

Siehe auch Vorlage:W, Knorrenschild: Seite78ff, Burg, Haf, Wille, Meister: 393ff

Interpolation durch Polynome

Existenz und Eindeutigkeit: Seinen n+1 paarweise verschiedene Stützpunkte gegeben. Dann gibt es genau ein Polynom vom Grad maximal n, das die Gleichungen erfüllt. Dieses Polynom existiert und ist eindeutig bestimmt.

  • n=1: linare Interpolation
  • n=2: quadratische Interpolation
  • n=3: kubische Interpolation
  • etc.

i=0naixki=fk;k=0,,n

ai seien die unbekannten Koeffizienten des Interpolationspolynoms, xi die Stützstellen und fk die Stützwerte.

(1x0x0n1xnxnn)(a0an)=(f0fn)

Die Matrix in obiger Formel wird auch Vandermonde-Matrix genannt.

Das Problem mittels linearem Gleichungssystem lösen zu wollen. wäre aber unnötig aufwendig (das Problem ist auch schlecht konditioniert). Es gibt effizientere Verfahren, denen wir uns nun widmen wollen.

Siehe auch Vorlage:W, Vorlage:W

Lineare Interpolation zwischen zwei Punkten

Vorerst wollen wir aber noch ein einfaches Beispiel durchexerzieren. Gegeben seien zwei Stützpunkte. Damit ist das Interpolationspolynom vom Grad 1 (linear, eine Gerade).

Das Gleichungssystem mit der Vandermonde-Matrix ist (1x01x1)(a0a1)=(f0f1)

Dieses lineare Gleichungssystem lässt sich einfach lösen (z.B. mit dem Gauß-Algorithmus, der cramerschen Regel). Es ergibt sich

a0=f0x0f1f0x1x0 und a1=f1f0x1x0.

p(x)=y=a0+a1x=f0+xx0x1x0(f1f0)=y0+xx0x1x0(y1y0).

Das Problem lässt sich aber auch einfach geometrisch lösen.

Aus der Ähnlichkeit der Dreiecke ergibt sich:

yy0xx0=y1y0x1x0.

Und damit wieder die mit der Vandermonde-Matrix hergeleitete Formel: y=y0+xx0x1x0(y1y0).

Interpolationsformel von Lagrange

Joseph-Louis de Lagrange (italienisch-französischer Mathematiker, 1736-1813)

i(x)=j=0jinxxjxixj=xx0xix0xxi1xixi1xxi+1xixi+1xxnxixn,

mit i(xk)=j=0jinxkxjxixj=δik. Dabei ist δik das Kronecker-Delta . Damit entspricht die Matrix (i(xj))i,j=0,1,,n der Einheitsmatrix.

Lösung des Interpolationsproblems:

P(x)=i=0nfii(x).

Beispiel:

Gegeben sind die Stützpunkte gemäß folgendem Bild:

Gesucht ist das Interpolationspolynom.

0=xx1x0x1xx2x0x2=x212x313=x25x+62

1=xx0x1x0xx2x1x2=x121x323=x2+4x3

2=xx0x2x0xx1x2x1=x131x232=x23x+22

P(x)=f00+f12+f22=1x25x+62+1(x2+4x3)+2x23x+22=x223x2+2

Wie zu erwarten, ist das Interpolationspolynom vom Grad 2 (quadratisch), da drei Stützpunkte vorgegeben sind.

Auch dieses Verfahren ist für den praktischen Einsatz zu aufwändig.

Baryzentrische Interpolationsformel

P(x)=j=1nλjfjxxjj=1nλjxxj für xx1,,xn,

Baryzentrische Gewichte: λj:=i=1ijn1xjxi.

Siehe auch Vorlage:W

Diese Methode ist deutlich effizienter als die Verwendung der lagrangeschen Interpolationsformel. Auch die SciPy-Bibliothek stellt eine entsprechende Funktion barycentric_interpolate zur Verfügung. Mit dieser ist folgender Python-Code erstellt:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import barycentric_interpolate

x_mess = (1., 2., 3., 4., 5.)
y_mess = (1., 1., 1., 1., 2.)

x = np.linspace(min(x_mess), max(x_mess), num=100)
y = barycentric_interpolate(x_mess, y_mess, x)

plt.plot(x, y, label="baryzentrische Interpolation")
plt.plot(x_mess, y_mess, "x", label="Messwerte")
plt.legend()
plt.show()

Ausgabe:

Newtonsche Interpolationsformel

Gegeben sind wieder Stützpunkte (xi,fi);i=0,,n.

Newton-Interpolationsformel:

P(x)=i=0nciNi(x)=c0+c1(xx0)+c2(xx0)(xx1)++cn(xx0)(xxn1)

Gleichungssystem:

(101(x1x0)1(x2x0)(x2x0)(x2x1)1(xnx0)i=0n1(xnxi))(c0cn)=(f0fn)

Es werden nun die dividierten Differenzen berechnet. Diese lassen sich mit einem Dreiecksschema (Neville-Schema) übersichtlich darstellen:

f[x0]f[x1]f[x0,x1]f[x2]f[x1,x2]f[x0,x1,x2]f[xn1]f[xn2,xn1]f[xn3,xn2,xn1][x0,,xn1]ff[xn]f[xn1,xn]f[xn2,xn1,xn]f[x1,,xn]f[x0,,xn]

Mit ci=f[x0,,xi].


Beispiel: Es soll wieder das Interpolationspolynom durch die 3 Stützpunkte P0=(1,1),P1=(2,1),P2=(3,2) gelegt werden.

f[x0]=1f[x1]=1f[x0,x1]=f[x1]f[x0]x1x0=1121=0f[x2]=2f[x1,x2]=f[x2]f[x1]x2x1=2132=1f[x0,x1,x2]=f[x1,x2]f[x0,x1]x2x0=1031=12

Mit der Newton-Interpolationsformel ergibt sich wiederum

P(x)=1+0(x1)+12(x1)(x2)=x23x+42

Mit dem Horner-Schema lässt sich das Interpolationspolynom auswerten (siehe Vorlage:W).

Python-Code zum Horner-Schema:

import numpy as np

def horner(a, x0):
    f = 0
    n = np.size(a)
    
    for i in np.arange(0, n):
        f = f*x0 + a[i]

    return f

a = np.array([1/2, -3/2, 2])

h = horner(a, 2.5)
print(h)

Ausgabe:

1.375

Siehe auch Vorlage:W, Knorrenschild: Seite 81ff, Burg, Haf, Wille, Meister: Seite: 401ff

Neville-Aitken-Schema

Alexander Craig Aitken (neuseeländischer Mathematiker, 1895-1967)

Oft interessiert das Interpolationspolynom selbst nicht. Man will nur den Interpolationswert an einer bestimmten Stelle bestimmen. Das kann mit dem Neville-Aitken-Schema effizient gemacht werden.

Hier soll das Verfahren von Neville-Aitken an Hand eines rudimentären Python-Programms dargestellt werden:

import numpy as np

x = (1., 2., 3.) # Stützstellen
y = (1., 1., 2.) # Stützwerte
xinter = 2.5     # Auswertung an der Stelle xinter

n = 3
p = np.zeros((n,n))

for i in np.arange(0, n):
    p[i,0] = y[i]

for k in np.arange(1, n):
    for i in np.arange(0, n-k):
        p[i,k] = p[i+1,k-1] + (x[i+k]-xinter) / (x[i+k]-x[i]) * (p[i,k-1] - p[i+1,k-1])

print("f(", xinter, ") = ", p[0,n-1])

Ausgabe:

f( 2.5 ) =  1.375

Siehe auch Vorlage:W, Burg, Haf, Wille, Meister: Seite 401ff, Knorrenschild: Seite 84f

Sonstiges

Interpolationspolynome höherer Ordnung können deutliche Überschwinger aufweisen. Knorrenschild zeigt auf Seite: 88f seines Buches diese Problematik anhand eines Beispiel auf. Aus diesem Grunde ist auch die Extrapolation außerhalb des Stützstellenintervalls kaum möglich. Genaueres siehe auch Vorlage:W.

Splines

Der Name Spline leitet sich vom englischen Begriff "Spline" für Vorlage:W ab und kommt aus dem Schiffbau.

Nunmehr wird nicht mehr nur ein Interpolationspolynom durch die Stützpunkte gelegt, sondern es wird das Stützintervall in mehrere Teilintervalle aufgeteilt. In jeweils einem Teilintervall lassen sich dann Interpolationspolynome niedrigeren Grades verwenden (typischerweise kubische Polynome).

Lineare Splines

y=yn1+xxn1xnxn1(ynyn1)

Diese Formel folgt direkt aus derjenigen für die lineare Interpolation zwischen 2 Punkten.

Python-Code (rudimentär):

import numpy as np
import matplotlib.pyplot as plt

x = (1., 2., 3., 4.) # Stützstellen
y = (1., 2., 1., 4.) # Stützwerte
xinter = 3.5     # Auswertertung an der Stelle xinter
 
n = 3
yinter = y[n-1] + (xinter - x[n-1]) / (x[n]-x[n-1]) * (y[n]-y[n-1])

print("f(", xinter, ") = ", yinter)

plt.plot(x,y)
plt.plot(xinter, yinter, "o")
plt.grid()
plt.show()

Grafikausgabe:

Konsolenausgabe:

f( 3.5 ) =  2.5

Kubische Splines

Python-Code:

from scipy.interpolate import CubicSpline
import matplotlib.pyplot as plt
import numpy as np

x = (1., 2., 3., 4.) # Stützstellen
y = (1., 2., 1., 4.) # Stützwerte
xinter = 2.5

spl = CubicSpline(x, y)
s = spl(xinter)

print(s)

xspline = np.arange(1., 4.1, 0.1)
yspline = spl(xspline)

plt.plot(x, y, "x", label="Stützpunkte")
plt.plot(xspline, yspline, label="kubischer Spline")
plt.plot(xinter, s, "o", label="Interpolationspunkt")
plt.legend()
plt.grid()
plt.show()

Grafikausgabe:

Konsolenausgabe:

1.375

Siehe auch [1]


Für weitere Details siehe auch Vorlage:W, Vorlage:W, Hanke-Bourgeois: Seite 355ff, Burg, Haf, Wille, Meister: Seite 410ff, Knorrenschild: Seite 89ff.

Approximation

Bernstein-Polynome

Sergei Natanowitsch Bernstein (russischer Mathematiker, 1880-1968)

Sei f eine stetige Funktion auf dem Intervall [0,1].

Bn(f)(t)=i=0nBi,n(t)f(in)

Bernsteinpolynome vom Grad n: Bi,n:,t(ni)ti(1t)ni mit 0in.

Approximation einer Kurve durch Bernstein-Polynome:

Siehe auch Vorlage:W, Burg, Haf, Wille, Meister: Seite 387ff

Padé-Approximation

Henri Eugène Padé (französischer Mathematiker, 1863-1953)

Padé-Approximation:

f(x)R(x)=j=0majxj1+k=1nbkxk=a0+a1x+a2x2++amxm1+b1x+b2x2++bnxn

mn.

Beispiel: Gegeben seien 5 Stützstellen der Funktion f(x).

Wir wählen also f(x)a0+a1x+a2x21+b1x+b2x2 und haben 5 Gleichungen für die 5 unbekannten Koeffizienten a0,a1,a2,b1,b2. Wir formen die Gleichung um.

(1+b1xi+b2xi2)fi=a0+a1xi+a2xi2

Für x=0 erhalten wir f0=a0. Somit haben wir noch 4 Unbekannte und 4 Gleichungen.

a1xi+a2xi2(b1xi+b2xi2)fi=fif0

Dies ist ein lineares Gleichungssystem, das auch so gelöst werden kann.

(x1x12f1x1f1x12x2x22f2x2f2x22x3x32f3x3f3x32x4x42f4x4f4x42)(a1a2b1b2)=(f1f0f2f0f3f0f4f0)

Siehe auch Vorlage:W, Thuselt, Gennrich: Seite 276ff.

Gedruckte Werke (auszugsweise)

  • Burg, Haf, Wille, Meister: Höhere Mathematik für Ingenieure, Band I: Analysis. 9. Auflage, Vieweg+Teubner, 2011, ISBN 978-3-8348-1218-6
  • Hanke-Bourgeois: Grundlagen der Numerischen Mathematik und des Wissenschaftlichen Rechnens. 3. Aufl., Vieweg+Teubner, 2009, ISBN 978-3-8348-0708-3
  • Knorrenschild: Numerische Mathematik, Eine beispielorientierte Einführung. 6. Aufl., Hanser, 2017, ISBN 978-3-446-45161-2
  • Thuselt, Gennrich: Praktische Mathematik mit MATLAB, Scilab und Octave. Springer, 2013, ISBN 978-3-642-25824-4


Vorlage:Navigation zurückhochvor buch