matematykaszkolna.pl
Metody numeryczne Marina : Witam! Czy umiałby i zechciałby ktoś z Państwa "rozwiązać" następujące zadanie z metod numerycznych w języku C++? Znajdź wielomian interpolacyjny dla funkcji f(x)=1/x i węzłów x0=2, x1=2.75 i x2=4. Znajdź wartość wielomianu dla x=3. Oszacuj błąd dla x należącego do przedziału [2, 4]. Z góry dziękuję i pozdrawiam! 🙂
3 lip 13:08
Mariusz: x0 = 2 ,x1 = 2.75 , x2 = 4 y0 = 0.5 , y1 = 0.3636, y2 = 0.25 Jeżeli chodzi o wielomian interpolacyjny to się tym bawiłem https://pastebin.com/CEEss5WS Wartość wielomianu jest zwracana przez funkcję horner której użyłem także do dzielenia przez dwumian
3 lip 14:39
Maciess: Mariusz a implementowałeś kiedyś algorytm Remeza do znajdowania wielomianów optymalnych w sensie aproksymacji jednostajnej? Mam kod w Pythonie a chciałem porównać o ile lepiej radzi sobie to w czymś niższego poziomu.
3 lip 21:48
Mariusz: Maciess nie . Ten kod co tutaj napisałem można by napisać lepiej bo w pewnym momencie mamy trzy zagnieżdżone pętle a to mogliby uznać za podejście zbyt kosztowne czasowo Aby zmniejszyć złożoność czasową tego algorytmu należałoby odwrócić schemat Hornera (Schemat Hornera jest tutaj użyty do dzielenia przez dwumian ale gdyby go odwrócić to mógłby być użyty do mnożenia przez dwumian)
3 lip 22:33
Maciess: A po ci w ogóle dzielenie przez dwumian w tym algorytmie? W jakiej bazie konstruujesz ten wielomian?
4 lip 09:03
Mariusz: To jest interpolacja Lagrange więc skoro policzyłem iloczyn wszystkich czynników x−xi to muszę podzielić aby dostać to co we wzorze , tylko że nie trzeba w każdej iteracji liczyć iloczynu wszystkich czynników x−xi
4 lip 11:17
Maciess: @Marina Podejrzewam, że chodziło o konstrukcje wielomianu w bazie Newtona przy użyciu ilorazów różnicowych. Metoda której uzył Mariusz nadaje się do rozważan teoretycznych, ale raczej nie powinno jej używać się w praktyce numerycznej.
4 lip 13:42
Mariusz: A w tej swojej ulubionej metodzie też dzielisz , dodatkowo jest ona bardziej złożona pamięciowo niż interpolacja Lagrange a daje te same wyniki
4 lip 15:58
Mariusz: Maciess a ten algorytm Remeza to sam napisałeś czy skądś ściągnąłeś
4 lip 16:07
Maciess: @15:58 Tak, zwiększamy nieznacznie złożonosc pamięciową, ale przecież to i tak niewielki koszt względem tego co zyskujemy. Jakbyś potem chciał rysować wykresy, albo po prostu obliczyć wartości w dużej ilości różnych punktów, to lepiej jak to umiemy zrobić przy O(n) a nie O(n2) emotka Nie miał to być żaden przytyk w twoją stronę, robiłem podobny kurs co autorka, więc mniej więcej mam pogląd czego tam sie oczekuje. Ona nie wydaje się już zainteresowana, więc nie ma co ciągnąć tematu. @16:08 Implementowałem samemu, przy czym korzystałem z funkcji bibliotecznych, które robiły sporo za mnie. Interesowało mnie stricte porównanie wyników, liczyłem ze moze kiedys bawiłes sie w cos takiego.
4 lip 22:55
Mariusz: Mam też i interpolację Newtona tyle że dodatkowy koszt pamięciowy to u mnie O(n2) ale podobno da się go zmniejszyć Może zamiast interpolacji Newtona można by napisać interpolację Hermite gdzie dla wielokrotnych węzłów podaje się też wartości pochodnych https://pastebin.com/m49DYgQp Jak widzisz tutaj dodatkowa pamięć jest zwiększona O(n2) Pokazałbyś jak zmniejszyć złożoność pamięciową
5 lip 03:11
Maciess: Zerknij tutaj: https://www.impan.pl/~szczep/AMM1/Kincaid.pdf Strona 314 (wg numeracji skanów). Jest napisane jak to można łatwo usprawnić. Tutaj kod: https://pastebin.com/x78r7ZLJ
5 lip 10:38
Mariusz: Po usprawnieniu kod wygladałby tak https://pastebin.com/nxGvTpA3 Maciess , czytałeś ten pdf O co chodzi z porządkowaniem węzłów Co to daje i jak to zrealizować (Niby w stdlib jest qsort ale mamy dane dwie jednowymiarowe tablice) Nadal nie wiem co zyskujemy stosując różnice dzielone Newtona zamiast interpolacji Lagrange Do obliczenia różnic dzielonych i tak potrzebujemy O(n2) czasu a dodatkowo O(n) pamięci (w wersji naiwnej było to nawet O(n2) pamięci)
5 lip 18:06
Maciess: Z porządkowaniem węzłów to nie da się tak w 3 słowach. Jest takie pojęcie w analizie algorytmów jak numeryczna poprawność. Badamy algorytm pod kątem tego, jak bardzo jego wynik różni się od prawdziwego rozwiązania, uwzględniając fakt, że poruszamy się w arytmetyce zmiennopozycyjnej. No i o algorytmach, które dają wynik "bliski prawdziwemu" dla delikatnie zaburzonych danych mówimy, że są numerycznie poprawne. To tak w dużym skrócie. W tej książce również masz to opisane (rozdział 2.3). Co do twojego pytania, to tak jak mówisz nie ma sensu tego porządkować na starcie − po prostu zrób założenie, że podajesz wezły i wartość uporządkowane. No w notacji asymptotycznej to niby to samo, faktycznie i tak będzie działać szybciej i mniejsza szansa na popełnianie błedów. Tak jak pisałem (i jest również wytłuszczone w PDFie) znając wspolczynniki w bazie Newtona może dokonać ewaluacji w punkcie w czasie liniowym używając wariantu metody Hornera. Nie zrobisz tego (tak łatwo) w postaci Lagranga. Z tego co autorzy podali to są jakieś metody do efektywnego wyliczania wartosci w postaci Lagranga − ja ich nie znam.
5 lip 19:20
Mariusz: Tutaj w tym fragmencie kodu gdzie obliczam różnice dzielone chyba iteruję za dużo (zamiast n powinienem tam wstawić n−1) Gdybym jednak chciał porządkować to porządkować tablicę igreków ? ale jak tak to trzeba by też odpowiednio spermutować tablicę iksów i właśnie zastanawiam się nad tą permutacją tablicy iksów
5 lip 20:11
Mariusz: Maciess odpowiedziałbyś na kilka pytań z metod numerycznych Może nie koniecznie z interpolacji ale po części także związanych z wielomianami Ostatnio bawiłem się metodą QR dla wartości własnych Niby program coś już liczy ale nie zawsze zwraca poprawny wynik
6 lip 15:52
Maciess: Szczerze z metod numerycznych dla algebry liniowej to nie robiłem nic oprócz rozwiązywania układów metoda LU, więc w tym temacie raczej nie będę w stanie szybko pomóc. Na dniach mam obronę i nie mam teraz nazbyt czasu. Może napisz co tam nie działa a ja sobie gdzieś w przyszłym tygodniu odkopie ten wątek i ewentualnie spróbuje pomoc emotka
7 lip 15:37
Mariusz: No to LU byłoby przydatne do odwrotnej metody potęgowej (do wyznaczania pojedynczej pary własnej − wartość własna i odpowiadający jej wektor) Dobrze napiszę co jest nie tak i co chciałbym jeszcze dopisać − ale może już w innym wątku
7 lip 23:43