Aproksymacja wielomianowa(?) (funkcji dyskretnej)- pomoc w zrozumieniu koncepcji

Aproksymacja wielomianowa(?) (funkcji dyskretnej)- pomoc w zrozumieniu koncepcji
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0

Witam :)
Próbuję napisać algorytm, który znajdzie dla współczynniki wielomianu tak, aby pasowała do pewnych danych. (Aby można było narysować ich wykres).

Na osi X mam datę pomiaru temperatury, a na osi Y mam wartość tej temperatury dla danej daty. Aby narysować ich wykres, to muszę wyznaczyć jakąś funkcję. Wybrałem wielomian jakiegoś rozsądnego stopnia (~10% z liczby punktów, które aproksymuję chyba będzie OK). Pozostaje dobrać współczynniki. I tutaj się zatrzymałem, no bo mogę wyznaczyć funkcję, która jest sumą odległości wartości funkcji aproksymującej od aproksymowanej w poszczególnych punktach (i ją zminimalizować, współczynniki tutaj byłyby zmiennymi decyzyjnymi). Jednakże wykładowca coś wspominał o rozwiązywaniu układu równań np. minimalizacją Gaussa, z którego miałyby wyjść dokładne współczynniki- tego nie rozumiem, skąd wziąć ten układ równań?

Czy może to olać i zastosować algorytm sympleks? Jak takie rzeczy się robi?

Aha, jeszcze jedno- skoro argumentami są daty (obiekty DateTime, piszę ten progs w C#), to muszę je zamienić na wartości liczbowe, proporcjonalne do odległości czasowych (poczynając od zera)?

edytowany 1x, ostatnio: S-cat
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie bardzo rozumiem pytanie. Masz równanie ogólne wielomianu n-tego stopnia. Znasz n punktów przez które chcesz żeby przechodził ten wielomian. Zapisujesz więc n równań, po jednym dla każdego z punktów. Rozwiązujesz uzyskany układ i uzyskujesz w ten sposób współczynniki dla twojego wielomianu.

Ale tak generalnie aproksymacja wielomianowa jakoś specjalnie dobra nie jest i ja bym jednak myślał o jakichś funkcjach sklejanych na przykład.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0

Przechodził to niekoniecznie, bo to już interpolacja chyba jest, a Pan Wykładowca sobie aproksymację zażyczył. :)

Ale tak jak piszesz- mam n punktów, które znam, i mam znaleźć funkcję, która będzie takim ich uśrednieniem.

Załączyłem przykładzik (wybaczcie Painta :) ).

D(xi) oznacza różnicę (odległość) między wartościami wielomianu aproksymującego, a punktami aproksymowanymi. Suma tych odległości powinna być jak najmniejsza.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Interpolacja jest szczególnym przypadkiem aproksymacji kiedy różnica w zadanych punktach wynosi 0 ;) A skoro wykładowca zasugerował że masz uzyskać "dokładne współczynniki" z układu równań to dość mocno sugeruje właśnie interpolowanie tego.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0

No tak, to też nam powiedział. Ale na tablicy narysował to w podobny do mojego sposobu, i wspomniał, że funkcja nie powinna przechodzić przez te punkty, bo pomiary też nie są w 100% dokładne, więc lepiej jest to przybliżyć. Kiedy dopytałem się go o ten temat na następnych zajęciach, to wspomniał właśnie o rozwiazaniu układu równań i się pogubiłem, no bo cały czas czytam o aproksymacji, a tam o równaniach zbyt wiele nie ma. Może jemu też się coś "pomyrdoliło". ;) No ale mniej więcej zaczynam wiedzieć, na czym stoję. :)

edytowany 1x, ostatnio: S-cat
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Dla wielomianu trzeciej potęgi ze współczynnikami V {a,b,c,d}:
Macierz A:
x13 x12 x11 x10
x23 x22 x21 x20
x33 x32 x31 x30
...
xn3 xn2 xn1 xn0
Kolumna Y:
y1
y2
y3
...
yn
Więc: Y=A*V.
Stąd: V=(ATA)-1*AT*Y


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
Shalom
Ale ty w ogóle czytałeś ten temat? o_O
_13th_Dragon
"... bo cały czas czytam o aproksymacji, a tam o równaniach zbyt wiele nie ma ..." - z postu wyżej.
Shalom
No i rozpisałeś mu równania interpolacji :(
_13th_Dragon
Nie, to jest metoda najmniejszych kwadratów dla aproksymacji wielomianem. A że teoretycznie w pewnych granicach można użyć do interpolacji to inna sprawa.
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0

Dragon, teraz mi wszystko popsułeś, nie rozumiem. :)
Metoda najmniejszych kwadratów kojarzy mi się z minimalizacją tych odległości (kwadratów odległości), o których wspomniałem wcześniej. To o to chodzi? W tych równaniach co napisałeś... w którym miejscu ta metoda najmniejszych kwadratów jest zawarta?

Nie rozumiem jednej koncepcji- w jaki sposób, równania, dające jakieś dokładne wyniki, pomogą mi "uśrednić" wykres.
Skoro ułożę układ równań n (n - 1) równań, gdzie n to ilość aproksymowanych punktów, to znaczy, że mam wielomian n-tego stopnia i funkcja aproksymująca, będzie przechodzić przez te punkty, czyli będzie interpolacją.

Ja chcę użyć stopnia niższego (dużo niższego), niż ilość aproksymowanych punktów. Jak wtedy ułożyć równania, skoro współczynników do policzenia jest mniej niż punktów aproksymowanych?

Mam nadzieję, że nie chrzanię jakoś bardzo. :)

edytowany 1x, ostatnio: S-cat
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Tak, minimalizujesz kwadraty odległości.
Metoda najmniejszych kwadratów jest zawarta w jednym jedynym ostatnim równaniu (reszta to deklaracja zależności).
Nie musisz rozumieć, na tym polega metoda najmniejszych kwadratów.
Równań możesz dać tyle ile chcesz, grunt aby było ich co najmniej o jeden więcej niż stopień wielomianu może być nawet milion.
Powinieneś najpierw wyczytać różnicę pomiędzy aproksymacją a interpolacją.
Tak, nawet więcej niż bardzo.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0
_13th_Dragon napisał(a):

Metoda najmniejszych kwadratów jest zawarta w jednym jedynym ostatnim równaniu (reszta to deklaracja zależności).

Nie wiem, skąd to ostatnie równanie wyniknęło, przyznaje się bez bicia. Chwilowo przyjmę, że tak po prostu jest.

_13th_Dragon napisał(a):

Nie musisz rozumieć, na tym polega metoda najmniejszych kwadratów.

Nie rozumiem. :)

_13th_Dragon napisał(a):

Równań możesz dać tyle ile chcesz, grunt aby było ich co najmniej o jeden więcej niż stopień wielomianu może być nawet milion.

Tyle ile chcę, znaczy tyle, ile mam punktów? :)

_13th_Dragon napisał(a):

Powinieneś najpierw wyczytać różnicę pomiędzy aproksymacją a interpolacją.

Funkcja interpolująca przyjmuje w węzłach takie wartości jakie zadamy i jest szczególnym przypadkiem aproksymacji. Tak rzekł Shalom, Wikipedia i ktoś z forum matematycznego.
Coś jeszcze powinienem wiedzieć? Czy powyższe nie jest zgodne z prawdą?

Jeszcze trochę "bardzo pochrzanię". :)

Dotarło do mnie natomiast, że wielomian nie musi być stopnia równego ilości punktów, żeby ułożyć równania, nie wiem, dlaczego tak pomyślałem.

edytowany 2x, ostatnio: S-cat
_13th_Dragon
im mniejszy stopień wielomianu tym mniej dokładna aproksymacja.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

Na ile ja pamiętam matematykę interpolacja - to na podstawie istniejących danych szukanie nowych danych (pomiędzy istniejącymi lub dalej), za pomocą aproksymacji istniejących danych (dokładnie przechodzącej przez istniejące dane bądź niekoniecznie) z użyciem jakieś funkcji lub serii funkcji (czyli funkcji sklejanej).
Czasami Wikipedia bzdury chrzani, zajrzyj do wersji angielskiej tejże interpolacji, mimo że niby to samo, ale wyraźnie podane że interpolacje = szukanie nowych danych.

Tu masz opisane w miarę prosto: http://www.ekonometria.4me.pl/metoda-najmniejszych-kwadratow/
Właśnie zauważyłem że jest błąd na tej stronie, więc wyprowadzam wzór tu:
Y=A*V - nie możemy odwrócić A ponieważ nie jest kwadratowa, więc mnożymy obie strony przez AT
AT*Y=ATAV - zauważamy że AT*A - to macierz kwadratowa
AT*Y=(AT*A)*V - więc możemy ją odwrócić i przenieść na drugą stronę
(AT*A)-1*AT*Y=V - teraz tylko ładnie zapiszmy wymieniając miejscami strony
V=(AT*A)-1*AT*Y


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
S-cat
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:83
0

Ok, myślę, że to powinno mi wystarczyć. Serdecznie ci dziękuję, Dragon. :)

MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:2 dni
  • Postów:1082
0
_13th_Dragon napisał(a):

Na ile ja pamiętam matematykę interpolacja - to na podstawie istniejących danych szukanie nowych danych (pomiędzy istniejącymi lub dalej)
Ja bym się trochę przyczepił do tej frazy istniejącymi lub dalej Generalnie interpolacja to jest szukanie danych pomiędzy istniejącymi. Chodzi o to, że mamy jakieś dane w zakresie x <-1,100> to jeśli szukamy nowych wartości w tym przedziale to jest interpolacja, jeśli szukamy nowych wartości w przedziale <-inf,-1) lub (100,+inf> to się nazywa ekstrapolacja. Tak przynajmniej pamiętam ze studiów ;)

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)