Elección de una mejor ecuación para el modelo matemático

Aug 15 2020

Estoy trabajando en un proyecto de geometría computacional y he estado mirando el mismo código de Mathematica por un tiempo tratando de resolver algo. Llegué a la conclusión de que mi conocimiento matemático es deficiente en cuanto a cómo seleccionar la ecuación para parametrizar.

La ecuacion $a Sin[b t] + C$no se comporta como se esperaba, yo estoy mayormente familiarizado con la teoría de la probabilidad y el aprendizaje automático. Sospecho que mi ecuación necesita otro grado de libertad para modelar con precisión los datos proporcionados por un polinomio. ¿Un exponencial? ¿Series de Fourier? No estoy seguro de cómo dar con confianza el siguiente paso para mejorarlo.

El proyecto requiere que el modelo acepte curvas arbitrarias. En el caso de nuestro ejemplo representado por una muestra uniforme BsplineCurve. Cuando se traza el modelo,$263.653 sin(1.03716 t)+1670.19$no reproduce los datos con precisión. Accedí a las propiedades del NonlinearModelFitmodelo y, además de que el error es muy grande, nada destaca sobre cómo mejorar la selección de una ecuación para modelar. Teniendo en cuenta que en el campo del aprendizaje automático encontramos los parámetros de matrices grandes, supongo que es posible encontrar mejores clases de funciones que se ajusten a los datos. ¿Cuáles son algunos métodos para hacer que mi ecuación seleccionada sea más adaptable a los datos? ¿De qué dominio de las matemáticas puedo recurrir para obtener más información? Tomaré algunas ideas, ya que este problema probablemente se superponga a diferentes ramas.

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

Respuestas

1 Rubus Aug 15 2020 at 20:11

Simplemente jugando con libre office calc, encontré un polinomio de grado 7 (x ^ 7) para ajustar sus datos con mayor precisión.

Ver

Tal vez use polinomios como una clase de funciones en lugar de funciones trigonométricas.