Choisir une meilleure équation pour le modèle mathématique

Aug 15 2020

Je travaille sur un projet de géométrie computationnelle et je regarde le même code Mathematica depuis un moment maintenant pour essayer de comprendre quelque chose. J'en suis venu à la conclusion que mes connaissances mathématiques sont insuffisantes en ce qui concerne la façon de sélectionner l'équation à paramétrer.

L'équation $a Sin[b t] + C$ne se comporte pas comme prévu, je suis surtout familier avec la théorie des probabilités et l'apprentissage automatique. Je soupçonne que mon équation a besoin d'un autre degré de liberté pour modéliser avec précision les données fournies par un polynôme? Une exponentielle? Série de Fourier? Je ne sais pas comment passer en toute confiance à la prochaine étape pour l'améliorer.

Le projet nécessite que le modèle accepte des courbes arbitraires. Dans le cas de notre exemple représenté par un échantillonné uniformément BsplineCurve. Lorsque le modèle est tracé,$263.653 sin(1.03716 t)+1670.19$ne reproduit pas les données avec précision. J'ai accédé aux propriétés du NonlinearModelFitmodèle et outre l'erreur étant très grande, rien ne ressort vraiment de la façon d'améliorer la sélection d'une équation à modéliser. Considérant que dans le domaine de l'apprentissage automatique, nous trouvons les paramètres de grandes matrices, je suppose qu'il est possible de trouver de meilleures classes de fonctions qui correspondent aux données? Quelles sont certaines méthodes pour rendre l'équation sélectionnée plus adaptable aux données? De quel domaine des mathématiques puis-je me tourner pour plus d'informations? Je prendrai toutes les idées car ce problème chevauche probablement différentes branches.

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

Réponses

1 Rubus Aug 15 2020 at 20:11

En jouant avec libre office calc, j'ai trouvé un polynôme de degré 7 (x ^ 7) pour adapter vos données plus précisément.

Voir

Peut-être utiliser des polynômes comme classe de fonctions au lieu de fonctions trigonométriques.