W tej części skryptu przedstawimy przykłady projektów na zaliczenia zajęć z laboratorium komputerowego z matematyki obliczeniowej.
Projekty można potraktować jako trudniejsze zadania laboratoryjne.
Niektóre projekty są proste jeśli chodzi o stronę programistyczną. W przypadku większości takich projektów główną częścią jest przetestowanie danej metody. Inne projekty mogą polegać na zaimplementowaniu bardziej skomplikowanej metody z wykorzystaniem różnych funkcji octave'a.
Interpolacja wielomianowa. Algorytm różnic dzielonych.
Parametrami mają być:
Funkcja zwraca tablice wartości wielomianu w punktach
.
Funkcja powinna zwrócić wektor z różnicami dzielonymi
dla
.
Czy można to zrobić za pomocą tylko jednej pętli w octavie?
Interpolacja funkcji
polyfit
.
Znajdź wielomiany interpolacyjne w węzłach Czebyszewa i równoodległych stopnia dla
w bazie Newtona za pomocą funkcji z projektu i za pomocą funkcji
polyfit
octave'a w bazie potęgowej.
Oblicz dyskretną normę maksimum (na punktach) między
wielomianem w bazie Newtona uzyskanym własną funkcją, a jej wielomianem interpolacyjnym uzyskanym polyfit
. Czy różnice są pomijalne?
Oblicz dyskretną normę maksimum (na punktach) między funkcją, a jej wielomianem interpolacyjnym
otrzymanym za pomocą funkcji z projektu dla .
Narysuj wykresy funkcji i wykres jej wielomianu interpolacyjnego (na jednym rysunku).
Wartość wielomianu w bazie Newtona obliczamy algorytmem Hornera z pierwszego podpunktu.
Równania nieliniowe. Metoda Steffensena
Zaprogramuj funkcję octave'a z
\bfseries metodą Steffensena zdefiniowaną wzorem
- która ma znaleźć przybliżenie .
Napisz funkcję:
w m-pliku \texttt{steff.m} z parametrami:
-
FCN
- 'wskaźnik' do funkcji (function handle) obliczającej wartośćdla danego argumentu
,
-
- liczba, przybliżenie startowe.
Funkcja powinna zwracać
-
obliczone przybliżenie pierwiastka,
-
- ilość iteracji.
Funkcja powinna się zatrzymać, drukując komunikat o braku zbieżności na ekranie komputera, gdy ilość iteracji przekroczy .
W przypadku przekroczenia ilości iteracji funkcja ma zwrócić komunikat o tym na ekran.
Przetestuj metodę Steffensena z wykorzystaniem funkcji steff()
na przykładach równań rozpatrywanych w zadaniach w \S [link].
W szczególności należy sprawdzić, czy metoda zbiega kwadratowo lokalnie, o ile dla konkretnej funkcji
.
Równania nieliniowe. Metoda Halleya
Zaprogramuj funkcję octave'a z
\bfseries metodą Halleya, która jest metodą Newtona zastosowaną do funkcji
która ma znaleźć przybliżenie .
Wyprowadź wzór na kolejną iterację metody Halleya, w którym będziemy potrzebować odwołania tylko do wartości ,
i
.
Napisz funkcję z metodą Halleya \footnotemark \footnotetext{Tak, tego Halleya od komety Halleya.}:
w m-pliku \texttt{halley.m} z parametrami:
-
FCN
- 'wskaźnik' do funkcji (function handle) obliczającej wartośćdla danego argumentu
,
-
DFCN
- 'wskaźnik' do funkcji (function handle) obliczającej wartość pochodnejdla danego argumentu
,
-
D2FCN
- 'wskaźnik' do funkcji (function handle) obliczającej wartość drugiej pochodnejdla danego argumentu
,
-
- liczba, przybliżenie startowe.
Funkcja powinna zwracać
-
obliczone przybliżenie pierwiastka,
-
- ilość iteracji.
Jako warunek stopu należy przyjąć warunek spełnienie, któregoś z warunków lub
.
Funkcja powinna się zatrzymać, drukując komunikat o braku zbieżności na ekranie komputera, gdy ilość iteracji przekroczy .
W przypadku przekroczenia ilości iteracji funkcja ma zwrócić komunikat o tym na ekran.
Przetestuj metodę Halleya z wykorzystaniem funkcji halley()
na przykładach równań rozpatrywanych w zadaniach w \S [link].
W szczególności należy sprawdzić, czy metoda zbiega kubicznie lokalnie, o ile dla
dla
.
Równania nieliniowe. Rozwikływanie funkcji.
Rozpatrzmy daną krzywą określoną równaniem , gdzie funkcja
jest określona na prostokącie
.
Chcemy znaleźć przybliżone wartości
funkcji zadanej w sposób uwikłany przez
w punktach dla
, znając dobre przybliżenie
.
Tutaj - to ustalona liczba naturalna.
-
Napisz funkcję (w m-pliku) octave'a, która dla danych parametrów
- FCN wskaźnika do funkcji dwóch argumentów
,
- ustalonych
- końców odcinka
-
będącego przybliżeniem
-
ilości punktów, w których chcemy znaleźć przybliżenie
- ten parametr może być opcjonalny. Jeśli nie zostanie podany to powinien przyjmować domyślną wartość sto.
Funkcja powinna zwrócić jako wektor dla
.
W każdym kroku trzeba rozwiązać, używając funkcji octave'a fsolve())
, równanie nieliniowe:
biorąc za startowe przybliżenie (obliczone w poprzednim kroku dla
).
Jeśli się okaże, że fsolve() nie potrafi rozwikłać funkcji powinien na ekranie pojawić się komunikat o błędzie.
Interesuje nas tu na
na siatce 101 punktowej. Za
możemy wziąć
Metoda Householdera. LZNK
Załóżmy, że w wyniku doświadczenia otrzymujemy punktów
, które powinny leżeć na jednej prostej, ale w wyniku błędów pomiaru leżą tylko blisko prostej. Chcemy wyznaczyć prostą
, która leży najbliżej tych punktów w sensie najmniejszych kwadratów, tzn. takie
, że suma
jest minimalna.
To zadanie możemy przedstawić jako odpowiednie regularne LZNK. Jeśli istnieją dwa punkty o różnych odciętych, to LZNK ma jednoznaczne rozwiązanie.
Celem projektu jest
zaprogramowanie funkcji rozwiązującej problem znalezienia współczynników prostej
najlepiej przybliżającej dane punkty
za pomocą rozkłądu QR macierzy przy pomocy metody Householdera. Tzn. szukamy
takich, że
Czyli: w funkcji rozwiązujemy LZNK z macierzą
dla wektorów
i wektora prawej strony
Jako parametry wejściowe funkcji traktujemy wektory długości
, funkcja powinna zwracać:
- wektor
z rozwiązaniem tego LZNK,
- macierz
z LZNK
- macierz górnotrójkątną
wymiaru
z rozkładu QR macierzy
metodą Householdera, tzn.
,
-
dwukolumnową macierz
wymiaru
- w której odpowiednie kolumny to wektory Householdera
dla macierzy Householdera
takich, że
.
Jeśli kolumny macierzy okażą się zależne liniowo - funkcja ma zwrócić odpowiedni komunikat na ekran.
Testy:
- Przetestuj dla dwóch różnych punktów z różnymi
- czy znajdzie prostą przechodzącą przez te punkty.
- Przetestuj dla punktów leżących na prostej: tzn. wygeneruj kilka różnych losowych punktów
i przyjmij
. Następnie sprawdź, czy funkcja zwróci
.
- Przetestuj dla punktów leżących blisko danej prostej: tzn. przyjmij np.
dla
dla różnych
z
dla
losowego z przedziału
(funkcja octave'a
rand()
zwraca losowe punkty z przedziału).
- Sprawdź, czy rzeczywiście dla otrzymanych wektorów Householdera i macierzy
zachodzi
np. dla przykładów z poprzednich podpunktów. W tym celu można stworzyć macierze
i
i te trzy macierze wymnożyć.