Pakiety Matematyczne
Transkrypt
Pakiety Matematyczne
Pakiety matematyczne Matematyka Stosowana dr inż. Krzysztof Burnecki 3.04.2013 Wykład 7 Algebra liniowa Slajdy powstały na podstawie prezentacji „Informatyka” otrzymanej od dr hab. Małgorzaty Kotulskiej Algebra liniowa. Identyczna ilość równań i zmiennych Algebra liniowa. Identyczna ilość równań i zmiennych Algebra liniowa stosuje wiele różnych metod do rozwiązania układu równań liniowych np. eliminacji Gaussa, faktoryzacji LU, faktoryzacji Cholesky’ego, Cramera i in. Matlab automatycznie stosuje metodę najbardziej optymalną dla podanej macierzy, wprowadzając operację dzielenia lewostronnego \ Aby być pewnym, że otrzymane rozwiązanie będzie bliskie rzeczywistości można najpierw obliczyć funkcję warunku cond(A). Jeżeli w wyniku nie otrzymamy liczby bardzo dużej (najlepiej jeżeli jest bliska 1), to macierz A-1 ma dobre własności numeryczne i Matlab potrafi dobrze rozwiązać równanie A*XX=b. Inną metodą (mniej polecaną) niż dzielenie lewostronne jest obliczenie macierzy odwrotnej A-1= inv(A). Algebra liniowa. Funkcja „cond” >> A = [5 7 4; 8 2 -3; 1 1 -1] A= 5 7 4 8 2 -3 1 1 -1 >> cond(A) ans = 12.8583 Algebra liniowa. Metoda dzielenia lewostronnego Sprawdzenie: >> A = [5 7 4; 8 2 -3; 1 1 -1]; >> b = [3 2 1]'; >> XX = A\b XX = -0.0625 0.6875 -0.3750 >> wyn = A*XX wyn=3 2 1 Algebra liniowa. Metoda macierzy odwrotnej (metoda wolniejsza) XX = A-1*b >>XX = inv(A)*b XX= -0.0625 0.6875 -0.3750 Algebra liniowa. Metoda macierzy pseudoodwrotnej – funkcja „pinv” Metoda kosztowna, stosowana jedynie wówczas, gdy nie można wyznaczyć macierzy odwrotnej. Na ogół w sytuacjach, o których będzie mowa poniżej. >> XX = pinv(A)*b Metoda Cramera >> A = [5 7 4; 8 2 -3; 1 1 -1] >> b = [3 2 1]' >> AX = [b,A(:,2),A(:,3)] AX = 3 7 4 2 2 -3 1 1 -1 >> AY = [A(:,1),b,A(:,3)] >> AZ = [A(:,1),A(:,2),b] Metoda Cramera >> wyznacznikA = det(A) wyznacznikA = 64 >> wyznacznikAX = det(AX) wyznacznikAX = -4 >> wyznacznikAY = det(AY) wyznacznikAY = 44 >> wyznacznikAZ = det(AZ) wyznacznikAZ = -24 Metoda Cramera >> X = wyznacznikAX / wyznacznikA X= -0.0625 >> Y = wyznacznikAY / wyznacznikA Y= 0.6875 >> Z = wyznacznikAZ / wyznacznikA Z= -0.3750 Metody rozwiązywania układów równań liniowych o nadmiernej ilości równań W takiej sytuacji nie ma jednoznacznego rozwiązania. Potrzeba rozwiązania takiego problemu pojawia się wówczas, gdy ilość danych pomiarowych jest większa niż ilość niewiadomych. Wszystkie dane są obarczone błędami (pomiarowymi) i brak podstaw do wskazania, które z nich należy odrzucić. Przykładowo mierzymy zależność y(x). Wiemy, ze jest ona liniowa, ale nie znamy jej równania. Na podstawie wielokrotnych pomiarów chcemy wyznaczyć równanie prostej obarczonej błędem w minimalnym stopniu. Mamy więcej zmiennych niż potrzeba. Metody rozwiązywania układów równań liniowych o nadmiernej ilości równań Rozwiązanie można uzyskać dwoma metodami: I. Dzielenie lewostronne (metoda najmniejszych kwadratów) II. Za pomocą macierzy pseudoodwrotnej (metoda Moore’a – Penrose’a) I. Dzielenie lewostronne (metoda najmniejszych kwadratów) Poszukuje się rozwiązania średniokwadratowego, dla którego ||A*X-b|| jest minimalna. Jest to rozwiązanie metodą najmniejszych kwadratów. (Zakładamy, że A*X=b) >> X = A\b Przykład >> A = [1 2 3; 4 5 6; 7 8 0; 2 5 8] >> b = [366, 804,351,514]' % Zakładamy, że b=A*X. Mamy 4 równania i 3 niewiadome >> X = A\b x= 247.98 -173.11 114.93 >> e = A*X-b % Obliczamy błąd e= -119.4545 11.9455 0.0000 35.8364 >> norm(e) II. Za pomocą macierzy pseudoodwrotnej (metoda Moore’a – Penrose’a) W metodzie tej wykorzystywana jest funkcja pinv (ang. pseudoinverse). >> X = pinv(A) Obliczona w ten sposób macierz X (pseudoodwrotna do X) spełnia następujące warunki: 1. A*X*A = A 2. X*A*X = X 3. A*X oraz X*A są macierzami hermitowskimi (B jest hermitowska, jeżeli B = B* i B* oznacza macierz sprzężoną) Przykład Rozwiązanie: >> p = pinv(A) >> X = p*b Przykładowe zadanie Wielkość y jest funkcją liniową x. Nie znamy równania tej funkcji. Aby je wyznaczyć wykonujemy serię pomiarów (x,y), obarczonych przypadkowym błędem pomiarowym, aby na tej podstawie wyznaczyć równanie prostej y=a*x+c. Uzyskujemy układ n równań: y1=a*x1+c y2=a*x2+c ……. yn=a*xn+c W tym układzie równań nieznane są wartości a, c. Rozwiązanie Układ równań można zapisać macierzowo jako: Rozwiązanie, cd. function [a1,c1,a2,c2] = nadokr(x,y) %Wyznaczanie prostej na podstawie nadokreślonego układu %równań (np. wyznaczenie prostej z wielu punktów %pomiarowych) % obliczamy współczynniki dla prostej A = [x',ones(length(x),1)]; b = y'; % metoda dzielenia lewostronnego Q = A\b; a1 = Q(1); c1 = Q(2); % metoda macierzy pseudoodwrotnej Q = pinv(A)*b; a2 = Q(1); c2 = Q(2); Przykład. Zaburzamy prostą szumem Gaussa >> x = [1:0.1:7]; >> y = x + randn(1,length(x)); >> [a1,c1,a2,c2] = nadokr(x,y) >> plot(x,y, '*',x,a1*x+c1,'--r',x,a2*x+c2,':g') >> figure; plot(x,y-a1*x-c1, '*') Dopasowywanie krzywej wielomianem (ang. fit). Funkcja „polyfit” Metoda najmniejszych kwadratów. Wybieramy stopień wielomianu n. Jeżeli n = 1 regresja liniowa. polyfit P = polyfit(x,y,n) P – współczynniki wielomianu od najwyższej potęgi n - stopień wielomianu Przykład >> x = [0:0.1:1]; >> y = [-.0447, 1.978, 3.28, 6.16, 7.08, 7.34, 7.66, 9.56, 9.48, 9.3,... 11.2]; >> n = 2; >> p = polyfit(x,y,n) p= -9.1075 19.2431 0.2018 Czyli: y(x) = -9.1075 x2 +19.2431 x+ 0.2018 Obliczanie wartości wielomianu o współczynnikach p. Funkcja „polyval” >> xi = x; >> yi = polyval(p,xi); >> plot(x,y, '*',xi,yi,':')