Aproksymacja krzywej wg punktów

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.

RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:43 minuty
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.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 3x, ostatnio: revcorey
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
5

dokładnie przez podane punkty

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
4
SA
  • Rejestracja:około 12 lat
  • Ostatnio:około godziny
  • Postów:1426
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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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.

SA
Estetycznie może i tak, ale błędne. Załóżmy np. że robimy pomiary rozszerzalności temperaturowej drutu. Mamy 20 pomiarów. Interpolowanie tego sugeruje, że wzór na rozszerzalność temperaturową jest wielomianem 19 stopnia, a można było po ludzku aproksymować funkcją liniową. I może nawet żaden punkt nie trafił na prostą, ale o ile to bliższe prawdy jest.
RE
@Saalin tylko pytanie co robisz. Są pewne algorytmy np. krzywe opisujące otwieranie się zaworów turbiny gdzie interpolacja jest jak najbardziej pożądana bo dostajesz pkt. gdzie na osi X masz wysterowanie z reg. turbiny a Y otwarcie zaworów(różne krzywe dla każdego zaworu) i tu interpolacja jest ok(z pkt. technicznego może mniej to ważne tu a bardziej z administracyjnego), chociaż można stosować tu aproksymację liniową dla dwóch pkt. A są takie sprawki gdzie to mało ważne czy interpolacja czy aproksymacja byle działało.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 godziny
  • Postów:8397
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.


Shalom
https://github.com/p4-team/ctf/tree/master/2018-06-16-midnightsun-finals/badchair_crypto tak w temacie aproksymacji wielomianowej i do czego można jej używac ;)
WeiXiao
@Shalom: Fajne zadanko. Też przykuło moją uwagę, jak patrzyłem na te arkusze z matury z infy jakoś 3 lata temu :)
LukeJL
takie coś dają na maturze z infy?
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:3561
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.


Bo C to najlepszy język, każdy uczeń ci to powie
hurgadion
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:www
  • Postów:259
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...

superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Kraków
  • Postów:1999
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


LU
Jeśli chodzi o isogeometric analysis to np. Rene de Borst dużo publikował
hurgadion
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:www
  • Postów:259
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...

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)