Splines richtig anwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JayJay
User
Beiträge: 10
Registriert: Dienstag 11. Juni 2013, 18:22

Hallo zusammen,

ich habe ein Problem bei Anwenden von Splinefunktionen (UnivariateSpline). Und zwar habe ich eine Reihe von 13 Messpunkten, welche ich interpolieren möchte. Die Ableitungen (siehe unten) möchte ich dann wieder mit neuen Splines fitten. Es passiert leider nicht das, was ich erwartet habe.

1.) Meiner Meinung nach müsste ich doch beim Ausgeben der Koeffizienten 4x12 Stück angezeigt bekommen, da in jedem Abschnitt sich ein Spline dritter Ordnung befindet. Ich bekomme aber komischerweise 14 Koeffizienten ausgegeben.

2.) Da die Ableitungen bei interpolierenden Splines schnell sehr starke Schwankungen zeigen möchte ich diese gerne mit smoothsplines belegen. Leider kann ich auch nach einiger recherche nicht viel mit dem Parameter s anfangen. Egal was ich auswähle, entweder der Spline interpoliert die Werte oder er legt ein "smooth" Polynom dritten Grades über die Werte (immer exakt dasselbe). Warum ist das so? Er müsste doch immer noch mehrere Funktionen dritten grades zwischen den Punkten erstellen (?).

Ich hoffe, dass ich mich halbwegs verständlich ausgedrückt habe und ihr mir dabei weiterhelfen könnt.

Mit besten Grüßen,

JayJay

Code: Alles auswählen

VV = UnivariateSpline(yR, UU1, w=None, k=3, s=0)
for i in range(0,13):
          U = UnivariateSpline.derivatives(VV,yR[i])
          UUU1[i] = U[1]
print UnivariateSpline.get_coeffs(VV)

VVV = UnivariateSpline(yR, UUU1, w=None, k=3, s=0)
for i in range(0,13):
          U = UnivariateSpline.derivatives(VVV,yR[i])
          UUUU1[i] = U[1]
print UnivariateSpline.get_coeffs(VVV)
Zuletzt geändert von Anonymous am Mittwoch 18. September 2013, 11:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@JayJay: Wo kommt denn `UnivariateSpline` her? Aus der Standardbibliothek ist das jedenfalls nicht.

Deine Namensgebung ist sehr ungewöhnlich und auch nicht wirklich gut lesbar. Da muss man ja Buchstaben zählen um zu wissen welche „Generation” die Daten sind.

Und wo werden die Listen(?) überhaupt erstellt? Es ist in Python unüblich Listen mit Dummy-Werten zu erstellen um dann mittels Indexzuweisungen einen Wert nach dem anderen durch den *tatsächlichen* Wert an dem Index zu ersetzen. Man baut stattdessen einfach neue Listen auf, wo man die Elemente der Reihe nach anfügt, oder in Fällen wo sich das anbietet eine „list comprehension” verwendet.

Ebenfalls unschön ist das kopieren und einfügen. In dem Code wird im Grunde zweimal das selbe gemacht, nur mit anderen Ausgangswerten. Dafür gibt es Funktionen oder Schleifen.

Immer noch mit furchtbaren Namen könnte das so aussehen:

Code: Alles auswählen

    Us = [UU1]
    Vs = list()
    for _ in xrange(2):
        VV = UnivariateSpline(yR, UU1, w=None, k=3, s=0)
        Vs.append(VV)
        UU1 = [UnivariateSpline.derivatives(VV, y_r)[1] for y_r in yR]
        Us.append(UU1)
        print UnivariateSpline.get_coeffs(VV)
JayJay
User
Beiträge: 10
Registriert: Dienstag 11. Juni 2013, 18:22

Hi BlackJack,

entschuldige die späte Antwort. Ich war "leider" unterwegs. "UnivariateSpline" kommt aus scipy (scipy.interpolate).
Danke für die Tipps hinsichtlich des Schönschreibens. Ich bin bisher immer schon froh, wenn überhaupt was funktioniert :-).

Mein eigentliches Problem hat sich allerdings durch weiteres herumprobieren (was auch nicht die schöne Lösung der Dinge ist) inzwischen erledigt.

Vielen Dank und mit besten Grüßen,
JayJay
Antworten