Scegliere un'equazione migliore per il modello matematico

Aug 15 2020

Sto lavorando a un progetto di geometria computazionale e ho guardato lo stesso codice di Mathematica per un po 'di tempo cercando di capire qualcosa. Sono giunto alla conclusione che le mie conoscenze matematiche sono carenti per quanto riguarda il modo in cui selezionare l'equazione da parametrizzare.

L'equazione $a Sin[b t] + C$non si sta comportando come previsto, io per lo più ho familiarità con la teoria della probabilità e l'apprendimento automatico. Sospetto che la mia equazione necessiti di un altro grado di libertà per modellare accuratamente i dati forniti da un polinomio? Un esponenziale? Serie di Fourier? Non sono sicuro di come fare con sicurezza il passo successivo per migliorarlo.

Il progetto richiede che il modello accetti curve arbitrarie. Nel caso del nostro esempio rappresentato da un campione uniformemente BsplineCurve. Quando il modello viene tracciato,$263.653 sin(1.03716 t)+1670.19$non riproduce i dati in modo accurato. Ho avuto accesso alle proprietà del NonlinearModelFitmodello e oltre all'errore che è molto grande, non spicca davvero nulla su come migliorare la selezione di un'equazione da modellare. Considerando che nel campo del machine learning troviamo i parametri di grandi matrici, presumo sia possibile trovare classi di funzioni migliori che si adattano ai dati? Quali sono alcuni metodi per rendere la mia equazione selezionata più modificabile per i dati? A quale dominio della matematica posso rivolgermi per maggiori informazioni? Prenderò qualsiasi idea poiché questo problema probabilmente si sovrappone a rami diversi.

(* 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 *)

Risposte

1 Rubus Aug 15 2020 at 20:11

Solo giocando con libre office calc ho trovato un polinomio di grado 7 (x ^ 7) per adattare i tuoi dati in modo più accurato ..

Vedere

Forse usa i polinomi come una classe di funzioni invece di funzioni trigonometriche.