Bedingungen fuer Kubische Spline-Interpolierende

Angenommen $S(x)$ ist eine kubische Spline-Interpolierende für $n$ Punkte, dann muss gelten:

  1. $S_j(x_{j+1}) = S_{j+1}(x_{j+1})$
  2. $S'_j(x_{j+1}) = S'_{j+1}(x_{j+1})$
  3. $S''_j(x_{j+1}) = S''_{j+1}(x_{j+1})$
  4. $S''_0(x_0) = S''_n(x_n)$ = 0

Aufgabenstellung: Testen ob eine Funktion eine kubische Spline-Interpolierende ist.

  • Gegeben: eine Funktion $S(x)$
  • Gesucht: ist $S$ eine kubische spline interpolierende?
  • Vorgehensweise: die Bedinungen testen

In [11]:
var('x')
# input: funktionen der einzelnens splines
S = [
    x/5 + 3/5 * x^3,
    14/5 - 41/5 * x + 42/5 * x^2 - 2*x^3,
    -122/5 + 151/5*x - 54/5* x^2 + 7/5*x^3
]
# input: definitionsbereich der spline funktionen
r = [
    (0, 1),
    (1, 2),
    (2, 3)
]

for i, s in enumerate(S):
    print "spline", i
    show(s)
    show(s.derivative(x))
    show(s.derivative(x, 2))
    print ""


spline 0
spline 1
spline 2


In [12]:
eqns = []
for i in range(len(S) - 1):
    eqns.extend([
          (S[i] == S[i + 1]).subs(x=r[i][1]),
          (S[i].derivative(x) == S[i + 1].derivative(x)).subs(x=r[i][1]),
          (S[i].derivative(x, 2) == S[i + 1].derivative(x, 2)).subs(x=r[i][1])
        ])
eqns.extend([
        (S[0].derivative(x, 2) == 0).subs(x=r[0][0]),
        (S[-1].derivative(x, 2) == 0).subs(x=r[-1][1]),
        ])

for eqn in eqns:
    show(eqn)
    print "holds? ", eqn == True
    print ""


holds?  False

holds?  False

holds?  False

holds?  False

holds?  False

holds?  False

holds?  False

holds?  False

Aufgabenstellung:

  • Gegeben: eine Funktion $S(x)$ mit reellen Konstanten $a,b,c,d \ldots$
  • Gesucht: Werte der Konstanten sodass $S(x)$ eine gültige kubische Spline-Interpolierende ist
  • Vorgehensweise: Basierend auf den Bedingungen ein Gleichunssystem aufstellen und lösen

In [6]:
var('x')
# input:
constants = var('a,b,c,d,e')
S = [
    a + b*(x - 1) + c*(x - 1)^2 + d * (x - 1)^3,
    (x - 1)^3 + e*x^2 - 1
]
r = [
    (0, 1),
    (1, 2)
]
for i, s in enumerate(S):
    print "S[{}], first, second derivative:".format(i)
    for j in range(3):
        show(s.derivative(x, j))
    print ""


S[0], first, second derivative:
S[1], first, second derivative:


In [7]:
eqns = []
for i in range(len(S) - 1):
    eqns.extend([
          (S[i] == S[i + 1]).subs(x=r[i][1]),
          (S[i].derivative(x) == S[i + 1].derivative(x)).subs(x=r[i][1]),
          (S[i].derivative(x, 2) == S[i + 1].derivative(x, 2)).subs(x=r[i][1])
        ])
eqns.extend([
        (S[0].derivative(x, 2) == 0).subs(x=r[0][0]),
        (S[-1].derivative(x, 2) == 0).subs(x=r[-1][1]),
        ])

for eqn in eqns:
    show(eqn.simplify())



In [8]:
for i in solve(eqns, *constants):
    show(i)



In [ ]: