Funktion: Kubische Splines

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Funktion: Kubische Splines

Beitrag von Stephan »

z.B. siehe:
http://www.excelformeln.de/tips.html?welcher=99

die dortige Beispieldatei funktioniert hier auch in OpenOffice (OOo 3.3.0)


Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Funktion: Kubische Splines

Beitrag von clag »

Hallo pau,

bei den Excel Kollegen hat sich ein Klaus Kühnlein schon einmal die Mühe gemacht und auch Kubische Splines im Beispiel berechnet.
Die Beispieldatei Kubische Splines funktioniert hier auch unter AOO 4.1.1

Vieleicht hilft dir das ja schon weiter!?

PS
der Stephan war schneller
nennt man das jetzt eigentlich auch Doppelpost ;) ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Hi!

Stephan
calg

Keiner mehr da?

pau
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Guten Abend Gemeinde!

Habe ein .xls Blatt gefunden mit Splineinterpolation.
Habe aber damit meine Schwierigkeiten, weil ich die Syntax der Formel cubspline nicht kenne. Kann mir da jemand weiterhelfen?

Ich füge mal meine Tabelle zwecks Erläuterung bei.
Ich habe drei Stützstellen, bei 100, 50 und 2. Die zu den dazwischenliegenden Werten 90,80,70,60,40,30,20,10 gehörenden Daten wil ich Splineinterpolieren. Muß also zeilenweise vorgehen. Müßte also die drei Stützstellen einzeln eingeben. Kann das aber nicht. Habe nur das Beispiel, dass die Stützstellen als Abfolge (zB A6:A9) eingebbar sind.

Versuche mal das Exelsheet aus dem ich das habe beizufügen und wie gesagt mein Beispiel(splineproblem).

grüsse pau
Dateianhänge
splineproblem.xlsx
(8.08 KiB) 129-mal heruntergeladen
spline 31580.xls
(136.5 KiB) 142-mal heruntergeladen
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Funktion: Kubische Splines

Beitrag von Stephan »

Es handelt sich um ein geschütztes Tabellenblatt.
Nein (habe mich gerade nochmal vergewissert). Und selbst wenn dann wäre der Schutz in OO entfernbar.
Splineinterpolierte Werte wurden bei mir nicht ausgegeben
hä? Die Zahlenreihen in Tabelle "Kubische Splines" betreffen nicht die gewünschten Dinge?
Vlt könnt Ihr mir da mal eine Anleitung dazu schreiben?
Meine Anleitung lautet: öffne die Datei. So getestet mit OOo 3.3.0
Habe versucht die Makros laufen zu löassen weil ich dachte es könnte daran liegen.


Es gibt in der (von mir genannten) Datei überhaupt keine Makros (nur leere Module die die Makroabfrage auslösen)

Keiner mehr da?
Gelegentlich arbeite ich auch ... hier im Forum kriege ich nämlich nichts bezahlt und auch ich muss mein Leben finanzieren.
Kann mir da jemand weiterhelfen?
Nur indem ich Dir sage schau in die benutzerdefinierte Funktion in der Excel-Datei:

Code: Alles auswählen

Public Function cubspline(Method As Integer, xi As Double, _
                          xx As Object, yy As Object) As Double
' valid input for parameter "Method":
' 1 = cubic spline / 3 = own spline

Dim i As Integer
Dim yi As Double
Dim x() As Double
Dim y() As Double
Dim y2() As Double
Dim j As Integer

If Method = 1 Then
  'Numerical Recipes are 1 based
  j = 0
Else
  'Others are 0 based
  j = -1
End If

For i = 1 To UBound(xx())
  If yy(i) <> "" Then
    j = j + 1
    ReDim Preserve x(j)
    ReDim Preserve y(j)
    x(j) = CDbl(xx(i))
    y(j) = CDbl(yy(i))
  End If
Next i

If Method = 1 Then
  'NR cubic spline
  'Get y2
  ReDim y2(1 To UBound(x()))
  Call spline(x(), y(), UBound(x()), 10 ^ 30, 10 ^ 30, y2())
  'Get y
  Call splint(x(), y(), y2(), UBound(x()), xi, yi)
ElseIf Method = 3 Then
  'Own cubic spline
  yi = SplineX3(xi, x(), y())
End If

'Return
cubspline = yi


End Function
dort stehen die Parameter (Method As Integer, xi As Double, xx As Object, yy As Object) und Du must deren Wirken durch lesen der kompletten Funktion erschliessen. Ich kann das nicht tun, weil ich keine Ahnung von kubischen Splines habe.
Ich habe drei Stützstellen, bei 100, 50 und 2. Die zu den dazwischenliegenden Werten 90,80,70,60,40,30,20,10 gehörenden Daten wil ich Splineinterpolieren.
Sagt mir nichts, weil ich davon nichts verstehe. Da es was mit Mathematik zu tun hat hatte ich das sicher mal beim Studium, das ist aber 30 Jahre her.


Gruß
Stephan
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Hi Stephan!

Danke für Deine Antwort. Wollte nicht drängeln!


Wie kommt man dann in Excel zur benutzerdefinierten Funktion? Suchte gerade ohne Ergebnis. Und warum finde ich die nicht in der Formelliste?
Da gibt es wohl noch zwei Unterprogramme names spline und splineX3.Vielleicht muß ich da die Formel umschreiben. Das wird nicht so einfach sein. Die Einträge in den Spalten sind bereits von mir Splineinterpoliert. Nur mit den Zeilen kann ich das nicht genauso machen. Da müßte ich sonst pro Zeile mehrere Polynome ausrechnen und das bei mehreren Hundert Zeilen ma mehreren Tabellen. Nur so zur Hintergrundinformation.

grüsse
pau
Zuletzt geändert von paupau am Di, 15.09.2015 23:15, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Funktion: Kubische Splines

Beitrag von Stephan »

Wie kommt man dann in Excel zur benutzerdefinierten Funktion?
Extras-Makro-VisualBasic Editor

links:
VBA-Projekt (spline ...) -->Modul -->Spline_
Und warum finde ich die nicht in der Formelliste.
ich schon, f(x)-Schaltfläche in Rechenleiste anklicken und der Dialog mit allen Funktionen ploppt auf:
benutzerdefExcel.gif
benutzerdefExcel.gif (30.22 KiB) 4116 mal betrachtet


Gruß
Stephan
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Danke!



Extras - Makros- VBEdit finde ich nicht in Excel.
Über extras in OO komme ich auch nicht dahin.

In OO komme ich nicht klar mit dem sheet. Da kommt zuerst ein Hinweis, dass das Blatt Makros enthalte. In Spalte "E" erscheint immer nur #Name, nicht aber die Ergebnisse wie in Excel. Nur in Spalte Zeile 9 #MAKRO? .

Gute Nacht mal.


grüsse
pau
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Guten Abend Stephan!

Ich komme mit den Splines nicht so recht weiter.

Habe eine Funktion für Excel gefunden und die geladen.
Leider kann ich die nicht in der Art und Weise verenden wie ich das bräuchte. S. Screenshot. Leider beomme ich keine Fehlermeldung und kann keine Funktionsbeschreibung erhalten, die mir weiterhilft.
Möglicherweise müsste man die dahintersteckende VBA anpassen.

Zusatzfrage: Wie üertrgae ich denn eine Funktion von einer Anwendung zur anderen?
excelBsp.odt
(183.72 KiB) 84-mal heruntergeladen
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Funktion: Kubische Splines

Beitrag von Stephan »

Was soll ich sagen?

1.
es ist ziemlich sinnfrei einen Screenshot zu posten, da daraus ohnehin nichts zu ersehen sein kann, denn die maximale Information die ersichtlich sein könnte ist ein Funktionsname

2.
aus dem konkreten Screenshot ist jedoch nicht einmal der Funktionsname ersichtlich, sondern die sichtbare 'Formel' in der aktiven Zele ist allein:

=$E$6;H10;G10,L10,Q10,G12,L12,Q12) [sic]

und ich schreibe 'Formel' in '', weil ich schlichtweg nicht einmal weiß was dieser Ausdruck sein soll, eine gültige Formel jedenfalls nicht
Möglicherweise müsste man die dahintersteckende VBA anpassen.


ja, möglicherweise bzw. _wenn_ VBA dahintersteht ist das wahrscheinlich
(andererseits war es in der hier schon genannten Beispieldatei http://www.excelformeln.de/tips.html?welcher=99 nicht nötig - diese KLarstellung nur nochmals zur Vorsicht)
Wie übertrage ich denn eine Funktion von einer Anwendung zur anderen?
Indem Du sie kopierst.?

Wenn "Funktion" hierbei eine Funktion in einer Calc-Zelle meint, dann kopiere diese und füge sie in eine Zelle der anderen Datei ein.
Wenn Funktion hierbei eine benutzerdefinierte Funktion, also ein Stück Basic-Code, meint, dann kopiere diesen Code aus der einen Datei in die andere Datei.


Im Übrigen nochmals zur Klarstellung:
ich habe von kubischen Splines keine Ahnung und weiß deshalb nicht was Du von mir hier erwartest. Die Tatsache das ich VBA-Code lesen und nötigenfalls anpasssen könnte ist doch weitgehend wertlos wenn ich inhaltlich nicht weiß was kubische Splines sind.



Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Funktion: Kubische Splines

Beitrag von Stephan »

Habe also meine Knoten [im Bsp. nur 3] dadurch einzugeben versucht, indem ich sie mit Komma trennte.
Warum verwendest Du nicht adäquate Ausdrücke gibst also Zellbereiche an? z.B.: G10:Q10
Aber das schluckt er nicht. Nimmt nicht die ausgefüllte Formel; gibt noch nicht einmal eine Fehlermeldung. Dies ist der Zustand meines Screenshots.
Nein, denn dort ist keine gültige Formel, auch nicht wen das Komma-Problem nicht wäre, denn es fehlt schlichtweg die Funktionsangabe. z.B. wäre das Folgende immer noch nicht richtig, wegen der Kommas, aber prinzipiell zumindest zunächt eine Formel:

=cubspline($E$6;H10;G10,L10,Q10,G12,L12,Q12)
Wie sonst kann ich die Spaltenangaben der Knoten und Werte durch Angaben einzelner Zellen ersetzen?
s.o.
Oder geht das gar nicht, weil in der Funktion nicht vorgesehen?


doch, das geht. Ob die prinzipiell richtige Angabe z.B. "G10:Q10" funktioniert weeiss ioch natürlich nicht, denn dazu müsste ich etwas von Splines verstehen, was ich jedoch nicht tue.
Das passiert wohl eher in der i-Schleife:
da passiert nichts Wesentliches, was das Ganze für einen Zweck hat weiß ich auch nicht da ich keinerlei ahnung von Splines habe, der Code tut jedoch Folgendes;

Code: Alles auswählen

For i = 1 To UBound(xx())
für jedes Feld des Arrays von 1 bis zum letzten Feld

Code: Alles auswählen

  If yy(i) <> "" Then
ist der Inhalt des Feldes mit dem Index i des Array yy() leer dann...

Code: Alles auswählen

    j = j + 1
erhöhe die Variable j um 1

Code: Alles auswählen

    ReDim Preserve x(j)
    ReDim Preserve y(j)
Dimensioniere die Arrays x() und y() neu mit Obergrenze j unter Beibehaltung evtl. schon existenter Array-Inhalte

Code: Alles auswählen

    x(j) = CDbl(xx(i))
weise dem Feld mit dem Index j des Arrays x() den Wert des Feldes mit dem Index i des Arrays xx() zu, unter vorheriger Konvertierung des letzteren Wertes in einen String

Code: Alles auswählen

   y(j) = CDbl(yy(i))
dito mit y()/yy()

Code: Alles auswählen

  End If
Next i
Ende der Schleife


KLar ist das Vorstehende nicht sehr hilfreich, ich wollte nur illustrieren das es mir nichts nutzt das ich programmieren kann wenn ich nichts von Splines verstehe und es bei der Programmierung, um Splines geht.



Gruß
Stephan
paupau
*
Beiträge: 14
Registriert: Di, 15.09.2015 10:14

Re: Funktion: Kubische Splines

Beitrag von paupau »

Moin Stephan!

Schönen Dank für Dein Kümmern!
Warum verwendest Du nicht adäquate Ausdrücke gibst also Zellbereiche an? z.B.: G10:Q10
Frappante Idee! Werd' das mal versuchen. Ich war bisher in der Idee verhaftet die Zwischenräume zwischen meinen zehn vorgegebenen Werten auszufüllen. Dann geht das nicht. Meine Tabelle sieht aus wie die gezeigte, nur mit sehr vielen Zeilen. Die von Dir vorgeschlagenen Eingabe G10:Q10 hab' ich schon früh vergeblich ausprobiert.
, aber prinzipiell zumindest zunächt eine Formel:
Du übersiehst wohl nichts! So hatte ich das auch gemacht. Habe den SS nachträglich erstellt und dabei den Funktionsnamen irgendwie verschusselt.
Ich: Das passiert wohl eher in der i-Schleife:
Du: da passiert nichts Wesentliches
Ich meine schon. Denn hier wird festgelegt, wie die eingegebenen Werte übernommen werden. Offensichtlich so, dass man keine einzelnen Zellen bezeichnen kann, wie ich das in den Argumenten zu cubspline getan hatte und sie mit ";" trennte. Sondern so, dass man nur einen geschlossenen Bereich angeben kann. Wenn man das in der Funktion ändern könnte, wäre man wohl schon am Ziel.
KLar ist das Vorstehende nicht sehr hilfreich, ich wollte nur illustrieren das es mir nichts nutzt das ich programmieren kann wenn ich nichts von Splines verstehe und es bei der Programmierung, um Splines geht.
Das scheint mir eben hier nicht zwingend. Es geht m.A.n. nur um die (diskrete) Übernahme der Knoten und Werte. Da gibts ja noch weitere Funktionen die aufgerufen werden. Die greifen wahrscheinlich nur noch auf die übernommenen Werte zu und führen den eigentlichen Algorithmus aus.

Zu den kubischen Splines:
Zwischen zwei Punkte wird eine Parabel 3. Ordnung gelegt(Name), beginnend bei Punkt 1. Deshalb müssen die Knoten[ihre x-Werte] aufsteigend geordnet sein.
Ausser dem 1. und dem letzten Knoten sind alle Knoten Punkte zweier Parabeln [1:2;2:3;3:4; ...]. Weitere Bedingung ist, dass die Steigung beider Parabeln im gemeinsamen Knotenpunkt gleich ist. Denn dann gibt es keine Ecken. Außerdem müssen die zweiten Ableitungen gleich sein damit die Krümmung der beiden anstoßenden Parabeln gleich sind. Für den ersten und den letzten Knoten gibt es noch eine Anfangs- und einen Endbedingung. Z.B. Vorgabe der Steigungen.
N-Knoten führen also zu N-1 kubischen Parabelgleichungen mit jeweils vier Parametern. Dieses lineare Gleichungssystem ist dank der oben bezeichneten Bedingungen lösbar(Gauss Eliminationsverfahren). Es fallen die Parameter an. Dann werden damit die N Parabeln erstellt. Dann kann für den zu berechnenden Interpolationswert die zutreffende Parabel ausgesucht werden. Diesen Wert in die gefundene Parabelformel eingesetzt ergibt den gesuchten kubischen Spline-Interpolationswert.

grüsse pau


ps.: Mit kopieren meinte ich: Kann ich die Funktion irgendwie nach OO übernehmen(falls die da funkt).
Antworten