Auswahl einer besseren Gleichung für das mathematische Modell

Aug 15 2020

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 NonlinearModelFitModells 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

1 Rubus Aug 15 2020 at 20:11

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.