Funktion zur Kurve finden



  • 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.


  • Global Moderator

    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