Choisir une meilleure équation pour le modèle mathématique
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 NonlinearModelFit
modè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
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.