Funktion zur Kurve finden
-
mathedepp schrieb:
Feld mit Zahlen drin.
Und diese Zahlen sind der f(x)-wert, während die Position im Feld der x-Wert ist, nicht wahr? Also hast du schon Punkte.
Nimm von denen welche, d.h den ganz linken, den ganz rechten und 2 aus der Mitte, so dass der Abstand der Punkte etwa ähnlich ist. Für einen kubischen Spline brauchst du 4 Punkte.
Wenn es feiner werden soll, dann nimm 8, 12, 16, etc. Punkte, bzw. 2, 3, 4 Splines.
-
Dann habe ich Kontrollpunkte, die ich interpoliere. Ich wollte aber eine Funktion.
-
Was genau verstehst du unter einer Funktion? Du hast doch schon eine Punktmenge.
Du kannst auf jeden Fall jede (x,y)-Menge durch eine Polynomfunktion darstellen, nämlich bei N Punkten ein Polynom (N-1)ten Grades, aber als kompakt wird man die Funktion dann wohl nicht mehr ansehen (außer bei kleinen N).
-
mathedepp schrieb:
Dann habe ich Kontrollpunkte, die ich interpoliere. Ich wollte aber eine Funktion.
Splines sind Funktionen bzw. Polynome (für ein begrenztes Intervall).
-
Sorry, offenbar stelle ich die Frage nicht richtig.
Ihr verlagert das Problem einfach nur, ohne es zu lösen. Jetzt habe ich eine Punktmenge und Splines, aber immer noch keine Funktion, die effizient zwischen den Punkten interpoliert.
Wären die Daten einer simple Sinuskurve, dann möchte ich keine Kontrollpunkte, sondern eine Funktion (sin), eine Amplitude, eine Frequenz und einen Offset. Wie finde ich heraus, dass es eine Sinuskurve ist?
-
mathedepp schrieb:
Wären die Daten einer simple Sinuskurve, dann möchte ich keine Kontrollpunkte, sondern eine Funktion (sin), eine Amplitude, eine Frequenz und einen Offset. Wie finde ich heraus, dass es eine Sinuskurve ist?
Punkte plotten und angucken. Wenn es aussieht wie Sinus, dann nimm Sinus. Das kannst du besser als dein Computer.
-
Oh, genial. Das ist ja die ultimative Lösung für alles. Warum programmieren, wenn man auch einfach mal hingucken kann? Sogar CAPTCHAS lassen sich damit lösen. Einfach sechzig Millionen Chinesen einstellen, gibt ja genug davon.
-
mathedepp schrieb:
Oh, genial. Das ist ja die ultimative Lösung für alles. Warum programmieren, wenn man auch einfach mal hingucken kann? Sogar CAPTCHAS lassen sich damit lösen. Einfach sechzig Millionen Chinesen einstellen, gibt ja genug davon.
Ja, was du suchst ist eigentlich eine Mustererkennung.
-
...wir sind immer noch am Ausgangspunkt, nur dass die Kurve jetzt "Muster" heißt.
Vielleicht jemand mit einer brauchbaren Antwort?
-
Du stellst zwei Anforderungen: Erstens: die Funktion muss durch alle Stützpunkte gehen. Zweitens: Sie soll symbolisch möglichst "kompakt" sein. Ersteres erfüllt jedes Interpolationspolynom. Letzteres musst du erst mal sauber definieren. Die einzige Möglichkeit, die ich noch sehe, ist, dass du einen Katalog an Funktionen mit variablen Parametern vorbereitest, die du als "kompakt" charakterisierst und entsprechend versuchst, deine Kurvenparameter an die Daten zu fitten. Das setzt aber schon etwas Wissen darüber voraus, wie die Kurven ausschauen werden.
-
Kommunikationsproblem. Andromeda beantwortet deine Frage, als hätte sie ein Mathematiker gestellt, der den mathematischen Funktionsbegriff meint. Du meinst aber irgendeinen nebulösen Funktionsbegriff, wie sich vielleicht ein absoluter Mathedepp vorstellt, was "Funktion" bedeutet. Du solltest Andromeda nicht vorwerfen, dass du dich nicht mathematisch korrekt auszudrücken vermagst, ganz besonders nicht in dem Tonfall. Da dir anscheinend das Wissen fehlt, deine Wünsche genau auszudrücken, versuch es doch einmal mit ein paar ganz konkreten Beispielen, was du möchtest und was nicht.
-
Du meinst aber irgendeinen nebulösen Funktionsbegriff, wie sich vielleicht ein absoluter Mathedepp vorstellt, was "Funktion" bedeutet.
Funktion: Abbildung von Eingabe- zu Ausgabewerten. Ziemlich einfach.
Du solltest Andromeda nicht vorwerfen, dass du dich nicht mathematisch korrekt auszudrücken vermagst, ganz besonders nicht in dem Tonfall.
Hier gibt es keinen Tonfall, und Vorwürfe bis gerade eben auch nicht. Ich stelle die Frage so korrekt, wie es mir möglich ist, und habe mich für die Ungenauigkeiten sogar entschuldigt. "Einfach mal hingucken" ist halt eine beschissene Antwort, oder etwa nicht?
Da dir anscheinend das Wissen fehlt, deine Wünsche genau auszudrücken, versuch es doch einmal mit ein paar ganz konkreten Beispielen, was du möchtest und was nicht.
Okay:
Dann habe ich Kontrollpunkte, die ich interpoliere. Ich wollte aber eine Funktion.
Wären die Daten einer simple Sinuskurve, dann möchte ich keine Kontrollpunkte, sondern eine Funktion (sin), eine Amplitude, eine Frequenz und einen Offset. Wie finde ich heraus, dass es eine Sinuskurve ist?
So vielleicht? Besser kriege ich es nicht hin.
einen Katalog an Funktionen mit variablen Parametern vorbereitest, die du als "kompakt" charakterisierst und entsprechend versuchst, deine Kurvenparameter an die Daten zu fitten. Das setzt aber schon etwas Wissen darüber voraus, wie die Kurven ausschauen werden.
Hey, eine hilfreiche Antwort, vielen Dank. Also im Prinzip das Vorgehen, dass ich im Ausgangsbeitrag skizziert habe? Rumprobieren, bis es möglichst gut passt? Ich hoffte, dass es was besseres gibt.
-
mathedepp schrieb:
Also im Prinzip das Vorgehen, dass ich im Ausgangsbeitrag skizziert habe? Rumprobieren, bis es möglichst gut passt? Ich hoffte, dass es was besseres gibt.
Ja, es gibt sehr viele Fitting-Algorithmen, die wesentlich besser als Brute Force sind. Dafür einfach mal Google bemühen. Und dann im nächsten Schritt nicht selber programmieren, sondern schon bestehende Programme/Libraries nutzen.
-
Jodocus schrieb:
Fitting
Siehste, ich bin zwar voll der dumme Depp und mein Tonfall ist Scheiße, aber mir fehlte nur ein einziges Wort, das mein Problem beschreibt. Danke dir.
-
mathedepp schrieb:
Ich bin ein totaler Mathe-Idiot und weiß gar nichts.
Nun habe ich ein beliebiges zweidimensionales Diagramm und möchte gerne ein Programm schreiben, das selbstständig eine möglichst kompakte Formel ermittelt, die das Diagramm möglichst exakt reproduziert.
Nach meinem aktuellen Wissensstand würde ich eine Anzahl von Sinus-Kurven mit zufälliger Frequenz und Amplitude modulieren, und das beste Ergebnis iterativ mit dem gleichen Verfahren zu verbessern versuchen, bis ich nahe genug am Ergebnis bin.
Eventuell würde ich mehr über Fourier-Transformation lernen, um als Startpunkt die Frequenzen besser als rein zufällig abschätzen zu können.
Wie geht jemand vor, der weniger dumm ist?
Was Du brauchst hängt von vielen Dingen ab. Ein Patentrezept für Kurve->Funktion gibt es nicht. Was für eine Kurve ist das denn? Du erwähnst hier eine Fouriertransformation. So ein Ansatz macht Sinn, wenn Du eine periodische Funktion hast oder wenn Du durch diesen Ansatz bestimmte Dinge direkter sehen kannst.
Du solltest glaube ich generell ein bisschen Modellierung der Kurve in Deinen Ansatz stecken. Welche Eigenschaften von der Kurve kennst Du? An welchen Stellen möchtest Du das Verhalten der Kurve besonders genau beschreiben? Weißt Du, wie die Kurve entsteht?
-
@MatheDepp
Du willst aus einem zweispaltigen Array mit X und Y- Wertepaaren eine Diagramm- Kurve darstellen als Funktion Y=f8X) mit welcher Du an jedem Zwischenwert für X einen interpolierten Y- Wert berechnen kannst?
Dann Google mal nach stückweiser Interpolation!
Oder mach einfach:
- Unterteile das Array in Teilstücke
- erstelle für jedes Intervall zw. zwei X- Werten zwei Quadratische Funktionen
- derart, dass beide durch die angrenzenden Punkte verlaufen UND jeweils
- durch den Startpunkt des voherigen Abschnittes bzw.
- durch den Endpunkt des folgenden Abschnittes verläuft
. mit zwei gegenläufigen Gewichtsfunktionen f(t) multiplizierst Du
beide Qudratischen Funktionen und addierst das Ergebnis.
- Laufparameter läuft für jedes Segmen 0.0. .. 1.0
Die Summe beider Gewichrtsfunktionen muss für alle t 1.0 ergeben
- Die Werte- Parre im Array müssen nach aufsteigenden X- Werten sortiert sein!- am besten geht das mit kubischen Gewichtsfunktionen.
Ergebnis mit geeigneten Gewichtsfunktionen:
Eine Funktion mit folgenden Eigenschaften:
- Funktion im gesamten Bereich "Quasistetig"
=> Verlauf geht durch alle Stützpunkte,
- Anstieg rechtseitig UND linksseitig der Kontrollpunkte gleich
=> tangentialer Verlauf.
- Auch die 2. Ableitung ist im gesamten Bereich "Quasistetig"!"Quasistetig bedeutet:
Obwohl für jeden Abschnitt andere Funktionen berechnet werden ist der resultierende Gesamtverlauf als stetig zu betrachten- von Rundungsfehlern am Übergang abgesehen.Wenn Du das geeignet in ne DLL packst, kannste das wie EINE normale Funktion benutzen ) Y= Funktion (X)
Sone DLL klappt prima auch in Fremdprogrammen! (Ist so getestet)
Gruss
Frank