Języki Modelowania i Symulacji Podstawowe Marcin Ciołek Katedra Systemów Automatyki WETI, Politechnika Gdańska 8 listopada 2011
Literatura: 1. D. Kincaid, W. Cheney: Analiza numeryczna, Wydawnictwo Naukowo Techniczne, 2006. 2. P. Davis, W.: Differential Equations - Modelling with MATLAB, Prentice Hall, 1999. 3. Dokumentacja MATLABA i SIMULINKA. 4. B.Mrozek, Z. Mrozek: MATLAB Uniwersalne środowisko do obliczeń naukowo-technicznych, Kraków 1995. 5. T.P. Zieliński: Cyfrowe przetwarzanie sygnałów - Od teori do zastosowań, Warszawa 2009.
O czym będziemy dziś mówili? 1 2 3 4 5 6 7 8 9
cond Wskaźnik (liczba) uwarunkowania c = cond(x); oraz c = cond(x,p); cond(x,p) odpowiada norm(x,p) * norm(inv(x),p) cond(x) odpowiada cond(x,2) inf odnosi się do p=inf fro odnosi się do Frobeniusa
rcond Oszacowanie odwrotności wskaźnika uwarunkowania w 1-normie c = rcond(a); Dla dobrze uwarnkowanych c jest bliskie jedności, dla złych - zeru
norm Norma lub wektora n = norm(a); oraz n = norm(a,p); Gdy A jest macierza: p=1 max(sum(abs(a))) p=2 max(svd(a)), (Singular Value Decomposition) p=inf max(sum(abs(a ))) p= fro sqrt(sum(diag(a *A))), (norma Frobeniusa) Gdy A jest wektorem: norm(a) norm(a,2) p=inf max(abs(a)), p=-inf min(abs(a))
norm x = [0 1 2 3] %norma euklidesowa sqrt(0+1+4+9) ans = 3.7417 >> norm(x,1) ans = 6 >> norm(x,2) ans = 3.7417 >> norm(x,inf) ans = 3 x = 1 2 3 4 >> norm(x,1) ans = 6 >> norm(x,2) ans = 5.4650 >> norm(x,inf) ans = 7 >> norm(x,fro) ans = 5.4772
normest Oszacowanie 2- S macierz kwadratowa (nie musi być rzadka!) nrm = normest(s); nrm = normest(s,tol); Względny bład oszacowania tol (domyślna wartość tego błędu to 1.e-6) [nrm, iter] = normest(s,...); Informacja o liczbie iter wykonanych mnożeń S*S
normest x = 1 2 3 4 >> norm(x,2) ans = 5.4650 >> [nrm,ite] = normest(x) >> nrm = 5.4650 >> ite = 3 >> [nrm,ite] = normest(x,1.e-16) >> nrm = 5.4650 >> ite = 7
null Ortonormalna podprzestrzeni zerowej Z = null(a); Podstawa algorytmu jest rozkład svd (Singular Value Decomposition) danej Czy norm(a*z) = 0? A = [1 2 3 1 2 3 1 2 3]; Z = null(a) Z = 0 0.9636-0.8321-0.1482 0.5547-0.2224
null Ortonormalna podprzestrzeni zerowej Czy norm(a*z) = 0? A*Z ans = 1.0e-015 * 0.2220 0.2220 0.2220 0.2220 0.2220 0.2220 Z'*Z ans = 1.0000-0.0000-0.0000 1.0000 norm(a*z,1) < 1e-12 >> ans = 1
null Z = null(a, r ); odpowiada próbie znalezienia całkowitoliczbowej bazy podprzestrzeni zerowej dla małych ZR = null(a,'r') >> ZR = -2-3 1 0 0 1 >> A*ZR = 0 0 0 0 0 0 >> ZR'*ZR = 5 6 6 10
orth Ortonormalna podprzestrzeni zasięgowej (obrazu) B = orth(a); Podstawa algorytmu jest rozkład svd danej Czy B *B = eye((a))?
orth A = 1 2 3 1 2 3 1 2 3 >> b = orth(a) >> ans = [-0.5774-0.5774-0.5774]' >> b'*b = 1 A = 3 2 3 1 2 3 1 2 3 >> B = orth(a) ans = -0.6590 0.7521-0.5318-0.4660-0.5318-0.4660 >> B'*B = 1.0000 0.0000 0.0000 1.0000
orth % dwa wektory liniowo niezależne v1 = [1; 2; 3]; v2 = [1; -2; 3]; % wektory nie są ortogonalne v1' * v2 = 6; V = [v1,v2] %Poszukiwanie ortonormlnej bazy dla tej samej przestrzeni W = orth(v) W = 0.2673 0.1690 0.5345-0.8452 0.8018 0.5071 w1 = W(:,1); w2 = W(:,2) %wektory są ortogonalne w1' * w2 = 2.5723e-17 w1' * w1 = 1 w2' * w2 = 1 W' * W = 1.0000 0.0000 0.0000 1.0000
orth x = 2 * v1-3 * v2 x = -1 10-3 %obliczam współczynnik otzymany z rzutowania %wektora x na wektor w1 c1 = x' * w1 c1 = 2.6726 %obliczam współczynnik otzymany z rzutowania %wektora x na wektor w1 c2 = x' * w2 c2 = -10.1419 xw = c1 * w1 + c2 * w2 xw = -1.000 10.000-3.000 error = x - xw error = 1.0e-14 * [0.1332 0 0]' norm(error) = 1.3323e-15!!!
Rzad k = (A); oraz k = (A,tol); (A,tol) oszacowanie liczby wartości szczególnych danej większych niż tol Algorytm: s = svd(a); tol = max(size(a))*eps*(max(s)); r = sum(s > tol); A = 3 2 3 1 2 3 1 2 3 >> s = svd(a) >> ans = [ 6.9156 1.4746 0.0000] >> tol = max(size(a))*eps*(max(s)) >> ans = 4.6067e-015 >> r = sum(s > tol) >> ans = 2
trace Ślad t=trace(a); Algorytm: t = sum(diag(a)); A = 1 2 3 4 5 6 7 8 19 >> trace(a) >> ans = 25
rref Algorytm eliminacji krokowej Procedura z częściowym wyborem elementów głównych R = rref(a); R forma A po krokowej eliminacja G-J próg dla pomijalnych elementów kolumnowych (max(size(a))*eps *norm(a,inf))... = rref(a,tol); tol narzucona tolerancja (próg)
rref Ax = b A = b = 1 2 3 4 4 5 6 8 7 8 19 2 W = 1 2 3 4 4 5 6 8 7 8 19 2 rref(w)= 1.0000 0 0-2.3333 0 1.0000 0 4.6667 0 0 1.0000-1.0000 >> W\b = -2.3333 4.6667-1.0000
rref Ax = b syms a b c A = b = [ a, b, c] 4 [ b, c, a] 8 [ 2*a + b, b + 3*c, a + c] 2 W = [ a, b, c, 4] [ b, c, a, 8] [ 2*a + b, b + 3*c, a + c, 2] R= [1,0,0, -(2*(- 13*c^2 + 4*a*c + 5*a*b))/ [0,1,0, -(2*(- 7*a^2 + 4*c*a + 5*b*c))/ [0,0,1,(2*(4*a*b - 15*a*c + 4*b*c + 5*b^2))/ /(- 2*a^2*c + b*a^2 - a*c^2 + 2*b*c^2)] /(- 2*a^2*c + b*a^2 - a*c^2 + 2*b*c^2)] /(- 2*a^2*c + b*a^2 - a*c^2 + 2*b*c^2)]
lu dla układu równań Ax = b Lz = b z = L 1 b Ux = z x = U 1 z Macierz A może być prostokatna [L, U] = lu(a); L permutacja dolnej trójkatnej, U macierz górna trójkatna [L, U, P] = lu(a); A = L*U L dolna trójkatna z jednostkowa diagonala U górna trójkatna, P macierz permutacji L*U = P*A
input n, (a ij ) for k = 1 to n do l kk = 1 for j = k to n do k 1 u kj (a kj l ks u sj ) end do s=1 for i = k + 1 to n do k 1 l ik (a ik l is u sk )/u kk end do s=1 end do output (l ij ), (u ij )
A = 60 30 20 30 20 15 20 15 12 >> b=[1 2 3]' >> [L,U]=lu(A) L = 1.0000 0 0 0.5000 1.0000 0 0.3333 1.0000 1.0000 U = 60.0000 30.0000 20.0000 0 5.0000 5.0000 0 0 0.3333 x = inv(u)*inv(l)*b ans>> x = 0.4500-3.2000 3.5000 x = A\b ans>> x = 0.4500-3.2000 3.5000
A = 60 30 20 30 20 15 20 15 12 >> [L,U,P]=lu(A) L = 1.0000 0 0 0.5000 1.0000 0 0.3333 1.0000 1.0000 U = 60.0000 30.0000 20.0000 0 5.0000 5.0000 0 0 0.3333 P = 1 0 0 0 1 0 0 0 1
B = 1 2 3 4 5 6 7 8 0 >> b=[1 2 3]' >> [L1,U]=lu(B) L1 = 0.1429 1.0000 0 0.5714 0.5000 1.0000 1.0000 0 0 U = 7.0000 8.0000 0 0 0.8571 3.0000 0 0 4.5000 x = inv(u)*inv(l1)*b ans>> x = -0.3333 0.6667 0 x = A\b ans>> x = -0.3333 0.6667 0
B = 1 2 3 4 5 6 7 8 0 >> [L2,U,P]=lu(B) L2 = 1.0000 0 0 0.1429 1.0000 0 0.5714 0.5000 1.0000 U = 7.0000 8.0000 0 0 0.8571 3.0000 0 0 4.5000 P = 0 0 1 1 0 0 0 1 0
L2 = P*L1 P*L1 ans = 1.0000 0 0 0.1429 1.0000 0 0.5714 0.5000 1.000 -------------------------------------- P*A - L2*U ans = 0 0 0 0 0 0 0 0 0 -------------------------------------- d = det(a) >> ans d = 27 d = det(l)*det(u) >> ans d = 27
prod D = Iloczyn elementów B = prod(a,dim) Algorytm: [L, U] = lu(a); s = det(l); s*prod(diag(u))=??? 1 2 3 4 >> prod(d) ans = 3 8 >> det(l)*prod(diag(u)) ans = -2
Wyznacznik det A = d = det(x); Algorytm: [L, U] = lu(a); s = det(l); d = s*prod(diag(u)); 60 30 20 30 20 15 20 15 12 >> [L,U]=lu(A) L = 1.0000 0 0 0.5000 1.0000 0 0.3333 1.0000 1.0000 U = 60.0000 30.0000 20.0000 0 5.0000 5.0000 0 0 0.3333
Wyznacznik det d = det(x); Algorytm: [L, U] = lu(a); s = det(l); d = s*prod(diag(u)); A = 60 30 20 30 20 15 20 15 12 >> [L,U]=lu(A) L = 1.0000 0 0 0.5000 1.0000 0 0.3333 1.0000 1.0000 U = 60.0000 30.0000 20.0000 0 5.0000 5.0000 0 0 0.3333
chol (1) R = chol(a); A dodatnio określona: R górna trójkatna, [R, p] = chol(a); A dodatnio określona: R *R=A R górna trójkatna, R *R=A, p=0 A nie jest dodatnio określona: R górna trójkatna, R *R=A(1:q,1:q), q=p-1
chol (2) L = chol(a, lower ); A dodatnio określona: L dolna trójkatna, [L, p] = chol(a, lower ) ; A dodatnio określona: L*L =A L dolna trójkatna, L*L =A, p=0 A nie jest dodatnio określona: L dolna trójkatna, L*L =A(1:q,1:q), q=p-1
chol A = 60 30 20 30 20 15 20 15 12 >> R = chol(a) = 7.7460 3.8730 2.5820 0 2.2361 2.2361 0 0 0.5774 >> R'*R = 60.0000 30.0000 20.0000 30.0000 20.0000 15.0000 20.0000 15.0000 12.0000
chol n =3; >> X = pascal(n) X = 1 1 1 1 2 3 1 3 6 >> X(n,n) = X(n,n)-1 X = 1 1 1 1 2 3 1 3 5 >> chol(x)??? Error using ==> chol Matrix must be positive definite. >> [R,p]=chol(X) R = 1 1 0 1 p = 3
chol X = 1 1 1 1 2 3 1 3 5 >> chol(x)??? Error using ==> chol Matrix must be positive definite. >> [R,p]=chol(X) R = 1 1 0 1 p = 3 >> R'*R = 1 1 1 2
chol A = 60 30 20 30 20 15 20 15 12 >> L=chol(A,'lower')= 7.7460 0 0 3.8730 2.2361 0 2.5820 2.2361 0.5774 >> L*L'= 60.0000 30.0000 20.0000 30.0000 20.0000 15.0000 20.0000 15.0000 12.0000
chol X = 1 1 1 1 2 3 1 3 5 >> L=chol(X,'lower')??? Error using ==> chol Matrix must be positive definite. >> [L,p]=chol(X,'lower') L = 1 0 1 1 p = 3 >> L*L'= 1 1 1 2
chol A = 60 30 20 30 20 15 20 15 12 >> L = chol(a,'lower')= 7.7460 0 0 3.8730 2.2361 0 2.5820 2.2361 0.5774 >> R = chol(a)= 7.7460 3.8730 2.5820 0 2.2361 2.2361 0 0 0.5774 >> L'= 7.7460 3.8730 2.5820 0 2.2361 2.2361 0 0 0.5774
chol Ax = b x = A\b >> inv(a)= 0.1500-0.6000 0.5000-0.6000 3.2000-3.0000 0.5000-3.0000 3.0000 >> inv(r)*inv(l)= 0.1500-0.6000 0.5000-0.6000 3.2000-3.0000 0.5000-3.0000 3.0000 >> inv(l')*inv(l)= 0.1500-0.6000 0.5000-0.6000 3.2000-3.0000 0.5000-3.0000 3.0000
dodatnio określona W przypadku, gdy A jest macierza rzeczywista: A jest macierza symetryczna i dla każdego niezerowego wektora x R n zachodzi: x T Ax > 0. Równoważna definicja mówi, że wszystkie wartości własne A sa dodatnie.
inv Macierz odwrotna Y = inv(x); Rozwiazanie równania A*x=b: x = A\b czy x=inv(a)*b?
inv Ax = b x = A\b n = 500; Q = orth(randn(n,n)); d = logspace(0,-10,n); A = Q*diag(d)*Q'; x = randn(n,1); b = A*x; tic, y = inv(a)*b; toc err = norm(y-x) res = norm(a*y-b) elapsed_time = 1.4320 err = 7.3260e-006 res = 4.7511e-007
inv Ax = b x = A\b elapsed_time = 1.4320 err = 7.3260e-006 res = 4.7511e-007 tic, z = A\b, toc err = norm(z-x) res = norm(a*z-b) elapsed_time = 0.6410 err = 7.1209e-006 res = 4.4509e-015
linsolve (1) A*X = B, (A - mxn, B - mxk) X - nxk X = linsolve(a,b); A kwadratowa: faktoryzacja A niekwadratowa: faktoryzacja QR [X, R] = linsolve(a,b); A kwadratowa: faktoryzacja, R = 1/cond(A) A niekwadratowa: faktoryzacja QR, R=(A)
linsolve (2) X = linsolve(a,b,opts); pole opcji właściwość LT dolna trójkatna UT górna trójkatna UHESS górna Hessenberga SYM symetryczna lub Hermitowska POSDEF dodatnio określona RECT prostokatna TRANSA A*X = B albo A *X = B Ustawianie pola opcji: np. opts.ut = true
linsolve A = triu(rand(5,3)); A = 0.8147 0.0975 0.1576 0 0.2785 0.9706 0 0 0.9572 0 0 0 0 0 0 x = [1 1 1 0 0]'; b = A'*x; b = 0.8147 0.3760 2.0854 y1 = (A')\b opts.ut = true; opts.transa = true; y2 = linsolve(a,b,opts) y1 = [1 1 1 0 0]' y2 = [1 1 1 0 0]'
(1) A - mxn, x = lscov(a,b); b - mx1 (mxk) : Ax = b lscov x wektor minimalizujacy (b A x) (b A x) (dla b - mxk: rozwiazania dla każdej kolumny b) gdy (A) < n: wybierany jest x o maksymalnej liczbie zerowych współrzędnych x= lscov(a,b,w); w wektor mx1 nieujemnych rzeczywistych wag x minimalizuje (b A x) diag(w) (b A x)
lscov x1 = [.2.5.6.8 1.0 1.1]'; x2 = [.1.3.4.9 1.1 1.4]'; X = [ones(size(x1)) x1 x2]; y = [.17.26.28.23.27.34]'; a = X\y a = 0.1203 0.3284-0.1312 [b,se_b,mse] = lscov(x,y) b = 0.1203 0.3284-0.1312 se_b = 0.0643 0.2267 0.1488 mse = 0.0015
lscov w = [1 1 1 1 1.1]'; [bw,sew_b,msew] = lscov(x,y,w) bw = 0.1046 0.4614-0.2621 sew_b = 0.0309 0.1152 0.0814 msew = 3.4741e-004
lscov (2) x = lscov(a,b,v); V macierz mxm rzeczywista, symetryczna i dodatnio określona (kowariancja): x wektor minimalizujacy (b - A*x) *inv(v)*(b - A*x) V dodatnio półokreślona: x wektor minimalizujacy e *e przy ograniczeniu A*x + T*e = b, gdzie T*T = V (b musi należeć do obrazu Im [A T])
lscov V =.2*ones(length(x1)) +.8*diag(ones(size(x1))); [bg,sew_b,mseg] = lscov(x,y,v) bg = 0.1203 0.3284-0.1312 sew_b = 0.0672 0.2267 0.1488 mseg = 0.0019
(3) lscov x = lscov(a,b,v,alg); alg chol orth [x, stdx] = lscov(...); szczegóły algorytmu wyznaczania x rozkład V rozkłady ortogonalne dla osobliwych (źle uwarunkowanych) V stdx oszacowania błędów uzyskanego x (0 - gdy przyjęto zerowa wartość danej współrzędnej x dla A o niepełnym rzędzie) [x, stdx, mse] = lscov(...); mse oszacowanie błędu średniokwadratowego x
lsqnonneg Zadanie z ograniczeniami (1) C - mxn, d - mx1 (rzeczywiste): x = lsqnonneg(c,d); min x Cx-d 2 2 przy x 0 x wektor minimalizuje normę reszty (C*x-d), x>=0 x = lsqnonneg(c,d,options); pole opcji Display TolX (funkcja optimset) znaczenie Sposób prezentacji wyników obliczeń: off żadanie braku wyświetlania final tylko wynik końcowy notify tylko w przypadku niezbieżności Kryterium zbieżności (próg)
lsqnonneg Zadanie z ograniczeniami (2) [x, resnorm] = lsqnonneg(...); resnorm kwadrat reszty (d-c*x) [x, resnorm, residual] = lsqnonneg(...); residual reszta (d-c*x) [x, resnorm, residual, exitflag] = lsqnonneg(...); exitflag >0 - oznacza zbieżność algorytmu, 0 - brak zbieżności
lsqnonneg Zadanie z ograniczeniami (3) [x, resnorm, residual, exitflag, output] = lsqnonneg(...); output struktura (rekord) informacji dodatkowych: pole rekordu algorithm iterations message znaczenie active-set Liczba wykonanych iteracji Komunikat o zakończeniu [x, resnorm, residual, exitflag, output, lambda] = lsqnonneg(...); lambda mnożniki Lagrange a (problem dualny): lambda(i) <= 0, gdy x(i) = 0 lambda(i) = 0, gdy x(i) > 0