Aproksymacja krzywej wg punktów

0

Na wstępie powiem, że nie szukam rozwiązania w postaci kodu w C++ czy jakimkolwiek języku lecz opisu jad dokonać podobnego działania do opisanego poniżej.

Mam punkty, w równym odstępie mierząc po osi X znajdujące się na różnej wysokości Y - chcę uzyskać efekt podobny do tego jaki jest znany z arkusza kalkulacyjnego Excel - linia krzywa (nie łamana) aproksymowana dokładnie przez podane punkty. Pytanie brzmi, jak tego dokonać, jakiego algorytmu (opis) oni używają lub jaki polecacie do tej czynności.

Uzyskany efekt - krzywa przechodząca przez wskazane punkty lecz bez tworzenia dodatkowych przegięć pomiędzy nimi.

0

No wiesz wpiszesz w google
https://www.google.com/search?client=firefox-b-ab&ei=e_9iW5H1NMj76AT6oq-wBg&q=aproksymacja+algorytm&oq=aproksymacja+algorytm&gs_l=psy-ab.3..0j0i22i30k1l4.706.2069.0.3049.9.8.0.0.0.0.760.912.0j1j6-1.2.0....0...1.1.64.psy-ab..7.2.910....0.tyx6M7-G0-0

łącznie z wytłumaczeniem teorii. I przykładami, algorytm sobie wtedy sam dobierzesz.
edit:
wiesz odpisuje o google bo pytasz mega ogólnie.

5

dokładnie przez podane punkty

Interpolacja wielomianowa: http://www.algorytm.org/procedury-numeryczne/interpolacja-wielomianowa.html

0

ja mialem przeliczenia na studiach do aproksymacji liniowej y=ax+b moge poszukac

0

Ok. Dzięki, poczytam. Po prostu nie wiem jak się zabrać do zagadnienia. Napisanie kodu nie jest problemem.

1

Ja bym zastanowił się bardziej - po co? Inaczej mówiąc, jeśli to wyniki jakiś pomiarów to co da sztuczne połączenie punktów krzywą? Ktoś coś z tego będzie wnioskował? Przecież zarówno splajn jak i interpolacja Lagrange'a spełniają warunki z tematu, a dają kompletnie różne wyniki.

0
Saalin napisał(a):

Ja bym zastanowił się bardziej - po co? Inaczej mówiąc, jeśli to wyniki jakiś pomiarów to co da sztuczne połączenie punktów krzywą? Ktoś coś z tego będzie wnioskował? Przecież zarówno splajn jak i interpolacja Lagrange'a spełniają warunki z tematu, a dają kompletnie różne wyniki.

Tak jest bardziej estetycznie.
A merytorycznie - może chodzić o różniczkowalność w punkcie, ale matmę miałem wieki temu i może coś przekręcam.

0

@Shalom
to jest cudne. Pamiętam jak kiedyś robiłem grę-zgadywankę geograficzną i użyłem interpolacji wielomianowej do przeliczania współrzędnych piksela na mapie na współrzędne geograficzne (a nie było to 1:1, ponieważ mapa była w jakiejś specyficznej projekcji geograficznej, która zniekształcała wyniki).

Teraz bym pewnie użył jakiegoś Google Maps, czy innej tego typu usługi, ale wtedy z jakichś powodów tego nie zrobiłem. Więc ściągnąłem losową mapę Europy z wikipedii, a potem ręcznie w Excelu liczyłem te współczynniki i układałem ten wzór na aproksymację. Potem to wstawiłem do kodu i działało. Jak klikałeś w określone miejsce na mapie to przeliczało w dobrym przybliżeniu na rzeczywiste współrzędne.

1
Saalin napisał(a):

Ja bym zastanowił się bardziej - po co? Inaczej mówiąc, jeśli to wyniki jakiś pomiarów to co da sztuczne połączenie punktów krzywą? Ktoś coś z tego będzie wnioskował? Przecież zarówno splajn jak i interpolacja Lagrange'a spełniają warunki z tematu, a dają kompletnie różne wyniki.

Popieram.

Nie wszystko pamiętam z numeryki, ale założenie przejścia przez wszystkie punkty rzeczywiście jest "źle umodelowane". Jeden odchylony ("niedokładny") punkt, i wszystko tonie w oscylacjach.

0

Hej,
myślę, że zagadnienie jest skomplikowane... dlatego, że jest podane bardzo ogólnie... Podaj może jakiś przykład... będzie łatwiej się wypowiedzieć... I jeżeli to nie tajmenica napisz może po co chcesz interpolować... to też może co nieco pomóc w nasunięciu metody wyznaczania tej krzywej...

3
Ada 2 napisał(a):

Na wstępie powiem, że nie szukam rozwiązania w postaci kodu w C++ czy jakimkolwiek języku lecz opisu jad dokonać podobnego działania do opisanego poniżej.

Mam punkty, w równym odstępie mierząc po osi X znajdujące się na różnej wysokości Y - chcę uzyskać efekt podobny do tego jaki jest znany z arkusza kalkulacyjnego Excel - linia krzywa (nie łamana) aproksymowana dokładnie przez podane punkty. Pytanie brzmi, jak tego dokonać, jakiego algorytmu (opis) oni używają lub jaki polecacie do tej czynności.

Uzyskany efekt - krzywa przechodząca przez wskazane punkty lecz bez tworzenia dodatkowych przegięć pomiędzy nimi.

Właściwie to jak przegniesz z punktami w Excelu to też Ci wyrysuje z oscylacjami i przegięciami, numeryka to numeryka :)

Btw. jedno uściślenie które ułatwi Ci szukanie informacji - przybliżanie funkcji inną, która przechodzi przez wszystkie zadane punkty, to interpolacja. Wada jest taka, że im więcej punktów, tym więcej oscylacji bo funkcja (zwykle wielomian) dopasowuje się na siłę do punktów i powstają oscylacje. Aproksymacja daje funkcję zadanego typu (np. wielomian tego i tego rzędu czy np. eksponenta) która daje najmniejszy błąd dla zbioru punktów (tj. najmniejsze średnie, a na ogół średnio-kwadratowe odchylenia od punktów które aproksymuje) ze wszystkich możliwych funkcji tego typu. Wyznacza się ją tak, że bierzesz wzór na błąd (zwykle suma po kwadratach odchyleń w punktach) i różniczkujesz po kolei po parametrach funkcji aproksymującej (np. współczynnikach wielomianu). Z racji tego, że współczynniki występują w pierwszej potędze, to po zróżniczkowaniu błędu po wszystkich współczynnikach dostaniesz układ równań liniowych mający tyle zmiennych, ile masz parametrów :) Była chyba jeszcze jakaś inna metoda, ale w sumie już jej nie pamiętam. Może Ci się przyda jakbyś chciała wyznaczać linię trendu albo coś :)

Z opcji masz jeszcze interpolację ale wykonywaną nie na wszystkich punktach wykresu, a tylko wybranym podzbiorze (dla danego punktu), np. wspominany tu B-splines to w sumie interpolacja krzywej parametrycznej z "okolicznych punktów". Dzięki temu, że B-splines (i NURBS) interpolują krzywą także z punktów sąsiadujących z dwoma punktami, które ma połączyć krzywa, pozwalają uzyskać gładkie przejścia (ciągła pierwsza pochodna) między poszczególnymi "przedziałami". Gdyby z kolei zrobić interpolację jak funkcjami kształtu z MES tj. podzielić przedziały na grupy po np. 3 (4 punkty, graniczne są wspólne) i interpolować całość krzywej przechodzącej przez dane 4 punkty, mielibyśmy też wielomiany 3 stopnia, ale nie byłyby zapewne gładkie na granicach, a miały mniejsze lub większe załamania :)

Brzydkie rysunki poglądowe - ten ilustruje jak to wygląda w przypadku pojedynczego fragmentu B-spline'a - bierzemy 4 punkty, ale krzywa łączy tylko dwa:

screenshot-20180802210157.png

Tutaj interpolacja funkcjami kształtu 3 rzędu - widać że na granicy (w punkcie p2) mamy "załamanie" zamiast gładkiego przejścia:

screenshot-20180802215955.png

Jeśli potrzebujesz tego po prostu aby narysować wykres, to w sumie nie masz chyba po co zawracać sobie głowy funkcjami kształtu, bo efekt nie będzie aż tak ładny, szczególnie dla małej liczby punktów. Z drugiej strony, jeśli potrzebujesz tej interpolacji do jakichś konkretniejszych obliczeń, a nie po to, by wyglądało ładnie, to w sumie funkcje kształtu mogą być lepszym wyborem. Słyszałem wprawdzie o kimś, kto kombinuje nad wykorzystaniem NURBS w MES, ale nie znam zbyt wielu szczegółów, nie chcę zgadywać, a nie spotkałem się jeszcze z wykorzystaniem jakichkolwiek krzywych sklejanych w sofcie symulacyjnym, choć może za mało się interesowałem :)

Nieważne, popłynąłem. Możesz przyjąć, że bierzesz w zasadzie dowolną liczbę punktów w otoczeniu punktu, w którym interpolujesz. Im więcej, tym wyższy rząd wielomianu uzyskasz. W B-splinach każdą współrzędną interpolujesz ze współrzędnych 4 punktów, więc dostajesz wielomian 3 rzędu - wystarczająco wysokiego, by uzyskać gładkie krzywe dobrze przybliżające większość kształtów, ale na tyle niskiego, że raczej nie ma jakichś dziwnych oscylacji - no chyba, że masz jakiś znaczny skok wartości między dwoma punktami, wtedy w pobliżu mogą się i tak pojawić niechciane przegięcia. Gdybyś wzięła 6 punktów do interpolacji, miałabyś wielomian 5 rzędu (i pewnie te niechciane oscylacje). Dla 2 punktów interpolujesz po prostu odcinkiem. Ogólnie dla n punktów istnieje dokładnie 1 wielomian n-1 rzędu, który przez wszystkie te punkty przechodzi. Możesz poeksperymentować z różnymi rzędami wielomianów i zobaczyć, który da Ci najbardziej zadowalający rezultat :) Zarówno z krzywymi sklejanymi, jak i trochę bardziej uproszczonym wariantem z podziałem

I jeszcze łap materiały o interpolacji do poduszki, tylko uprzedzam, że nie jest to napisane językiem przyjaznym ludziom biorącym wszystko "na chłopski rozum" (jak ja na przykład):
http://home.agh.edu.pl/~szeliga/dydaktyka/MN/main-Interpolacja.pdf

A tu masz dla przykładu opisane (od strony 5) funkcje kształtu, które wykorzystywane są do takiego "lokalnego" interpolowania wartości funkcji na pewnym zadanym podobszarze (w elemencie skończonym). To te, które nie dają gładkich przejść:
http://www.metal.agh.edu.pl/~milenin/Dydaktyka/MES/MileninGL7-8_pl.pdf

0

Hej,
w dalszym ciągu podbijam pytanie jakiego rodzaju są to punkty, od tego może wiele zależeć... jeżeli jest to fragment sygnału (to znaczy jego dyskretyzacja), to można próbować aproksymować funkcjami trygonometrycznymi... w zależności od rodzaju punktów, można je przetransformować... na przykład wykładniczo lub logarytmicznie... i wtedy szukać funkcji najlepszego dopasowania, na przykład używając metody najmniejszych kwadratów... Poczytaj może też o wzorze interpolacyjnym Czebyszewa...

1 użytkowników online, w tym zalogowanych: 0, gości: 1