Aproximarea curbei (zgomotul și netezirea vârfurilor într-o serie numerică) - depășirea stivei în limba rusă

Există o matrice unidimensională (de câteva mii de elemente) de numere reale. Dacă trasăm un grafic al acestor valori, vedem că există o anumită fluctuație (răspândire) a valorilor (cu câteva vârfuri ascuțite).







Exemplu (pentru claritate, intervalele de măsurare sunt uniforme):

  • Citirea temperaturii
  • Nivelul luminii
  • Încărcarea bateriei
  • Nivelul lichidului
  • și așa mai departe.

ref. 10 12 15 40 17 16 12 10 22 12 14 15 14 10 12
netezită.

10 13 15 16 16 14 12 16 14 13 14 14 13 11 12

Este necesar să nu creșteți numărul de puncte pentru a netezi citirile:

Aproximarea curbei (zgomotul și netezirea vârfurilor într-o serie numerică) - depășirea stivei în limba rusă

(schiță grosieră: "linie netezită" - citiri fără sărituri bruște)







Este clar că acest lucru necesită o aproximare a datelor, dar pentru câteva zile acum mi se pare dificil să dau algoritmul de aproximare a curbei Bezier la forma cerută:

unde p1 este valoarea intermediară netezită între doi vecini, t = 0,5 (în funcție de ideea că valoarea intermediare trebuie luată tocmai la 0,5).

Apoi am găsit algoritmul aici. și el însuși este prezentat aici.
Dar acest algoritm nu este potrivit pentru că lucrăm la maxim 32 de puncte, iar cu factoriali va dura prea mult pe JS, dacă e deloc. Și pentru a scrie algoritmul fără factoriali (este posibil, dacă credeți formulele de pe Wikipedia), nu pot.

De asemenea, puteți folosi formula dată de mine și o puteți plimba pe rând, dar nu cred că aceasta este o idee bună. Dacă ai putea folosi mai mult de 32 de puncte la un moment dat (cel puțin 100 de puncte), atunci ar fi mai distractiv. Dar nu știu cum să scriu formula prin care să scriu algoritmul.

Stie cineva cum să netezi seria de numere „zgomot“ și „vârfuri“?
Voi lupta mai mult de o zi, dar ceva se dovedește a fi determinat cu algoritmul.
Nu sunt foarte matematică, așa că nu pot trece prin teorie la formula.
Sper că cineva mă va ajuta cu asta.

Am încercat să folosesc "media mobilă" (la sfatul lui @lampa), dar datele sunt foarte denaturate. Iată codul (nu mi sa părut că am, dar cine știe):

Dar, ca rezultat, cu toate acestea, m-am oprit pe versiunea initiala - netezirea Bezier (curba patratica):

Pasajele 4-ri dau un rezultat satisfăcător.

PS Dacă nu există o opțiune mai bună, atunci voi sta pe această opțiune.

Uite, am venit cu asta:







Articole similare

Trimiteți-le prietenilor: