Umwandlung einer Excel-Array-Fkt. die kub.Splines bestimmt



  • Hallo zusammen!

    Ich möchte die folgende Funktion gerne in C++ bzw. MFC schreiben. :p Leider habe ich keinen blassen Schimmer von VBA Excel. 😞
    Bitte um Mithilfe!
    Danke! 😉

    Natürliche Spline Interpolation
    Bestimmen der natürlichen Spline-Interpolation füer eine beliebige
    Anzahl n>2 Datenpunkte. Die Datenpunkte müssen bezüglich x-Werte in aufsteigender
    Reihenfolge sortiert sein.
    Das Resultat wird als 2dimensionales Array retourniert ( Excel-Array-Funktion ).
    Die Einträge jeder Zeile enthalten eine Spline Funktion in der Notation:
    a0 + a1*x + a2*x^2 + a3*x^3
    Es werden n-1 Spline-Funktionen berechnet, wobei jeweils eine Polynomfunktion zwischen
    zwei Datenpunkten gilt.

    Parameter: x: Liste mit den Stützstellen
    y: Liste mit den Stützwerten
    Sprache: MS VBA EXCEL 97

    Function KSpline2(x,y)
    Dim h 'Dynamisches Array für Schrittweite'
    Dim SplinePoly 'Dynamisches Array mit Koeffizienten für Spline-Polynome'
    Dim AnzX 'Anzahl Stützstellen in der Liste'
    Dim AnzY 'Anzahl Stützwerte in der Liste'
    Dim G 'Koeffizientenmatrix für lineares Gleichungssystem'
    Dim y2i 'Krümmungen an den inneren Datenpunkten'
    Dim Y2 'Krümmungen an den Datenpunkten ( + äußere Datenpunkte )'
    Dim B 'Konstantenvektor ( rechte Seite des LGS )'
    Dim N 'Anzahl benötigte Splines für Interpolation ( Anzahl Datenpunkte -1 )'
    Dim i, j
    Dim xi

    'Parameter kontrollieren'
    AnzX = x.Count
    AnzY = y.Count
    If AnzX <> AnzY Then 'Keine Interpolation wenn Anzahl XWERTE ungleich YWERTE'
    KSpline2 = CVErr(xlErrValue)
    Exit Function
    End If

    If AnzX < 2 Then 'Mind. 2 Datenpunkte für Interpolation benötigt!'
    KSpline2 = CVErr(xlErrValue)
    Exit Function
    End If

    'Spline Berechnung vorbereiten'
    N = AnzX - 1 'höchster Index ( mathematisch )'
    ReDim h(0 TO N - 1) 'Array für die Schrittweiten'
    ReDim SplinePoly(0 TO N - 1, 0 TO 3)

    For i = 0 TO N - 1 'Schrittweiten bestimmen, a(i) setzen'
    h(i) = x(i+2) - x(i+1) 'h0 = x(2)-x(1), h1=x(3)-x(2),...'
    Next i

    'Lin.Gleichungssystem für ide Krümmungen aufbauen. Es entsteht ein tridiagonales GL
    für die inneren Krümmungen. Der Einfachheit halber mit einer Matrixinversion gelöst.'
    ReDim G(1 To N - 1, 1 To N - 1) 'Koeffizientenmatrix für benötigte Anzahl dimensionieren'
    ReDim c(1 To N - 1) 'Konstantenvektor für das GL ( rechte Seite )'
    ReDim y2i(1 To N - 1) 'Krümmungen an den inneren Punkten'
    ReDim Y2(0 To N) 'Alle Krümmungen'

    For i = 1 To N - 1 'Matrix mit 0 initialisieren'
    For j = 1 To N - 1
    G(i, j) = 0
    Next j
    Next i
    For i = 1 To N - 1 'Koeffizienten bestimmen und einschreiben'
    If i > 1 Then G(i, i - 1) = h(i-1)
    G(i, i) = 2 * (h(i - 1) + h(i))
    If i < N - 1 Then G(i, i + 1) = h(i)
    c(i) = 6 / h(i) * (y(i + 2) - y(i + 1)) - 6 / h(i - 1) * (y(i+1) - y(i))
    Next i
    G = Application.MInverse(G) 'Matrizen-Inversion + Multiplikation
    y2i = Application.MMult(c, G) ' - - "" - - '

    'Krümmungsvektor aufbauen: Innere Krümmungen + Krümmung an den äußeren Punkten'
    Y2(0) = 0: Y2(N) = 0 'Krümmung am Anfan und Ende = 0 (Def.natürl.Spline)'
    For i = 1 To N - 1
    Y2(i) = y2i(i)
    Next i

    'Polynomkoeffizienten ak, ..,dk für jeden Spline aufbauen und einschreiben'
    For i = 0 To N - 1
    SplinePoly(i, 0) = y(i + 1) 'ak'
    SplinePoly(i, 1) = 1 / h(i) * (y(i + 2) - y(i+1)) - h(i) / 6 * (Y2(i+1) + 2 * Y2(i)) 'bk'
    SplinePoly(i, 2) = Y2(i) / 2 'ck'
    SplinePoly(i, 3) = 1 / (6 * h(i)) * (Y2(i + 1) - Y2(i)) 'dk'
    Next i

    'Polynomnotation a0 + a1 (x-xi) + a2 (x-xi)^2 + a3 (x-xi)^3 in a0' + a1'x + a2'x^2 + a3'x^3
    überführen'
    For i = 0 To N - 1
    xi = x(i + 1) 'Startwert des Definitionsintervalles für pi(x)'
    SplinePoly(i, 0) = SplinePoly(i, 0) + (((-SplinePoly(i, 3) * xi + SplinePoly(i, 2))
    * xi) - SplinePoly(i, 1)) * xi
    SplinePoly(i, 1) = SplinePoly(i, 1) - 2 * xi * SplinePoly(i, 2) + 3 * xi * xi
    * SplinePoly(i, 3)
    SplinePoly(i, 2) = SplinePoly(i, 2) - 3 * xi * SplinePoly(i, 3)
    Next i

    KSpline2 = SplinePoly

    End Function

    MfG
    RunSeb



  • Was ist denn jetzt genau das Problem?



  • Dim ist sicherlich wie schon erklärt ein Array, aber welche Datentypen gebe ich denen? Und was ist ReDim????
    Die Deklarationen der dynamischen Arrays bwz Dims zu Beginn gefällt mir auch nicht, woher soll ich den vorher wissen wie viele x-y-Werte der User dann eingibt. Das ist mir alles so ...starr! Die Schleien und Anweisungen würd ich schon hinbekommen.



  • Also ist das eigentlich kein mathematisches Problem... dann schieb ich Dich mal besser nach Rund um



  • Dieser Thread wurde von Moderator/in Jester aus dem Forum Mathematik in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten