Języki Modelowania i Symulacji Marcin Ciołek Katedra Systemów Automatyki WETI, Politechnika Gdańska 2 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
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
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.
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 (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 >> 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
inv odwrotna Y = inv(x); Rozwiazanie równania A*x=b: x = A\b czy x=inv(a)*b?
inv Ax = b x = inv(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
qr qr (1) A - mxn [Q, R] = qr(a); R - mxn górna trójkatna, [Q, R] = qr(a,0); A = Q*R dla m > n oblicza się: n poczatkowych kolumn Q n poczatkowych wierszy R dla m<=n mamy: [Q, R] = qr(a) Q - mxm unitarna
qr qr (2) [Q, R, E] = qr(a); R górna trójkatna, Q unitarna E macierz permutacji kolumnowej A*E = Q*R oraz abs(diag(r)) uporzadkowane malejaco [Q, R, E] = qr(a,0); X = qr(a); E wektor permutujacy: A(:,E) = Q*R X = qr(a,0); X triu(x) jest górnym trójkatnym czynnikiem R
qr A = [ 1 2 3 4 5 6 7 8 9 10 11 12 ] [Q,R] = qr(a) Q = -0.0776-0.8331 0.5444 0.0605-0.3105-0.4512-0.7709 0.3251-0.5433-0.0694-0.0913-0.8317-0.7762 0.3124 0.3178 0.4461 R = -12.8841-14.5916-16.2992 0-1.0413-2.0826 0 0 0.0000 0 0 0 rank(a) = 2 tol = 1.4594E-014
qr Ax = b b = [1;3;5;7]; x = A\b; x = 0.5000 0 0.1667 y = Q'*b; x = R\y x = 0.5000 0 0.1667
pinv Moore a-penrose a (1) B = pinv(a); B macierz : A*B*A = A, B*A*B = B, A*B = (A*B), B*A = (B*A) B = pinv(a,tol); tol próg zerowości wartości szczególnych A domyślny poziom: max(size(a))*norm(a)*eps Algorytm wykorzystuje rozkład svd
pinv Moore a-penrose a (2) A - mxn : m > n oraz rank(a) < n x minimalizujacy norm(a*x-b) nie jest jednoznaczny x = pinv(a)*b rozwiazanie o najmniejszej wartości norm(x) y=a\b rozwiazanie o najmniejszej liczbie niezerowych elementów
pinv A = magic(8); A = A(:,1:6); b = 260*ones(8,1); A = b = 64 2 3 61 60 6 260 9 55 54 12 13 51 260 17 47 46 20 21 43 260 40 26 27 37 36 30 260 32 34 35 29 28 38 260 41 23 22 44 45 19 260 49 15 14 52 53 11 260 8 58 59 5 4 62 260 x1 = pinv(a)*b; x2 = A\b; x3 = inv(a)*b;???????
pinv x1 = pinv(a)*b; x2 = A\b; x3 = inv(a)*b; x1 = x2 = 1.1538 4.0000??? Error using ==> inv 1.4615 5.0000 Matrix must be square. 1.3846 0 1.3846 0 1.4615 0 1.1538-1.0000 norm(x1) = 3.2817 norm(x2) = 6.4807
linsolve (1) A*X = B, (A - mxn, B - mxk) X - nxk X = linsolve(a,b); A kwadratowa: faktoryzacja LU A niekwadratowa: faktoryzacja [X, R] = linsolve(a,b); A kwadratowa: faktoryzacja LU, R = 1/cond(A) A niekwadratowa: faktoryzacja, R=rank(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 rank(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
(1) A nxn λ i - wartości własne v i - w A (λ) = det(a λi) (A λ i I) v i = 0 d = eig(a); d wektor wartości własnych A [V, D] = eig(a); D diagonalna macierz wartości własnych V macierz prawych wektorów własnych AV = VD (V macierz modalna) eig V 1 AV = D
eig w A (λ) = det(a λi) = λ 4 34λ 3 64λ 2 + 2176λ λ 4 34λ 3 64λ 2 + 2176 = 0 λ i {34, 8, 0, 8} A = [16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 ] >> poly(a) ans = 1-34 -64 2176 0 >>d = eig(a) d= 34.0000 8.0000-0.0000-8.0000 >> chol(a)??? Error using ==> chol Matrix must be positive definite.
eig >> eig(a) = 34.0000 8.0000-0.0000-8.0000 (A λ i I) v i = 0 >> [V,D]=eig(A) V = -0.5000-0.8165 0.2236-0.4082-0.5000 0.4082-0.6708 0.0000-0.5000 0.0000 0.6708-0.4082-0.5000 0.4082-0.2236 0.8165 D = 34.0000 0 0 0 0 8.0000 0 0 0 0-0.0000 0 0 0 0-8.0000
eig V 1 AV = D >> [V,D]=eig(A) V = -0.5000-0.8165 0.2236-0.4082-0.5000 0.4082-0.6708 0.0000-0.5000 0.0000 0.6708-0.4082-0.5000 0.4082-0.2236 0.8165 D = 34.0000 0 0 0 0 8.0000 0 0 0 0-0.0000 0 0 0 0-8.0000 >> D = inv(v)*a*v D = 34.0000-0.0000-0.0000 0.0000-0.0000 8.0000 0.0000 0.0000 0.0000-0.0000 0.0000-0.0000 0.0000 0.0000-0.0000-8.0000
eig (2) [V, D] = eig(a, nobalance ); Bez wstępnego równoważenia (skalowania) A - zalecane dla A zawierajacej niedokładne (zaokraglone) elementy o b. małej wartości.
eig B = [ 3-2 -.9 2*eps -2 4 1 -eps -eps/4 eps/2-1 0 -.5 -.5.1 1 ]; B = 3.0000-2.0000-0.9000 0.0000-2.0000 4.0000 1.0000-0.0000-0.0000 0.0000-1.0000 0-0.5000-0.5000 0.1000 1.0000 >> [VB,DB] = eig(b) VB = -0.6153 0.4176 0.0000-0.1496 0.7881 0.3261 0.0000 0.1317 0.0000 0.0000-0.0000-0.9576-0.0189-0.8481-1.0000 0.2078 DB = 5.5616 0 0 0 0 1.4384 0 0 0 0 1.0000 0 0 0 0-1.0000
eig B VB VB DB = 0??? VB = -0.6153 0.4176 0.0000-0.1496 0.7881 0.3261 0.0000 0.1317 0.0000 0.0000-0.0000-0.9576-0.0189-0.8481-1.0000 0.2078 DB = 5.5616 0 0 0 0 1.4384 0 0 0 0 1.0000 0 0 0 0-1.0000 >> B*VB - VB*DB ans = -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000-0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0 0.3288
eig B VN VN DN = 0??? >> [VN,DN] = eig(b,'nobalance') VN = 0.7808-0.4924-0.0000-0.1563-1.0000-0.3845 0.0000 0.1375-0.0000-0.0000-0.0000-1.0000 0.0240 1.0000-1.0000 0.0453 DN = 5.5616 0 0 0 0 1.4384 0 0 0 0 1.0000 0 0 0 0-1.0000 >> B*VN - VN*DN ans = 1.0e-014 * -0.2665 0.0111-0.0592-0.0194 0.4441 0.1221 0.0386-0.0278 0.0022 0.0002 0.0007 0 0.0139-0.0222 0.0222 0.0153
balance poprawiajace uwarunkowanie zadania własnego (równoważenie) (1) A - macierz kwadratowa [T, B] = balance(a); T macierz podobieństwa, dla którego B macierz podobna B=T\A*T posiada możliwie zrównoważone wiersze i kolumny (ze względu na ich normę) B = balance(a); B zrównoważona macierz podobna do A
balance (równoważenie) (2) [S, P, B] = balance(a); S wektor skalujacy (współrzędne to całkowite potęgi 2) P wektor permutujacy T(:,P) = diag(s) oraz B(P,P) = diag(1./s)*a*diag(s) B = balance(a, noperm ); B tylko skalowanie A (bez permutacji)
balance (równoważenie) (3) Zadanie własne dla niesymetrycznych często bywa źle uwarunkowane. Miara uwarunkowania modalnej jest cond(v) = norm(v)*norm(inv(v)), gdzie [V,T] = eig(a)
balance A = [1 100 10000;.01 1 100;.0001.01 1] A = 1.0e+04 * 0.0001 0.0100 1.0000 0.0000 0.0001 0.0100 0.0000 0.0000 0.0001 [T,B] = balance(a) T = 1.0e+03 * 2.0480 0 0 0 0.0320 0 0 0 0.0003 B = 1.0000 1.5625 1.2207 0.6400 1.0000 0.7813 0.8192 1.2800 1.0000 [V,E] = eig(a); V = -1.0000 0.9999 0.9937 0.0050 0.0100-0.1120 0.0000 0.0001 0.0010
balance [V,E] = eig(a); V = -1.0000 0.9999 0.9937 0.0050 0.0100-0.1120 0.0000 0.0001 0.0010 cond(v) = 8.7766e+003 [V,E] = eig(b); V = -0.8873 0.6933 0.0898 0.2839 0.4437-0.6482 0.3634 0.5679-0.7561 cond(v) = 1.4421 cond(t) = 8192
expm Wykładnicza funkcja A nxn X = expm(a); e A = I + A + A2 2 + A3 3 +... X wykładnicza funkcja e A Jaki będzie wynik działań: [V,D] = eig(x); V*diag(exp(diag(D)))/V? Czy exp(a)=expm(a)?
expm A = 2 5 1 3 >> exp(a) = 7.3891 148.4132 2.7183 20.0855 >> expm(a)= 47.8358 130.0844 26.0169 73.8527 E=zeros(size(A)); F=eye(size(A)); k=1; while norm(f,1)>0 E=E+F; F=A*F/k; k=k+1; end E = 47.8358 130.0844 26.0169 73.8527
expm >> [V,D]=eig(A) V = -0.9414-0.8732 0.3373-0.4874 D = 0.2087 0 0 4.7913 >> E = V*diag(exp(diag(D)))/V E = 47.8358 130.0844 26.0169 73.8527
logm Logarytm L = logm(a); L główny logarytm kwadratowej A [L, exitflag] = logm(a); existflag informacja o uzyskanym wyniku: 0 - obliczenia zakończone pomyślnie 1 - uwaga: wynik może być niedokładny Dla osobliwych oraz posiadajacych wartości własne o ujemnej części rzeczywistej funkcja logm jest niezdefiniowana Czy zawsze obowiazuj a równości logm(expm(a)) = A = expm(logm(a))?
logm >> A = 1 1 0 0 0 2 0 0-1 Y = expm(a) Y = 2.7183 1.7183 1.0862 0 1.0000 1.2642 0 0 0.3679 A = logm(y) A = 1.0000 1.0000 0.0000 0 0 2.0000 0 0-1.0000 log(a) ans = 0 0 -Inf -Inf -Inf 0.6931 -Inf -Inf 0.0000 + 3.1416i
sqrtm Pierwiastek kwadratowy (1) X = sqrtm(a); X główny pierwiastek kwadratowej A X*X = A Osobliwa A może nie posiadać pierwiastków. Jako jednoznaczny X wybierany jest ten pierwiastek A, który ma wartości własne o nieujemnch częściach rzeczywistych Dla A z wartościami własnymi o ujemnych częściach rzeczywistych X ma elementy zespolone.
sqrtm A jest rzeczywista, sysmetryczna i dodatnio określona A = 5-4 1 0 0-4 6-4 1 0 1-4 6-4 1 0 1-4 6-4 0 0 1-4 5 Y = sqrtm(a) Y = 2-1 -0-0 -0-1 2-1 0-0 0-1 2-1 0-0 0-1 2-1 -0-0 -0-1 2
sqrtm A jest zespolona, hermitowska i dodatnio określona A = 3.0000 2.0000 + 1.0000i 2.0000-1.0000i 1.0000 A' = 3.0000 2.0000 + 1.0000i 2.0000-1.0000i 1.0000 sqrtm(a) = 1.4853 + 0.1984i 0.9980 + 0.1569i 0.7243-0.7043i 0.6241 + 0.4721i
A może posiadać kilka pierwiastków sqrtm A = 7 10 15 22 >> Y11 =sqrtm(a) Y11 = Y12 = 1.5667 1.7408-1.5667-1.7408 2.6112 4.1779-2.6112-4.1779 Y21 = Y22 = 1 2-1 -2 3 4-3 -4 [V,D] = eig(a); S = sqrt(d) S = +-0.3723 0 0 +-5.3723 >> V*S/V
svd według wartości szczególnych (1) s = svd(x); s wektor wartości szczególnych A [U, S, V] = svd(x); S uogólniona diag. macierz wartości szczegól. U unitarna macierz lewych wektorów szczegól. V unitarna macierz prawych wektorów szczegól. X = U*S*V (diag (S) nierosnaco)
svd X = 1 2 3 4 5 6 7 8 >> [U,S,V] = svd(x) U = S = -0.1525-0.8226-0.3945-0.3800-0.3499-0.4214 0.2428 0.8007-0.5474-0.0201 0.6979-0.4614-0.7448 0.3812-0.5462 0.040 14.2691 0 0 0.6268 0 0 0 0 V = -0.6414 0.7672-0.7672-0.6414
svd według wartości szczególnych (2) [U, S, V] = svd(x,0); Oszczędny algorytm svd: dla X - mxn oraz m > n wyznacza się pierwsze n kolumn U, zaś S - nxn. [U, S, V] = svd(x, econ ); Oszczędny algorytm svd dla X - mxn: m >= n wykorzystuje się svd(x,0), m < n wyznacza się pierwsze m kolumn V, zaś S - mxm.
svd X = 1 2 3 4 5 6 7 8 >> [U,S,V] = svd(x,0) U = -0.1525-0.8226-0.3499-0.4214-0.5474-0.0201-0.7448 0.3812 S = 14.2691 0 0 0.6268 V = -0.6414 0.7672-0.7672-0.6414