Hallo zusammen,
ich habe ein kleines Problem und stecke fest. Mein Ziel ist es eine
Funktion zu implementieren, welche eine Funktion (z.B. im Bild rot) in N
lineare Stücke unterteilt. Klar, optisch würde man die Punkte 0,5, 12,
13.5, 25,... als Stützstellen wählen. Würde man dazwischen linear
interpolieren hätte man eine sehr geringe Abweichung zur Funktion.
Nun meine Frage: Gibt es einen Algorithmus der mir die optimalen
Stützstellen berechnet (am besten kann ich auch noch auswählen wie viele
Stützstellen ich gerne hätte) oder irgendwas das dieses Problem/diese
Aufgabe mathematisch beschreibt, sodass ich selbst einen Algorithmus
entwerfen kann?
Hintergrund ist der, dass ich meinem Regler nur Wertepaare übergeben
kann, zwischen denen er linear interpoliert und sich die Wertepaare
(also Kurve) hierfür mit der Zeit ändert. Ist auch dabei hilfreicher
eine Funktionsgleichung zu haben reichen die Wertepaare aus dem Plot
hierbei aus?
Ich hoffe ihr versteht was ich meine und könnt mir auf die Sprünge
helfen
Liebe Grüße,
Max
Hast du die Funktion zur Verfügung? Sonst würd ich sagen schau dir die
Änderungsrate der Steigung (2te Ableitung) der Funktion an. Wenn sich
die Steigung schnell ändert, kleinere Diskretisierungsabstände und bei
geringer Änderung bzw. konstanter Steigung größere Abstände.
Eine Frage wäre noch, ob die Stützstellen äquidistant sein müssen oder
nicht.
Eine fertige Implementierung dafür kenne ich leider nicht.
Aber in beiden Fällen wäre das ein Minimierungsproblem dahingehend, dass
die Summe der Abweichungen von lineare Regressionen zwischen
Stützpunkten minimiert werden soll. Was die Wahl der Stützpunkte
betrifft, würde ich spontan, beginnend mit den Anfangs- und Endpunkten
jeweils die Mitte wählen und diesen Punkt dann verschieben bis die Summe
minimal ist. Dann die beiden neuen Bereiche wieder so behandeln bis
entweder die Anzahl der maximalen Stützpunkte erreicht ist oder die
Summe der Abweichungen eine Schwelle unterschreitet. Das kann natürlich
auch fehlschlagen.
Lars Schmitt schrieb:> Octave (frei zugängliches Matlab) bietet Polyfit oder Splinefit an. Oder> welche Plattform möchtest du benutzen?
Wenn ich polyfit und Splinefit recht verstehe ergibt das keine lineare
Funktion. Im Falle von polyfit lässt sich der Grad zwar auf 1 setzen,
aber dann bleibt das Problem der Wahl der Bereiche.
Aber da wird sich was draus machen lassen denke ich.
Ein Problem sind noch die lokalen Minima bei meinem Ansatz.
Hallo zusammen,
danke für die vielen Antworten! Ich versuche mal alle Fragen zu
beantworten
@Flo
Eine Funktion habe ich nicht zur Verfügung, werde aber versuchen die
Arbeitspunkte mit einer Funktion Anzunähern. Die Funktion sollte dabei
folgende Kriterien erfüllen: Start bei (0|0), dann Wendepunkt, dann
Hochpunkt, nächster Wendepunkt, konvergiert gegen 0 für t=inf. Eine
Funktion die diese Kriterien erfüllt und genug Freiheitsgrade bietet um
jeden dieser markanten Punkte zu verschieben (=>Stauchen, Strecken,
usw.) habe ich noch nicht gefunden. Hätte jmd. einen guten Ansatz
hierfür?
@Lexington
Nein, die Stützstellen müssen nicht äquidistant sein. Dein Ansatz ist
gut, führt aber nicht zum optimalen Ergebnis wenn ich durch die
Halbierung ein evtl. bereits lineares Stück durchschneiden. Deshalb
würde ich lieber versuchen die Kurve mit einer Funktion zur beschreiben
und irgendwie daraus die besten Stützpunkte zu berechnen.
@Flo, Lexington
Ich nutze MATLAB und habe auch die optimization toolbox welche das
Curve-Fitting-Tool bietet. Jedoch habe ich hier nicht die Möglichkeit
die Anzahl der Stützstellen vorzugeben. Dieses Tool nutze ich nur, um
die Koeffizienten für die noch unbekannte Funktion aus den
Arbeitspunkten zu bestimmen.
Ich freue mich auf eure Antworten
Lg
Ich würde um die zu implementierende Funktion einen Toleranzschlauch
legen und dann mit Geradenstücken immer wechselseitig daran anstoßen.
D.h. man gibt den Fehler vor und daraus ergibt sich die nötige Anzahl
der Stützstellen.
Könnte man z.B. als Excel-Sheet machen.
Max schrieb:> @Lexington> Nein, die Stützstellen müssen nicht äquidistant sein. Dein Ansatz ist> gut, führt aber nicht zum optimalen Ergebnis wenn ich durch die> Halbierung ein evtl. bereits lineares Stück durchschneiden.
Da stimme ich Dir zu, aber wer zwingt Dich denn dazu, einen schon
linearen Abschnitt, noch einmal zu teilen? Lass es doch einfach.
> Deshalb> würde ich lieber versuchen die Kurve mit einer Funktion zur beschreiben> und irgendwie daraus die besten Stützpunkte zu berechnen.
Führe doch lieber eine Abbruchbedingung ein. Das ist einfacher.
Ich will mal folgendes dazu bemerken:
1. Die einfachste Lösung der Approximation einer arbiträren Wertefolge
ist die Abschnitte einfach zwischen den Stützstellen (ein Arbeitspunkt
ist etwas völlig anderes) zu wählen.
1.a. Das verfälscht einen insgesamt nicht-linearen Zusammenhang.
1.b. Eine Modellfunktion aber haben wir nicht. Das wäre das nächst
Bessere um die Approximation zu verbessern.
2. Ausgehend von 1. willst Du aber lieber längere lineare Abschnitte.
2.a. Nimmst Du nun den nächsten Stützpunkt dazu, dann verändert sich das
Bestimmtheitsmaß oder es tut es nicht. Im letzteren Fall, ist es gut. Im
ersteren, wird das Bestimmtheitsmaß schlechter. (Besser kann es nicht
werden, denn zwischen zwei nebeneinanderliegenden Stützstellen und unter
der Voraussetzung, dass die nicht gemessenen Zwischenwerte eine linearen
Zusammenhang haben, kann es nicht "linearer" werden).
3. Eine andere Betrachtungsweise geht von der zweifachen, numerischen
Differentiation aus. Die erste Ableitung wird in linearen Abschnitten
konstant sein (aber nicht notwendigerweise 0). Die zweite wird dort dann
0 sein.
3.a. Es ergeben sich also Abschnitte in denen die zweite Ableitung 0 ist
- dort ist die Funktion schon linear und andere in denen das nicht der
Fall ist.
3.b. In diesen nicht-linearen Abschnitten hast Du nur die Wahl, eine
lineare Approximation zu wählen deren Abweichung einen bestimmten
Mindestwert hat, oder den Abschnitt noch einmal zu unterteilen. Im
Extremfall bis die Abschnitte mit den Stützstellen übereinstimmen (das
ist ja, wie unter 1. beschrieben zwingend linear [wenn man von der
linearität des zugrundeliegenden Modells ausgeht]).
4. Es mag zwar unter bestimmten Voraussetzungen wichtig sein, dass man
eine Funktion erhält, die etwa einem gegebenen x-Wert den nächst
grösseren zuordnet, für den die lineare Approximation noch eine
Null-Abweichung ergibt (oder eben eine Abweichung unterhalb einer
Schwelle), aber das ist nur eine Verfahrensfrage bei der man sich fragen
sollte, ob es den Aufwand wert ist. Mal abgesehen davon, wie das denn
gehen sollte. Ob das nun vielleicht auch eine Funktion ist, die einem
Vektor einen anderen Vektor zuordnet etc. ist für meine Begriffe nur
eine Detailfrage.
Das Hauptproblem an sich scheint mir zu sein, dass kein impliziter
Zusammenhang zwischen den Stützstellen und der Linearität ihrer
angrenzenden Abschnitte besteht. Immer vorausgesetzt, es gibt keine
Modellfunktion. Selbst wenn es eine Modellfunktion gäbe, dann stellte
sich immer noch das Problem wiederum einen Operator zu definieren, der
aus der Modellfunktion eine Funktion macht, die Stützstellen auswählt.
Vermutlich ist das möglich, aber sicher ist das nicht trivial (oder es
liegt jenseits meiner Fähigkeiten).
Ich mag mich ja täuschen, aber dann scheint es mir wesentlich einfacher,
so ein Verfahren, wie ich es vorschlug anzuwenden.
Das Du dabei mal selbst ein wenig denken musst, weil mein Kochrezept mal
eine Abbruchbedingung auslässt, liegt daran, dass ich das hier
freiwillig und kostenlos mache - es also nicht zu Ende ausführe. Das
erwarte ich von Dir. Ansonsten mache ich Dir gerne ein kostenpflichtiges
Angebot.
Ich fühle mich jedenfalls dadurch bestätigt, dass Peter etwas den
Grundlagen nach Äquivalentes wie ich vorschlägt - falls ich ihn richtig
verstehe.
Der Toleranzschlauch ist nur eine andere (soweit ich das gerade
überblicke, nicht vollständige) Darstellung des minimal nötigen
Bestimmtheitsmaßes. Es ergibt sich eine Schar von Geraden für jeden
möglichen Abschnitt, der innerhalb des Toleranzschlauches liegt.
Das Problem ist nun, einen Abschnitt und darin eine der Geraden
auszuwählen - und dazu noch, dabei eine stetige Gesamtfunktion zu
erhalten. Ich komme gerade nicht darauf, wie Peter sich das im Detail
vorstellt, aber vielleicht erklärt er das ja noch, wenn er Lust dazu
hat.