e Języki Modelowania i Symulacji e Marcin Ciołek Katedra Systemów Automatyki WETI, Politechnika Gdańska 14 grudnia 2011
O czym będziemy mówili? e 1 e 2 3 4 5
e help sparse rzadka zawiera stosunkowo mała liczbę niezerowych elmentów w swoich komórkach. Oszczędność na: czasie obliczeniowym, pamięci do przechowywania. Na przykład macierz jednostkowa n n 1 0... 0 0 1... 0...... 0 0... 1
e help sparse Czy potrzba tyle samo pamięci, aby przechować element zerowy i niezerowy? MATLAB używa trzech, żeby przechować macierz rzadka: wektor z niezerowymi elementami w formacie zmiennoprzecinkowym (nnz - długość wektora), wektor z indeksami wierszy odpowiadajacymi niezerowym elementom(nnz - długość wektora), wektor z ze wskaźnikami do poczatku każdej kolumny (n - długość wektora). Liczba bajtów potrzebna do zapisania j: 8 nnz + 4 (nnz + n)
help sparse e A = 0 0 0 5 0 2 0 0 1 3 0 0 0 0 4 0 % konwersja A na macierz rzadką >> S = sparse(a) S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5 % powrót do postaci pełnej >> A == full(s);
help sparse e A = 0 0 0 5 0 2 0 0 1 3 0 0 0 0 4 0 %bezpośrednie tworzenie rzadkich S = sparse([3 2 3 4 1],[1 2 2 3 4], [1 2 3 4 5],4,4) S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
help sparse e n = 5; E = eye(n) E = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 S = sparse(1:n,1:n,1); S = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 (5,5) 1
help sparse e whos Name Size Bytes Class Attributes E 5x5 200 double S 5x5 128 double sparse n 1x1 8 double Name Size Bytes Class Attributes E 100x100 80000 double S 100x100 2408 double sparse n 1x1 8 double
help sparse e 350 300 250 Oczędność czasu obliczeniowego E-czas/S-czas 200 150 100 50 0 0 10 20 30 40 50 60 70 80 90 100 Numer iteracji %Postać klasyczna tic E^2; toc Elapsed time is 0.000697 seconds. %Postać rzadka tic S^2; toc Elapsed time is 0.000027 seconds.
help sparse e 0 10 20 30 40 50 60 spy(s) 70 80 90 100 0 20 40 60 80 100 nz = 100
e help spy modeluje ósme stadium destylacji chemicznej 0 50 100 150 200 250 300 350 400 450 0 100 200 300 400 nz = 1887 load west0479 spy(west0479) whos Name Size Bytes Class Attribute west0479 479x479 24564 double sparse
e help sparse nnz(s) - zwraca liczbę niezerowych j nonzeros(s) - zwraca kolumnę niezerowych j nzmax(s) - zwraca liczbę miejsc zarezerwowanych na niezerowe elementy [i,j,s] = find(s) - zwraca indeksy wierszy i kolumn niezerwoych n = 5; S = sparse(1:n,1:n,1); nnz(s)-> ans = 5 nzmax(s)-> ans = 5 nonzeros(s)-> ans = 1 1 1 1 1 [i,j,s] = find(s) i = [1 2 3 4 5]' j = [1 2 3 4 5]' s = [1 1 1 1 1];
help sparse e B=speye(4); % macierz jednostkowa diagonalna [i,j,s]=find(b); [i,j,s] = 1 1 1 2 2 1 3 3 1 4 4 1 B(3,1) = 42; ans = 1 1 1 3 1 42 2 2 1 3 3 1 4 4 1
e C = 4 0 0-1 0 4 0-1 0 0 4-1 -1-1 -1 4 help sparse C=4*speye(4); C(1:3,4)=-1; C(4,1:3)=-1; C=4*speye(4); for k=1:3 C(k,4)=-1; C(4,k)=-1; end % to jest dopiero dobre podejście i = [1 4 2 4 3 4 1 2 3 4]'; j = [1 1 2 2 3 3 4 4 4 4]'; s = [4-1 4-1 4-1 -1-1 -1 4]'; CSP = sparse(i,j,s);
e help spdiags Tworzenie j z jej diagonalnych S = spdiags(b, d, m, n) B = d = 41 11 0-3 52 22 0 0 63 33 13 2 74 44 24 >> S = spdiags(b,d,7,4); >> full(s) S= 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 0 52 0 0 0 0 63 0 0 0 0 74
e macierz Zapisywanie siatki powiazań przedstawionej za pomoca grafu 1. Kasia 0 1 0 1 2. Basia 1 0 1 0 3. Zosia 0 1 0 1 4. Gosia 1 0 1 0
e 5 4.5 4 3.5 3 2.5 2 Graf połączeń gplot 1.5 1 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 A = 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 %kordynaty węzłów >> xy = [1 3; 2 1; 3 3 ; 2 5] >> gplot(a,xy)
e bucky Model czastki C 60, postać czystego węgla z 60 atomami w prawie sferycznej konfiguiracji Graf połączeń - piłka Bucky'ego 0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8-1 -0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 1 [B,v]=bucky; gplot(b,v) axis equal
bucky e Graf połączeń - piłka Bucky'ego 1 14 15 13 0.8 18 17 11 12 0.6 0.4 19 16 2 10 0.2 20 3 9 0 1 6-0.2 22 4 8 5 7-0.4 23 21-0.6 26 30 24 25-0.8 27 29-1 28-1 -0.5 0 0.5 1 k = 1:30; [B,v] = bucky; gplot(b(k,k),v(k,:)) axis square for j=1:30, text(v(j,1),v(j,2),int2str(j),... 'FontName','Times New Roman','FontSize',16); end
bucky e 0 10 20 30 40 50 Położenie niezerowych na płaszyźnie XY 60 0 10 20 30 40 50 60 nz = 180 k = 1:30; [B,v] = bucky; spy(b)
bucky e
permutacja e p = [1 3 4 2 5]; I = eye(5,5); %permutacja wierszowa P = I(p,:) P = 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 %permutacja kolumnowa R = I(:,p) R = 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1
permutacja e n=5; I=speye(n); p = [1 3 4 2 5]; P = I(p,:) R = I(:,p) p = (1:n)*R I = P = R = (1,1) 1 (1,1) 1 (1,1) 1 (1,1) 1 (4,2) 1 (3,2) 1 (1,1) 1 (2,3) 1 (4,3) 1 (1,1) 1 (3,4) 1 (2,4) 1 (1,1) 1 (5,5) 1 (5,5) 1 p = 1 3 4 2 5
permutacja e Jak uzyskać wektor permutacji? n=5; S = [ones(1,n); ones(n-1,1) speye(n-1,n-1)]; A = full(s) 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 j = colperm(s) j = 2 3 4 5 1 p = sort(full(sum(spones(s)) p = 2 3 4 5 1
e permutacja Jaki wpływ może mieć wstępna permutacja j na wynik algorytmów Cholesky ego i LU? L = lu(s); nnz(l) ans = 23 fill(l) ans = 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000-1.0000 0-1.0000-1.0000 1.0000 0-1.0000-1.0000-1.0000 1.0000 1.0000 1.0000 2.0000 1.0000 1.0000 1.0000 1.0000 0.5000 1.5000
e permutacja Jaki wpływ może mieć wstępna permutacja j na wynik algorytmów Cholesky ego i LU? S = j = 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 2 3 4 5 1 S1 = S(j,j); S1 = 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1
e permutacja Jaki wpływ może mieć wstępna permutacja j na wynik algorytmów Cholesky ego i LU? S = j = 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 2 3 4 5 1 S1 = S(j,:); S1 = 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1
e permutacja Jaki wpływ może mieć wstępna permutacja j na wynik algorytmów Cholesky ego i LU? S1 = 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 j = 2 3 4 5 1 S2 = S1(:,j); S2 = 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1
e permutacja Jaki wpływ może mieć wstępna permutacja j na wynik algorytmów Cholesky ego i LU? L = lu(s(j,j)); nnz(l) ans = 13 fill(l) ans = 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1-3
symrcm e Zmiana uporzadkowania (metoda Cuthill-McKee) umieszcza niezerowe elementy w pobliżu głównej diagonali, zachowujac symetrię ich ułożenia nie daje gwarancji znalezienia minimalnej szerokości pasma, nadaje się zarówno dla symetrycznych i niesymetrycznych, użyteczna dla problemów long and thin.
symrcm e B 0 10 20 30 40 50 60 4 0 20 40 60 nz = 180 B(p,p) 0 10 20 30 40 50 60 0 20 40 60 nz = 180 B = bucky; p = symrcm(b); R = B(p,p);
symamd i colamd e Zmiana uporzadkowania (metoda Minimum Degree Ordering) bazuje na obserwacji zmiany liczby połaczeń węzłów podczas algorytmu eliminacji Gaussa macierz wynikowa jest rzadsza niż w przypadku zastosowania innych uporzadkowań, dla symetrycznych - symamd, dla niesymetrycznych - colamd.
symamd i colamd e B 0 10 20 30 40 50 60 4 0 20 40 60 nz = 180 B(p,p) 0 10 20 30 40 50 60 0 20 40 60 nz = 180 B = bucky; p = symamd(b); R = B(p,p);
lu e 4 n=length(b); B=B-3*speye(n); r = symrcm(b); p = symamd(b); nnz(lu(b)) ans = 1022 nnz(lu(b(r,r))) ans = 968 nnz(lu(b(p,p))) ans = 636
chol e 0 20 chol(b) 0 20 chol(b(r,r)) 0 20 chol(b(p,p)) 40 4 60 0 20 40 60 nz = 541 40 60 0 20 40 60 nz = 514 40 60 0 20 40 60 nz = 348 n=length(b); B=B+4*speye(n); r = symrcm(b); p = symamd(b); nnz(chol(b)) ans = 541 nnz(chol(b(r,r))) ans = 514 nnz(chol(b(p,p))) ans = 348
eigs e eigs(a, B, k, sigma, opts) Funkcja ta pozwala na iteracyjne znajdowanie (domyślnie jest 6 największych) dla bardzo dużych i rzadkich. musi być kwadratowa. opts: lm - największe własne opts: sm - najmniejsze własne
eigs e 4 %Symetryczna dodatnio określona macierz o rozmiarze %632x632, 18 powtarza się dla 4 A = delsq(numgrid('c',30)); d = eig(full(a)); [dum,ind] = sort(abs(d)); dlm = eigs(a); dsm = eigs(a,6,'sm');
e 4 4 eigs(a,18,sigma) eigs 4 4 0 2 4 6 8 10 12 14 16 18 eigs(a,18,4.0)??? %1/(lambda - 4.0) gdzie lambda jest estymatą % własnej sigma = 4-1e-6; [V,D] = eigs(a,18,sigma);
svds e A - mxn s = svds(a); (nie musi być rzadka!) s wektor sześciu największych A s = svds(a, k); s = svds(a,k, L ); s wektor k największych s = svds(a, k, sigma); s wektor k najbliższych skalarnemu sigma
e svds s = svds(a, k, sigma, options); opcja znaczenie domyślnie tol kryterium zbieżności: 1e-10 norm(av-us,1)<=tol*norm(a,1) (A=USV ) maxit ograniczenie liczby iteracji 300 disp liczba 0 wyświetlana w każdej iteracji Zwracane sa tylko te szczególne, dla których osiagnięto wymagana dokładność
svds e [U, S, V] = svds(a,...); U macierz mxk o ortonormalnych kolumnach S diagonalna kxk V nxk o ortonormalnych kolumnach U*S*V przybliżenie A (w 1-normie) o rzędzie najbliższym A [U, S, V, flag] = svds(a,...); flag = 0 zbieżność: norm(a*v-u*s,1) <= tol*norm(a,1)) 1 brak zbieżności)
svds e load west0479 s = svd(full(west0479)); display(s(1:4)) ans = 1.0e+005 * [3.1895 3.1725 3.1695 3.1685] Elapsed time is 0.083878 seconds. sl = svds(west0479,4) sl = 1.0e+005 * [3.1895 3.1725 3.1695 3.1685] Elapsed time is 0.009256 seconds.