Escolhendo uma equação melhor para o modelo matemático

Aug 15 2020

Estou trabalhando em um projeto de geometria computacional e tenho examinado o mesmo código do Mathematica por um tempo tentando descobrir algo. Cheguei à conclusão de que meu conhecimento matemático é deficiente no que diz respeito a como selecionar a equação a ser parametrizada.

A equação $a Sin[b t] + C$não está se comportando como esperado, já que estou bastante familiarizado com a teoria da probabilidade e o aprendizado de máquina. Eu suspeito que minha equação precisa de outro grau de liberdade para modelar com precisão os dados fornecidos por um polinômio. Um exponencial? Séries de Fourier? Não tenho certeza de como dar o próximo passo com confiança para melhorá-lo.

O projeto requer que o modelo aceite curvas arbitrárias. No caso do nosso exemplo representado por uma amostra uniformemente BsplineCurve. Quando o modelo é plotado,$263.653 sin(1.03716 t)+1670.19$não reproduz os dados com precisão. Acessei as propriedades do NonlinearModelFitmodelo e além do erro ser muito grande, nada se destaca sobre como melhorar a seleção de uma equação para modelar. Considerando que no campo do aprendizado de máquina encontramos os parâmetros de grandes matrizes, suponho que seja possível encontrar melhores classes de funções que se ajustem aos dados? Quais são alguns métodos para tornar minha equação selecionada mais adaptável aos dados? De qual domínio da matemática posso recorrer para obter mais informações? Vou levar algumas idéias, pois este problema provavelmente se sobrepõe a ramos diferentes.

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

Respostas

1 Rubus Aug 15 2020 at 20:11

Apenas brincando com o libre office calc, encontrei um polinômio de grau 7 (x ^ 7) para ajustar seus dados com mais precisão.

Vejo

Talvez use polinômios como uma classe de funções em vez de funções trigonométricas.