Auswahl einer besseren Gleichung für das mathematische Modell
Ich arbeite an einem Projekt für rechnergestützte Geometrie und habe mir seit einiger Zeit denselben Mathematica- Code angesehen, um etwas herauszufinden. Ich bin zu dem Schluss gekommen, dass meine mathematischen Kenntnisse hinsichtlich der Auswahl der zu parametrisierenden Gleichung unzureichend sind.
Die gleichung $a Sin[b t] + C$verhält sich nicht wie erwartet, ich bin meistens mit Wahrscheinlichkeitstheorie und maschinellem Lernen vertraut. Ich vermute, meine Gleichung benötigt einen anderen Freiheitsgrad, um die von einem Polynom bereitgestellten Daten genau zu modellieren. Ein Exponential? Die Fourierreihe? Ich bin mir nicht sicher, wie ich den nächsten Schritt zur Verbesserung sicher machen soll.
Das Projekt erfordert, dass das Modell beliebige Kurven akzeptiert. Im Fall unseres Beispiels wird dies durch eine einheitliche Stichprobe dargestellt BsplineCurve
. Wenn das Modell gezeichnet ist,$263.653 sin(1.03716 t)+1670.19$reproduziert die Daten nicht genau. Ich habe auf die Eigenschaften des NonlinearModelFit
Modells zugegriffen, und abgesehen davon, dass der Fehler sehr groß ist, fällt nichts wirklich auf, wie die Auswahl einer zu modellierenden Gleichung verbessert werden kann. Wenn man bedenkt, dass wir im Bereich des maschinellen Lernens die Parameter großer Matrizen finden, gehe ich davon aus, dass es möglich ist, bessere Funktionsklassen zu finden, die zu den Daten passen. Welche Methoden gibt es, um meine ausgewählte Gleichung an die Daten anzupassen? Aus welchem Bereich der Mathematik kann ich mich für weitere Informationen wenden? Ich werde alle Ideen nehmen, da dieses Problem wahrscheinlich verschiedene Zweige überlappt.
(* Original Function *)
f =
BSplineFunction[
controlpts]; (* Our user function *)
originalfunction =
ParametricPlot[f[t], {t, 0, 1},
PlotStyle ->
Directive[{Opacity[.2], AbsoluteThickness[5], Darker[Green]}]];
data = Table[f[t], {t, 0, 1, 1/49}];
(* Create Model *)
equ = a Sin[b t] + C;
model = NonlinearModelFit[data, equ, {a, b, C}, t];
modelpts = Graphics[
{AbsolutePointSize[8], Blue,
Point /@ MapThread[
List,
{Range[0, 8000, 8000/49],
Table[model // Normal, {t, 0, 8000, 8000/49}]}
]}
];
samplepoints = Graphics[
{AbsolutePointSize[3], Purple, Point /@ data} // Graphics
];
model["BestFitParameters"]
(* a -> 263.653, b -> 1.03716, C -> 1670.19 *)
Antworten
Ich habe nur mit libre office calc herumgespielt und ein Polynom vom Grad 7 (x ^ 7) gefunden, um Ihre Daten genauer anzupassen.
Sehen
Verwenden Sie möglicherweise Polynome als Funktionsklasse anstelle von trigonometrischen Funktionen.