Make
czyli wygodny sposób na kompilacjewhg reguł z Makefile'a - mozliwie prosty Makefile:Makefile-simple.
Zad 1 Napisać prosty makefile który kompiluje jakiś Państwa starszy program z labu - najlepiej program w kilku plikach.
Zad 2(do domu po jutrzejszym wykładzie) Napisać b skomplikowany Makefile zawierający regułe wzorcową która pasującą do wszystkich plików %.c
np z opcją -O0 (brak optymalizacji) Oraz zmodyfikować regułe domyślną (implicite rule)
dla plików wykonywalnych modyfikując odpowiednie zmienne make'a w Makefilu.
Zad 3(zadanie ze starego egzaminu)
Napisać funkcję której parametrami wejściowymi będą macierz A MxN, wektor b dl M, oraz wymiary M,N
która zwraca jako parametr wyjściowy rozwiązanie x - wektor długości N problemu Ax=B w sensie LZNK przy czym jeśli M=N i A nieosobliwa te rozwiązanie jest
obliczone funckją DGESV()
a jeśli M<>N lub A numerycznie osobliwa (tzn DGESV()
nie da rady rozwiązać) to
przy pomocy funkcji DGELSS()
(funkcja ma A i b pozostawić niezmienione). Proszę napisać odp. Makefile
.
Przetestować dla A=[1 1;-1 1], [1 1; 2 2] dla b=[2;0] i dla A=[1 2; 1 1; 1 0] i b=[1;1;2]. Sprawdzić w octavie czy wyszły dobre rozwiązania! Zmierzyć czas - porównując z octave'm.
Zad 4(zadanie ze starego egzaminu)
Napisać funkcję w octavie która razwiąże równanie Poissona (-\Laplacian u= f w \Omega i u=0 na brzegu) na kwadracie [0,1]x[0,1].
Wprowadzamy siatke NxN : (i*h,j*h) i,j=1,..,N z h=1/(N+1). I szukamy funkcji u zdefiniowanej na tej siatce spelniającej zdyskretyzowane
równanie na siatce:
h^{-2}[-u((i-1)*h,j*h) - u(i*h,(j-1)*h) +4* u(i*h,j*h) -u((i+1)*h,j*h) - u(ih,(j+1)*h)]=f(i*h,j*h) dla i,j=1,..,N.
Oczywiście uwzględniamy to że u(0,j*h)=u(i*h,0)=u((N+1)*h,j*h)=u(i*h,(N+1)*h)=0 czyli warunek brzegowy.
Na wejściu N i macierz NxN o wartościach f(i*h,j*h) na (i,j)tej pozycji albo nazwa funkcji 2-zmiennych obliczjącej wartość f, funkcja ma zwracać wektor wartości u(i*h,j*h) jako macierz U czyli u(i*h,j*h) ma być na pozycji (i,j)tej w macierzy U czyli U_{i,j}.
Do domu: ogólniejsze zadanie w Octavie ale z niezerowymi warunkami brzegowymi (dane wartości funkcji na brzegu przenosimy do wektora prawej strony) oraz
analogiczne zadanie w C - układ równań liniowych można rozwiązać przy pomocy odp. funkcji lapacka np dgesv()
czy lepiej
dposv()
(dla symetrycznych dodatnio określonych).
Następnie wyeksportować od pliku tekstowego wektor u jako macierz czyli
u(i*h,j*h) na pozycji (i,j)-tej w macierzy i wyświetlić tę macierz w octavie.