Zasady zaliczania
- 44% (44 pkt.) - zadania na ćwiczeniach (programy)
- 44% (44 pkt.) - test z wiadomości z wykładu
- 12% (12 pkt.) - obecność na ćwiczeniach
Ćwiczenia rozpoczynają się w piątki o 10:15 w OKWF A. Są dwie
przerwy 15 minutowe o pełnych godzinach (czyli 11:00--11:15 oraz
12:00--12:15).
Tutaj będą pojawiały się różne informacje, np. upłynięcie terminu
oddawania zadania domowego, termin testu, informacje o odwołaniu zajęć
czy informacje o wynikach (czy też informacje o zmianach na stronie).
Najnowsze informacje znajdują się u góry. Symbolem
oznaczane są wiadomości
nie starsze niż tydzień.
- Przypominam, że na Wydziale Fizyki egzaminacyjna sesja
poprawkowa semestru zimowego kończy się 26-02-2005.
- W wynikach
pojawiło się oznaczenie, czy dana osoba poprawiała ocenę w czasie sesji
poprawkowej.
- Wkrótce powinno pojawić się oznaczenie, czy dana osoba poprawiała
wynik w czasie sesji poprawkowej.
- Ważna informacja!
Ostateczny termin oddania protokołów był 12 lutego.
Protokoły wypełnia się elektronicznie i zostały już zatwierdzone.
Nazwiska w protokołach już są i nie można niczego dopisać.
Wszelkie dodatkowe poprawki wchodzą zatem do sesji poprawkowej.
Osoby które oddały lub będą oddawać zadania domowe po tym
terminie (chcą poprawić ocenę z Metod Numerycznych I A)
musza wobec tego zadbać o to (w Dziekanacie), żeby ich
nazwiska pojawily się w protokołach poprawkowych w systemie USOS,
bo inaczej nie będzie technicznej możliwości
zmiany oceny!
- Punkty za zadania domowe są przeskalowywane do 100 pkt. i zaokrąglane
w górę do liczby całkowitej. Żadne inne zaokrąglenia nie są dokonywane.
Odpowiednia informacja dodana do nagłówka
tabeli z ocenami w wynikach.
- W wynikach pojawiła
się wstępna wersja szczególowego opisu wyników z zadań domowych. Uwaga: można
wybrać "{Możliwe do uzyskania punkty}" - wtedy wypisywany jest spis
zadań domowych, z punktacją zadań i podziałem na części: jest to wersja
obowiązująca (tzn. używana przy obliczaniu punktacji)! Litery w podpunktach
powinny odpowiadać odpowiednim kolumnom w pierwszej tabeli w
oddanych częściach zadań.
- W tabeli z ocenami w wynikach pojawiło
się oznaczanie czy ocena uległa zmianie; uwzględnione też zostały przenosiny
do innej grupy ćwiczeniowej.
- Można cały czas oddawać zadania domowe, oraz poprawiać już oddane
zadania domowe. Zadania których termin już minął, a nie były wcześniej
oddawane, mogą być oddawane w trakcie sesji, ale liczba punktów zostanie
obniżona za nie oddanie w terminie.
- Uzupełnione obecności i poprawione (dodatkowe) punkty za zadania domowe
pojawiają się w wynikach, i są
wysyłane e-mailem do prof. Wernera (pokój H115), u którego należy pobierać
wpis do indeksu.
- Wyniki zostały wysłane do prof. Wernera i zostały ocenione
(patrz niżej tabelka progów ocen). Patrz tabela
z ocenami.
- Uwaga: zmieniły się ilości punktów za ćwiczenia, test i obecności
z poprzednich 43, 43, 14 na obecne 44, 44, 12.
- Progi ocen oraz zaliczenia
| progi |
45 | 64 | 70 | 76 | 82 |
| oceny |
3 | 3+ | 4 | 4+ | 5 |
- Pan Mariusz Pożoga wpisał na teście mnie jako
prowadzącego ćwiczenia jego grupy, podczas gdy nie pojawił się on na żadnych
moich ćwiczeniach, ani nie oddał żadnego z zadanych zadań domowych. Proszę o
przekazanie mu informacji, że wyniki jego testu są u mnie (jeśli źle wpisał
grupę).
- Jest już
tabelka z wynikami (punkty razem)
z Metod Numerycznych I A. Uwaga: są dostępne tylko wówczas, gdy pokazywane
są punkty za zadania domowe, a nie tylko oznaczane oddane części zadań domowych.
Niektóre osoby mają ponad maksimum
możliwych punktów z zadań domowych (liczą się tylko punkty do maksimum
włącznie). Proszę sprawdzić, czy nie ma się
poniżej połowy punktów za ćwiczenia
(tzn. 100 pkt.).
- Zostały wpisane obecności
do listy oddanych zadań.
- Pojawiły się wyniki
testu (na ostatnim wykładzie z Metod Numerycznych I A). Wyniki wyliczane
automatycznie, sprawdzone.
- Poprawiono spline.ps.gz (tex).
- W pliku sortowanie.ps.gz (tex) dodano opis sortowania
przez scalanie (mergesort).
- Pojawił się spis zadań domowych
(w formacie Postscript, skompresowany), z punktacją zadań i podziałem
na części. Aktualniejsze informacje znaleźć można w
wynikach.
Jest to wersja używana w obliczaniu punktów za zadania domowe.
- Zostały nieco zmniejszone dodatkowe punkty za zadanie 3.,
obliczanie współczynników wielomianu interpolacyjnego.
- Poprawione (a przynajmniej zmodyfikowane) wersje
int-gauss.pdf (tex),
miejsca_zerowe.ps.gz (tex) oraz
iterate_lin.ps.gz (tex) i
ode-adapt.ps.gz (tex) zostały umieszczone na serwerze WWW.
- W liście oddanych zadań
pojawiła się (wstępna wersja)
punktacja.
- Przez pomyłkę utraciłem wszystkie e-maile od 23-12-2004 do 05-01-2005.
Jeśli ktoś wysyłał jakieś zadania domowe w tym przedziale czasu,
proszę o przesłanie ich ponownie.
- Wszystkie zadania (aż do sortowania) posiadają obecnie szczegóły
punktacji (szczegółowe wymagania).
- Opis zadań z interpolacji funkcją sklejaną (spline) i całkowania
metodą trapezów i Romberga zostały uzupełnione o szczegóły punktacji
(szczegółowe wymagania)
- W wymaganiach do zadania domowego z całkowania adaptacyjnego za
pomocą kwadratur Gaussa zwracanie (wyliczonego) oszacowania błędu
zostało przesunięte do części nadobowiązkowej.
- Informacje o sortowaniu zostały rozszerzone o odnośniki do NRC i
Wikipedii. Opis zadania z całkowania kwadraturami Gaussa został
uzupełniony o szczegółowy opis wymagań.
- Przykładowy program do zapisu wyników
do pliku w Javie (drugi), znajdujący się w
poradach, został uzupełniony o polecenie
nf.setGroupingUsed(false); usuwające używanie separatora tysięcy.
- Pojawił się zaczątek listy
oddanych zadań. Na razie jest tam tylko oznaczenie które zadania
zostały oddane, plus lista zadań.
- Skryptu o kwadraturach Gaussa, int-gauss.pdf (tex),
został rozszerzony i zawiera obecnie wprowadzenie do kwadratur
Gaussa, jak również tabele węzłów i współczynników (wag) kwadratur
Gaussa-Legendre'a, Gaussa-Laguerre'a i Gaussa-Hermite'a. Zawiera
on również przykłady zamiany zmiennych całkowania. Na razie nie
zawiera treści zadania domowego.
- Skryptu o znajdowaniu współczynników interpolacji wielomianowej
wspolcz_int_wiel.ps.gz (tex) został uzupełniony o pełny
opis znajdowania współczynników w postaci Newtona oraz o algorytm
przejścia od postaci Newtona do postaci naturalnej. Opis zadania
domowego został uaktualniony.
- Skryptu o metodzie Neville'a intwielom.ps.gz (tex) został uzupełniony o treść zadania domowe numer 2, oraz o metodę
zapisu algorytmu przy użyciu tylko jednego wektora pomocniczego.
Dodany został także opis ulepszonego algorytmu z "Numerical
Recipes" wyliczającego różnice między wielomianami pomocniczymi.
- Preferowanym format notatek do ćwiczeń okazał się PDF.
Jak widać nowe skrypty będą pojawiać się w tym formacie
(plus źródła w LaTeX–u).
Notatki które napisałem wcześniej pozostaną w formacie .ps.gz.
Plik w formacie PDF można wygenerować ze źródeł (plik .tex)
za pomocą programu pdflatex, lub po odkompresowaniu (za pomocą
gunzip) z pliku PostScriptowego (plik .ps) za pomocą
skryptu ps2pdf lub programu pstill. Nie gwarantuję
że otrzymane w ten sposób pliki .pdf będą dobrze czytelne, tzn.
będą używały czcionek wektorowych a nie bitmapowych.
- Komputery w pracowni komputerowej OKWF A służą w czasie ćwiczeń do pisania
programów z Metod Numerycznych I A i zadań z tym związanych. Jeśli zatem ktoś
potrzebuje komputera do programowania, a widzi komputer który jest używany
np. do grania, może wyprosić obecnego użytkownika i z niego skorzystać.
- W poradach pojawiła się strona zawierająca
przykładowe programy do zapisu wyników do pliku
w C, C++ i Javie. Uwaga: znam się dobrze tylko na C. Proszę zgłaszać
uwagi co do tych programów (na ćwiczeniach lub
e-mailem).
- Ponieważ zadania domowe są różnego stopnia trudności, każde zadanie będzie
mnożone przez wagę proporcjonalną do jego trudności. Wkrótce powinna zostać
uaktualniona informacja o zadaniach domowych.
Studenci zachęcani są do przenoszenia się do innych grup ćwiczeniowych.
Ta grupa jest mocno przepełniona.
Nieaktualne (osoby które się mogły przenieść, się przeniosły; grupa nadal
jest nieco przepełniona, ale obecna ilość osób jest do przyjęcia).
Nie przyjmuję nowych osób do grupy!
Programy będą oceniane w skali ciągłej [0,1]. Na koniec zajęć ilość
punktów uzyskanych za oddane programy będzie dzielona przez ilość
obowiązkowych zadań domowych i przeliczana do 44 pkt.
Za szczególnie "ładne" rozwiązania można dostać dodatkowe
punkty. Możliwe jest zatem uzyskanie za programy więcej niż 44 pkt. Każde
zadanie domowe ma termin oddania (celem tego rozwiązania jest uniknięcie
oddawania wszystkich zadań na ostatnich i przedostatnich zajęciach). Zadania
domowe należy oddawać do dwóch tygodni od terminu zadania. Oddanie zadania w
części (więcej niż połowa) umożliwia oddanie reszty do dwóch tygodni
(a dokładniej dwóch ćwiczeń) po normalnym terminie oddania zadania.
Aby sprawdzić które zadania zostały oddane, oraz wkrótce ile punktów
zdobyło się według bieżącej punktacji można zajrzeć do
listy oddanych zadań.
Znaleźć tam można również listę zadań domowych z terminami oddania.
Warto także zajrzeć do spisu zadań domowych
(w formacie Postscript, skompresowany), z punktacją zadań i podziałem
na części. Aktualniejszą wersję spisu można znaleźć w
wynikach.
Programy można wysyłać pocztą (mój adres e-mail to
jnareb@fuw.edu.pl),
ale preferowane jest oddawanie programów osobiście.
Uwaga: proszę zaznaczać które zadanie domowe rozwiązuje
przysłany program, oraz podać autorów programu.
W poradach znajduje się opis
preferowanego sposobu (stylu) kodowania (zapisywania programu). Nie
jest on obowiązkowy. Służy on głównie jako wskazówka, jak należy pisać
programy.
Celem każdego zadania domowego powinno być napisanie zadanego
algorytmu (metody) oraz jego przetestowanie.
08-10-2004
1.1. Opis teoretyczny
- W pliku wstep.ps.gz (tex) przedstawione są
konsekwencje przechowywania liczb rzeczywistych za pomocą
reprezentacji zmiennoprzecinkowej na skończonej ilości bitów.
Przedstawiony jest problem nadmiaru i niedomiaru w
obliczeniach. Podany jest przykład poprawy własności numerycznych
zagadnienia przez odpowiedni wybór algorytmu.
1.2. Zadania
- Znaleźć najmniejszą taką liczbę a != 0, taką że
fl(1+a) = 1 (gdzie fl(wyrażenie) oznacza wynik
numerycznego obliczenia wyrażenia na liczbach
zmiennoprzecinkowych). Znaleźć taką liczbę a, że
fl(1/a*a) != 1. Uwaga: podane zadanie można rozwiązać
nie korzystając z komputera przy założeniu określonej ilości bitów
na mantysę; przy pisaniu programu w razie potrzeby należy zastosować
zmienne pomocnicze.
- Zaimplementować dwa algorytmy obliczania długości
przeciwprostokątnej: bezpośrednie zastosowanie wzoru pitagorasa oraz
wzór powstały przez wyłączenie większej co do modułu liczby przed
pierwiastek (patrz wstep.ps.gz (tex)). Porównać ich
dokładność oraz dokładność funkcji bibliotecznej hypot.
Dla jakich wartości parametrów metoda klasyczna nie działa, a druga
metoda daje poprawne wyniki (do tego nie potrzeba używać
komputera).
1.3. Zadania dodatkowe
- Kumulacja błędów w zagadnieniu obliczania sumy. Należy
zaimplementować zwykłe sumowanie ciągu, sumowanie ciągu od
najmniejszej wartości (ciąg może być zadany przez piszącego program,
więc nie ma potrzeby wykonywać sortowanie), oraz algorytm
Gilla-Mollera:
u = p = 0;
for (i = 0; i < N; i++) {
v = A[i];
s = u + v;
p = u - s + v + p;
u = s;
}
wynik = s + p
Algorytm Gilla-Mollera zapobiega (teoretycznie) kumulacji błędów.
Zobaczyć który algorytm daje najdokładniejszy wynik.
1.4. Zadanie domowe
Zaimplementować dwa: klasyczny i ulepszony (w którym z klasycznego
wzoru oblicza się większy co do modułu pierwiastek zaś drugi ze wzoru
Verleta) rozwiązywania równania kwadratowego. Poszukać takich
współczynników wielomianu, że metody te dają różne wyniki. Który
algorytm jest dokładniejszy, tzn. dla którego algorytmu wartości
wielomianu w pierwiastkach są bliższe zera? Program powinien
sprawdzać czy zagadnienie ma rozwiązania (w liczbach rzeczywistych).
Czas oddania: do 22 października 2004 roku.
15-10-2004 - 22-10-2004
2.1. Opis teoretyczny
- W pliku wielomiany.ps.gz (tex) znajdują się
podstawowe informacje na temat wielomianów. M. in. opisany jest tam
algorytm Hornera obliczania wartości wielomianu w punkcie.
- W pliku intwielom.ps.gz (tex) opisana zastała
interpolacja wielomianowa (zagadnienie Lagrange'a) w punkcie.
M. in. opisany został algorytm Neville'a interpolacji
wielomianowej. Opisane są też tam metody bisekcji i
polowania do znajdowania punktów o które chcemy oprzeć
interpolację.
- Na stronie Pawła Jankowskiego do ćwiczeń z Metod Numerycznych
także można znaleźć plik intnevil.ps opisujący
algorytm Neville'a.
- W rozdziale trzecim "Numerical Recipes in C" 'Interpolation
and Extrapolation', w podrozdziale
"Introduction"
oraz w
"Polynominal
Interpolation and Extrapolation" znaleźć możemy informacje
na temat algorytmu Neville'a z obliczaniem poprawek (oraz jego
przykładową implementację w C).
2.2. Zadania
- Napisać obliczanie wartości wielomianu danego przez swoje
współczynniki (zapisane w tablicy) w zadanym punkcie x metodą
klasyczną, unikając zbędnych obliczeń:
W(x) = a0 x0 +
a1 x x0 +
a2 x x1 +
... +
an x xn-1
Zapisać program dzieląc go na funkcje i moduły. W przypadku pisania
obiektowego napisać odpowiednie klasy, także dzieląc program na
oddzielne moduły.
- Napisać obliczanie wartości wielomianu danego przez swoje
współczynniki (zapisane w tablicy) w zadanym punkcie x metodą
Hornera:
W(x) = a0 +
x (a1 + ... +
x (an-1 + x an)...)
- Napisać procedury (funkcje) znajdujące elementy tablicy między
którymi leży dane x metodami bisekcji oraz
polowania. Dokładniej, znaleźć taki indeks i, że
tab[i] <= x < tab[i+1]; przy metodzie polowania należy
startować z przybliżonego indeksu i' a później po znalezieniu
ograniczenia zastosować metodę bisekcji.
2.3. Zadania dodatkowe
- Napisać funkcję dokonującą interpolacji wielomianowej w punkcie
bezpośrednio za pomocą wzorów Lagrange'a. Porównać dokładność i
koszt tego algorytmu z algorytmem Neville'a (i ew. ulepszonym
algorytmem Neville'a).
2.4. Omówione tematy
- Przechodzenie od algorytmu zapisanego w postaci wzorów matematycznych bądź
pseudokodu do zapisu w postaci gotowego programu.
- Unikanie zbędnych obliczeń przez zapamiętywanie wyników częściowych na
przykładzie implementacji klasycznego algorytmu znajdowania wartości
wielomianu w punkcie.
- Podział programu na części: funkcje i moduły na przykładzie implementacji
klasycznego algorytmu znajdowania wartości wielomianu w punkcie, w języku C.
Program make i przykładowy Makefile dla powyższego programu.
- Sprawdzanie matematyczne poprawności algorytmu za pomocą niezmienników
(asercji) oraz warunku stopu na przykładzie algorytmu bisekcji.
- Ponowne wykorzystanie pamięci: algorytm Neville'a korzystający
tylko z wektora pomocniczego. Zapis O(m) dla kosztu czasowego i
pamięciowego algorytmu. Kiedy i dlaczego nie należy stosować
prostej rekurencji.
- Wykorzystanie istniejącej informacji do przyspieszenia
algorytmu: metoda polowania. Korzystanie z rozwiązania poprzedniego
zagadnienia (metody bisekcji)
- Ulepszony algorytm Neville'a z Numerical Recipes in C.
- Zapis wyników obliczeń do pliku (wyjście do pliku) w C, w C++
(przy pomocy strumieni) i w Javie.
- Tworzenie wykresów w programie gnuplot (wykreślanie
wykresu na podstawie danych z pliku, format pliku z danymi, wykres
zadanej funkcji, wykreślanie punktów z danymi linią ciągłą). Format
pliku z danymi. Zapis poleceń gnuplota w pliku.
2.5. Zadanie domowe
Napisać program dokonujący interpolacji wielomianem zadanego stopnia za pomocą
metodą Neville'a. Wykres można przedstawić zapisując wyniki do pliku
i korzystając z programu gnuplot, lub korzystając z którejś z
bibliotek graficznych (g2, GRX, GTK, Qt, Xlib,...). W przypadku
robienia wykresu należy, przy funkcji zadanej na N >= m + 1
punktach (gdzie m jest stopniem wielomianu interpolacyjnego),
wyznaczać wartość wielomianu interpolacyjnego w punkcie na podstawie
interpolacji opartej o najbliższe (w sensie odległości albo w sensie
indeksów) m+1 punktów. W przypadku programu nie produkującego
wykresów należy przynajmniej dać użytkownikowi możliwość punktu
obliczenia interpolacji; program w wyniku powinien podawać wartość
interpolacji w punkcie, wartość funkcji w punkcie i błąd
interpolacji. Najlepiej, jeśli w programie było podanych kilka
przykładowych punktów dla których można zobaczyć własności
interpolacji (ekstrapolacji).
Przykładowe funkcje do testowania:
|x|,
1/(1+x2),
exp(-x2),
exp(-1/x2),
wielomian.
Wymagania (punktacja może ulec zmianie: proszę podawać rzeczywistą
trudność poszczególnych podzadań):
- Napisanie funkcji znajdującej wartość interpolacji wielomianowej
określonego stopnia m rozpiętego na m+1 punktach w zadanym
punkcie x (70%). Za użycie rekurencji bądź macierzy pomocniczej -10%.
Za użycie algorytmu poprawek z Numerical Recipes +15%.
- Napisanie kodu generującego wykres interpolacji wielomianowej, zadanych
punktów i porównanie interpolacji z interpolowaną (prawdziwą) funkcją
(10%).
- Napisanie funkcji znajdującej punkty na których należy rozpiąć
interpolację, przy zadanym punkcie interpolacji (i w przypadku metody
polowania zgadniętego indeksu) i stopniu wielomianu interpolującego. Użyć
funkcji pomocniczej do znalezienia indeksu "środkowego"
tabi <= x <
tabi+1
(20%).
Czas oddania: do 19 listopada 2004 r.
29-10-2004
3.1. Opis teoretyczny
- W pliku wspolcz_int_wiel.ps.gz (tex) można m. in.
znaleźć opis algorytmu znajdowania współczynników wielomianu
interpolacyjnego przy użyciu algorytmu Neville'a, oraz treść zadania
domowego.
- W intlagr.ps
możemy znaleźć metody znajdowania współczynników wielomianu
interpolacyjnego oparte o wzór Lagrange'a i za pomocą ilorazów
różnicowych.
3.2. Zadanie domowe
Napisać program znajdujący współczynniki wielomianu interpolującego
przez stosowanie algorytmu Neville'a (algorytm z wykładu, patrz także
wspolcz_int_wiel.ps.gz (tex)). Program
powinien sprawdzić, czy algorytm ten odtwarza wielomian jeśli mamy
wystarczającą liczbę punktów, tzn. przy danych wartościach wielomianu
w stopień + 1 (lub więcej) punktach czy dostajemy poprawne
współczynniki wielomianu. Można porównać wielomian otrzymany z
interpolacji np. z rozwinięciem Taylora funkcji.
Wymagania (punktacja może ulec zmianie: proszę podawać rzeczywistą
trudność poszczególnych podzadań):
- Napisanie funkcji znajdującej współczynniki (w bazie jednomianów bądź w
bazie Newtona) interpolacji wielomianowej określonego stopnia n
rozpiętej na n+1 punktach (70%). Za wyliczenie współczynników w
postaci normalnej jeśli obliczaliśmy współczynniki w postaci Newtona +15%. Za
wyliczanie współczynników Newtona (jeśli ich używamy) za pomocą wzoru
rekurencyjnego z użyciem ilorazów różnicowych +10%. Za wybór odrzucanego
punktu w metodzie korzystającej z metody Neville'a +5%. Za użycie obu metod
+35% i za ich porównanie +10% (plus punkty dodatkowe dla obu metod).
- Sprawdzenie czy odtwarzamy i z jaką dokładnością współczynniki jeśli
funkcją interpolowaną jest wielomian (zadany w takiej postaci, jakie
współczynniki znajdujemy, czyli odpowiednio w postaci Newtona lub w postaci
naturalnej) (15%). Za sprawdzenie czy odtwarzamy współczynniki w rozwinięciu
Taylora funkcji interpolowanej (wymaga współczynników w bazie jednomianów) +5%.
- Napisanie kodu generującego wykres interpolacji wielomianowej, zadanych
punktów i porównanie interpolacji z interpolowaną (prawdziwą) funkcją
(15%). Wartości interpolacji należy znajdować obliczając wielomian
interpolowany. Za użycie odpowiedniego wzoru Hornera +2.5%. Za obliczanie
wartości wielomianu bazy za każdym razem od początku -2.5%. Za użycie funkcji
pow do obliczania potęg o wykładniku będącym niezbyt dużą liczbą
naturalną -2.5%.
Czas oddania: do 3 grudnia 2004 roku.
05-11-2004
4.1. Opis teoretyczny
- W pliku int-gauss.pdf (tex) znajdują się początki opisu
całkowania numerycznego za pomocą kwadratur Gaussa. Na razie w pliku znajdują
się tylko tabele analitycznych (wzory w postaci pierwiastników) i numerycznych
(z ośmioma cyframi po przecinku) węzłów i wag kwadratury Gaussa--Legendre'a,
z podaniem źródeł on-line skąd zostały wzięte. Uwaga: kwadratury
Gaussa dla symetrycznej funkcji wagowej (i przedziału) są symetryczne: mamy tą
samą wagę dla węzła xi, jak
i -xi.
- W pliku kwad.ps możemy znaleźć ogólna informację na temat kwadratur.
- W pliku gauss.ps możemy znaleźć informację o kwadraturach Gaussa
(Gaussa-Legendre'a na przedziale [-1, 1] z funkcją wagową 1,
Gaussa-Laguerre'a na przedziale [0, inf] z funkcją wagową
exp(-x),
Gaussa-Hermite'a na przedziale [-inf, inf] z funkcją wagową
exp(-x2),
Gaussa-Czebyszewa na przedziale [-1, 1] z funkcją wagową
1/sqrt(1+x2)).
Węzłami są zera odpowiedniego wielomianu ortogonalnego stopnia równego
liczbie węzłów (stopniu kwadratury), wagi są dane wzorami (22)–(24).
4.2. Zadania
- Całkowanie za pomocą kwadratury Gaussa-Legendre'a, z
adaptacyjnym dzieleniem przedziału.
- Całkowanie po przedziale nieskończonym za pomocą kwadratur
Gaussa-Laguerre'a, Gaussa-Hermite'a oraz przez zamianę zmiennych
(sprowadzenia do przedziału skończonego).
4.3. Zadanie domowe
Napisać program całkujący różne funkcje w zadanych przedziałach za
pomocą kwadratur Gaussa. Program powinien jako jedną z całek liczyć
całkę na przedziale niewłaściwym (nieograniczonym przynajmniej z
jednej strony) za pomocą odpowiedniej zamiany zmiennych. Całkowanie
powinno się odbywać za pomocą kolejnego dzielenia przedziałów aż do
osiągnięcia założonej dokładności lub przekroczenia ilości kroków.
Do oszacowania błędu całkowania można użyć wyników dla przedziału i
przedziału podzielonego na części, lub dla kwadratury i kwadratury
wyższego stopnia na tym samym przedziale. (Dla chętnych:
zaimplementować kwadratury Gaussa-Kronroda, które licząc kwadraturę
2n+1. rzędu korzystają z węzłów kwadratury n. rzędu.
Patrz pakiet QUADPACK
w Netlib, w szczególności procedury qk21 i podobne.). Przy
dzieleniu przedziałów na części warto dzielić ten przedział, który
daje największy błąd (szybkie znajdowanie minimum można zrobić za
pomocą kolejki priorytetowej zaimplementowanej w postaci kopca/stogu
(ang: heap)), ale można po prostu dzielić te przedziały które
dają większy błąd (jako wkład do całki) niż założona dokładność.
Dla chętnych: zastosować algorytm sumowania z poprawkami
Gilla-Mollera.
Przykładowe funkcje do scałkowania:
| całka |
wynik |
| \int_0^1 xa log 1/x dx |
1/(a+1)2 |
| \int_{-inf}^{inf} exp(-x - x2) dx |
sqrt(Pi)*exp(1/4) |
| \int_0^{inf} log(x)/(1 + 100*x2) dx |
- log(10)/20 |
Wymagania:
- Napisanie funkcji obliczającą całkę na przedziale [a, b]
za pomocą kwadratury Gaussa o określonym stopniu (liczbie węzłów) (10%).
Za wypisanie wyników dla więcej niż jednego stopnia i porównanie
wyników +5%.
Napisanie funkcji wyliczającej całkę na przedziale [a,b]
adaptacyjnie, do osiągnięcia zadanej dokładności lub przekroczenia
maksymalnej ilości przedziałów/wywołań funkcji (70%).
Za wybór przedziału o największym błędzie do podziału +10%. Za
wykorzystanie w tym celu kolejki priorytetowej (np. stogu) +20%.
Za zrobienie obliczeń obiema metodami (proste dzielenie przedziałów
+ wybieranie przedziału o największym błędzie) i porównanie obu
metod + 10%.
- Zwrócenie oszacowania błędu adaptacyjnej kwadratury
Gaussa +10%.
- Obliczenie metodą adaptacyjną całki na przedziale
nieskończonym (przynajmniej jedną z granic jest nieskończoność),
albo przez zamianę zmiennych, albo przez użycie odpowiednich
kwadratur: Gaussa-Laguerre'a lub Gaussa-Hermite'a (20%).
Za brak całkowania adaptacyjnego w tym przypadku -5%.
Dodatkowe punkty za zrobienie obu wersji (i ew. ich
porównanie).
- Użycie kwadratur Gaussa-Kronroda do oszacowania błędu
+10% lub więcej. Zastosowanie algorytmu Gilla-Mollera sumowania z
poprawkami +7.5% lub więcej. Za szczegółową analizę zachowania
adaptacyjnego całkowania metodą Gaussa: w/g uznania prowadzącego
ćwiczenia.
Czas oddania: Do końca grudnia (17 grudnia 2004).
19-11-2004
5.1. Opis teoretyczny
- W pliku spline.ps.gz (tex) znaleźć można opis
algorytmu interpolacji funkcjami sklejanymi trzeciego stopnia
(splines). Podany algorytm pochodzi z "Numerical Recipes in
C".
- Tutaj
możemy znaleźć szczegółowy opis klasycznego (wyznaczanie
współczynników każdego składowego wielomianu) algorytmu
interpolacji funkcjami sklejanymi. Uwaga: plik ten ma tę
sama nazwę co powyższy.
5.2. Zadania
- Napisać procedurę (funkcję) rozwiązującą układ równań o macierzy
w postaci trójliniowej metodą przeganiania. Sprawdzić, czy
daje ona dobre wyniki (przez przemnożenie wyniku przez macierz
i sprawdzenie czy wynik jest równy wektorowi prawej strony).
- Napisać procedurę (funkcję) dokonującej interpolacji funkcjami
sklejanymi trzeciego stopnia (splines) przy zadanych wartościach
funkcji i drugiej pochodnej funkcji w punktach, t.j. danych
xi,
fi = f(xi),
d2fi = f''(xi)
.
5.3. Zadanie domowe
Napisać program dokonujący interpolacji przy pomocy krzywych
sklejanych (splines) trzeciego stopnia (przy zadanych punktach
i wartościach funkcji w punkcie). Patrz także opis w
spline.ps.gz (tex).
Wymagania:
- Napisanie funkcji znajdującej wartość interpolacji za pomocą
funkcji sklejanej trzeciego stopnia (spline) dowolną metodą
(rozwiązanie układu równań na współczynniki trójmianu kwadratowego w
każdym przedziale lub wyliczenie drugich pochodnych i skorzystanie
ze wzoru interpolacyjnego). W tej części mieści się rozwiązanie
układu równań z macierzą trójdiagonalną (90%).
- Napisanie kodu generującego wykres krzywej sklejanej, punktów
interpolacji i interpolowanej funkcji (10%).
- Za napisanie i/lub porównanie z innymi metodami: porównanie
z smooth csplines z gnuplota (lub analogicznego sposobu w
programie używanym do robienia wykresów) +2.5%; porównanie z inną
metodą nie napisaną własnoręcznie (np. z Numerical Recipes lub GNU
Scientific Library) +10%; porównanie z drugą metodą +40% (dokładna
punktacja do dyskusji: program napisany w dobrym stylu ma większe
szanse uzyskać większą ilość dodatkowych punktów).
- Spline powinien przechodzić przez punkty interpolacji; jeśli nie
przechodzi -0% (ponieważ nie jestem pewien, czy spisywałem wszystkie
przypadki kiedy np. spline nie przechodził przez pierwszy punkt, nie
będę obniżał punktacji za ten błąd).
Czas oddania: Pierwsze zajęcia po przerwie świątecznej,
7. stycznia 2005 r.
26-11-2004 - 03-12-2004
6.1. Opis teoretyczny
- W pliku kwad.ps możemy znaleźć ogólna
informację na temat kwadratur, informację o kwadraturach
interpolacyjnych Newtona-Cotesa (m. in. wzór trapezów i
wzór parabol (Simpsona)), złożonych kwadraturach
Newtona-Cotesa (m. in. złożony (rozszerzony) wzór trapezów).
Podany także został sposób przyspieszania zbieżności ciągu kwadratur
przy pomocy ekstrapolacji Richardsona (ekstrapolacja
Richardsona zastosowana do metody trapezów nosi nazwę metody
Romberga).
- W rozdziale czwartym "Numerical Recipes in C"
'Integration of Functions', w podrozdziale
"Classical Formulas for Equally Spaced Abscissas"
oraz w
"Elementary Algorithms"
znaleźć możemy informacje na temat metody trapezów i ulepszonej
metody trapezów.
6.2. Zadania
- Napisać procedurę (funkcję) całkującą zadaną funkcje po
przedziale domkniętym rozszerzoną metodą trapezów. Rząd metody
powinien być zwiększany do osiągnięcia żądanej dokładności (jako
oszacowanie błędu można wziąść różnicę między wynikami z kolejnych
rzędów) lub przekroczenia maksymalnej ilości podziałów. Funkcja
powinna wykorzystywać wyniki z poprzedniego rzędu dla uniknięcia
wielokrotnego obliczania wartości funkcji w tym samym punkcie.
- Napisać procedurę (funkcję) całkującą zadaną funkcję po
przedziale domkniętym metodą Romberga. Wykorzystać poprzednią
procedurę.
- Napisać funkcję obliczającą całkę wielokrotną
(wielowymiarową) albo pisząc ogólną procedurę całkowania funkcji z
parametrem i przekazując pozostałe zmienne jako parametry, albo
napisać całkowanie dla zadanej liczby wymiarów, przekazując
pozostałe zmienne w zmiennych globalnych (statycznych).
Uwaga: całkowanie wielowymiarowe jest powolne, zatem nie należy
zadawać zbyt dużej dokładności.
6.3. Zadanie domowe
Napisać program całkujący zadaną funkcję w zadanym przedziale za
pomocą rozszerzonej (złożonej) metody trapezów. Program powinien
zwiększać rząd metody (ilość podziałów) aż do osiągnięcia zakładanej
dokładności lub przekroczenia maksymalnej ilości iteracji.
Następnie program powinien obliczać tą samą całkę metodą Romberga
(stosując ekstrapolację Richardsona do (rozszerzonej) metody trapezów)
także zwiększając ilość podziałów aż do osiągnięcia zadanej
dokładności lub przekroczenia maksymalnej ilości iteracji (lub ilości
wywołań funkcji podcałkowej).
To zadanie domowe można połączyć z poprzednim zadaniem, na całkowanie
(adaptacyjne) za pomocą kwadratur Gaussa.
Wymagania
- Napisanie funkcji obliczającej całkę z podanej funkcji na
zadanym przedziale domkniętym [a, b] (zakładając że funkcja
jest określona na krańcach przedziału) z zadaną dokładnością (i
ograniczeniem na maksymalną liczbę podziałów/krok podziału) złożoną
metodą trapezów (50%). Za brak wykorzystania poprzednio wyliczonych
wartości funkcji (a dokładniej poprzednio wyliczonej sumy) -20%.
Za brak zwracania oszacowania błędu -5%.
- Napisanie funkcji obliczającą tę samą całkę metodą Romberga
(zastosowanie ekstrapolacji Richardsona do złożonej metody trapezów)
z zadaną dokładnością (50%). Za użycie rekurencji bądź macierzy
pomocniczej -5%. Za brak zwracania oszacowania błędu -5%.
- Ekstrapolacja do h = 0 za pomocą interpolacji
wielomianowej bądź funkcją wymierną, na dwóch ostatnich wielkościach
kroku bądź na wszystkich dotychczas używanych wartościach kroku
+40%.
- Analiza zależności od kroku (bądź ilości wywołań funkcji
podcałkowej) błędu i oszacowania błędu +20% lub więcej (w zależności
od uznania osoby prowadzącej ćwiczenia)
Czas oddania: Drugie zajęcia w nowym roku, 14. stycznia 2005 r.
10-12-2004
7.1. Opis teoretyczny
- W pliku miejsca_zerowe.ps.gz (tex) przedstawiony jest
wstęp do metod znajdowania miejsca zerowego (pierwiastka) równania
nieliniowego jednowymiarowego, podane są różne algorytmy oraz
zadanie domowe (niepełne).
- W pliku miejzer.ps są opisane metody bisekcji, Newtona (stycznych),
Steffensena, siecznych oraz metoda Riddersa.
Zdefiniowany jest tam także wykładnik zbieżności metody.
Większość informacji można także znaleźć w pliku
miejsca_zerowe.ps.gz (tex).
- W rozdziale 9. "Numerical Recipes in C" 'Root Finding...', w
podrozdziale
"Bracketing
and Bisection" opisany jest sposób znalezienia przedziału
wewnątrz którego znajduje się rozwiązanie (pierwiastek) oraz metoda
bisekcji.
7.2. Zadania
- Napisać procedurę (program) znajdującą zero zadanej funkcji w
podanym przedziale z zadaną dokładnością metodą bisekcji, lub
do przekroczenia zadanej liczby iteracji. Jako oszacowanie błędu
można wziąć długość przedziału (dokładność znalezienia punktu) i/lub
wartość bezwzględną funkcji w punkcie (np. pośrodku przedziału)
(dokładność spełnienia warunku).
Innym warunkiem na osiągnięcie zadanego błędu bezwzględnego
(epsabs) i bezwzględnego (epsrel) jest zastosowanie do
testowania czy osiągnięto zadane dokładności wzoru:
|a - b| < epsabs + epsrel min(|a|, |b|),
o ile przedział [a, b] nie zawiera 0.
Innym oszacowaniem błędu znalezienia rozwiązania jest
|f(x)|/|f'(x)| ~= |f((a+b)/2)| |a-b|/|f(a)-f(b)|.
7.3. Zadanie domowe
Napisać procedurę (program) znajdującą zero zadanej funkcji w
podanym przedziale z zadaną dokładnością metodą bisekcji, oraz
jedną z pozostałych metod. Porównać czasy wykonania oraz ilości
wywołań funkcji i osiągniętą dokładność przy takiej samej funkcji
i takiej samej zadanej dokładności.
Opis (części) zadania domowego znajduje się także w
miejsca_zerowe.ps.gz (tex).
Wymagania
- Znajdowanie miejsca zerowego podanej funkcji z zadaną
dokładnością za pomocą metody bisekcji (40%).
- Znajdowanie miejsca zerowego podanej funkcji z zadaną
dokładnością za pomocą innej metody (45%).
- Porównanie obu metod (15%). Za szczegółowe porównanie metod
(czas wykonania, ilość wywołań funkcji, liczba iteracji, przykłady
niezbieżności) +5%. Za analizę szybkości zbieżności (zależności
dokładności od liczby iteracji) do +15%.
Czas oddania: Ostatnie zajęcia, 21. stycznia 2005 r.
17-12-2004
8.1. Opis teoretyczny
- W pliku sortowanie.ps.gz (tex) opisane są
metody sortowania przez wstawianie, selekcję oraz
sortowanie stogowe. Podany jest też sposób wykorzystania
bibliotecznej funkcji qsort do sortowania szybkiego
(quicksort).
- W pliku sort.ps Paweł Jankowski opisał
metody sortowania przez wstawianie, jej 'ulepszenie' czyli
metodę Shella oraz sortowanie stogowe (heapsort).
- W rozdziale 8.
"Numerical Recipes in C"
'Sorting' opisano sortowanie przez wstawianie, sortowanie
Shella, sortowanie stogowe i sortowanie szybkie
(quicksort).
- W Wikipedii można znaleźć opis różnych algorytmów
sortowania: w wersji polskiej
(Sortowanie)
m. in. odnośniki do opisów algorytmów sortowania przez wstawianie,
wybieranie, kopcowe (heapsort), bąbelkowe (i jego ulepszenie podobne
nieco do algorytmu Shella: sortowanie grzebieniowe), przez scalanie
i przez scalanie naturalne. Wersja angielska
(Sorting algorithm i
Category:Sorting_algorithms)
zawiera podział algorytmów na stabilne i niestabilne, krótki opisy
popularnych algorytmów sortowania oraz odnośniki do opisu m. in.
algorytmu sortowania przez wstawianie, algorytm Shella, sortowanie
przez wybieranie, kopcowe (i jego rzadko używana modyfikacja smoothsort),
sortowanie szybkie (i jego wersja
introsort
zapewniająca czas O(n log n) także w przypadku pesymistycznym)
sortowanie bąbelkowe (i jego warianty: sortowanie koktajlowe
i grzebieniowe), i sortowanie przez scalanie. Obie wersje zawierają
także opis sortowania kubełkowego.
- Biblioteka standardowa C udostępnia funkcje qsort,
oryginalnie zaimplementowaną za pomocą sortowania szybkiego
(quicksort). W C++ w STL (Standard Template Library) w
pliku nagłówkowym algorithm zaimplementowano funkcje-wzorce sort
(używającą algorytmu introsort) i stable_sort (używającą
sortowania przez scalanie). Klasa Array (java.util.Arrays)
w Javie udostępnia funkcję sort (w zależności
od parametrów używającą stuningowanego quicksorta,
albo zmodyfikowanego sortowania przez scalanie (mergesort)).
8.2. Zadania
- Napisać procedurę i przykładowy program sortujące tablicę liczb
zmiennoprzecinkowych (float) w porządku malejącym
dowolnie wybraną metodą.
- Posortować tablicę za pomocą standardowej metody języka
(biblioteki standardowej, biblioteki STL, odpowiedniej klasy, ...).
8.3. Zadanie domowe
Napisać program sortujący tablicę gdzie kluczami są liczby
zmiennoprzecinkowe (float) w porządku malejącym. Program
powinien udostępniać sortowanie stabilne i sortowanie w czasie
O(N log N). Można to zrobić za pomocą jednej metody, która jest
jednocześnie szybka i stabilna. Metoda stabilna powinna być co
najwyżej w czasie O(N^2). Podać liczbę elementów, ilość
porównań i ilość przestawień elementów. Sprawdzić zachowanie dla
tablicy już posortowanej, posortowanej odwrotnie i "losowej".
Wymagania
- Implementacja algorytmu sortowania stabilnego (50%). Za brak
sprawdzenia czy sortuje -5%. Za brak sprawdzenia czy sortuje
stabilnie -5%. Za błędne użycie algorytmu który nie sortuje
stabilnie -40%.
- Implementacja algorytmu sortowania w czasie (średnim) O(N log N)
(50%). Za brak sprawdzenia czy sortuje -5%. Za błędne użycie
algorytmu który nie sortuje szybko -40%.
- Za analizę zachowania użytych algorytmów sortowania (czas
wykonania, liczba porównań, liczba zamian/kopiowań t.j. przesunięć
elementów, użyta dodatkowa pamięć, różne przypadki: tablica
posortowana, tablica prawie posortowana, tablica 'losowa', tablica
uporządkowana odwrotnie, przypadek pesymistyczny/najgorszy) - w/g
uznania sprawdzającego (około +25%).
- Za napisanie algorytmu sortującego w czasie większym niż
kwadratowy (np. O(N^3)) -50% (za zadanie nie można uzyskać mniej niż
zero punktów).
Czas oddania: do końca sesji.