Napisati M-fajl sa funkcijom koja metodom proste iteracije rešava sistem jednačina . Broj iteracija fiksirati na 50.
x
function x = sistem(A,b)n = length(A); % Kada se length() primeni na matricu, vraća broj vrsti A1 = zeros(n);b1 = zeros(n,1);% Potrebno je transformisati sistem Ax = b u oblik x = A1*x + b1for i = 1:n A1(i,:) = -A(i,:) / A(i,i); % i-tu vrstu delimo sa -A(i,i) A1(i,i) = 0; % na dijagonali su 0 b1(i) = b(i) / A(i,i); % i-ti el. vektora b delimo sa A(i,i)enddisp('A1 =')disp(A1)disp('b1 =')disp(b1)% Početna aproksimacija rešenja je vektor b1x = b1;% Za dobijanje nove aproksimacije koristi se rekurentna formula: x_n = A1*x_n-1 + b1for i = 1:50 x= A1 * x + b1;end
Napisati M-fajl sa funkcijom koja vraća kolonu duzine čiji su svi elementi jedinice, kvadratnu matricu koja iznad dijagonale ima jedinice, po dijagonali ima · , dok na prvoj poddijagonali ima vrednost , na drugoj poddijagonali ima vrednost , itd. kao i vektor koji je rešenje sistema (koristiti funkciju za nalaženje vektora ).
x
function [A, b, x] = matrica(broj, d)b = ones(d, 1); % vektor kolona dužine d sa svim jedinicamaad = broj*10*ones(d,1);% Formiramo matricu koja na glavnoj dijagonali ima vektor adA = diag(ad);% Poziv diag(ad, 1) formiraće matricu koja na prvoj naddijagonali ima vektor ad % Poziv diag(ad, -1) formiraće matricu koja na prvoj poddijagonali ima vektor ad for i = 1:d-1 ad = ones(d-i, 1); % popunjavamo matricu ispod (II sabirak) i iznad (I sabirak) glavne dijagonale A = A + diag(ad*(broj-i),-1*i) + diag(ad,i); enddisp('A =')disp(A)x = sistem(A, b);disp('Resenje sistema je: ')disp(x)%Tačno rešenje sistema se može dobiti naredbom x = A\bFormirati M-fajl sa funkcijom koja proverava da li je zadata matrica A dijagonalno dominantna. Funkcija vraća vrednost ako je matrica dijagonalno dominantna, inače vraća .
x
function d = dominantna(A)n = length(A);d = zeros(n, 1); % el. d(i) nosiće informaciju o ispunjenosti uslova u i-toj vrstifor i = 1:n % Proveravamo da li je suma apsolutnih vrednosti vandijagonalnih el. i-te vrste % manja od apsolutne vrednosti el. na dijagonali if sum(abs(A(i, :))) - abs(A(i, i)) < abs(A(i, i)) d(i) = 1; else d(i) = 0; endendd = all(d==1);% ili d = all(d);
Formirati M-fajl sa funkcijom koja nalazi rešenje sistema Gaus-Zajdelovom metodom pod uslovom da je matrica dijagonalno dominantna. Inače ispisati poruku: "Matrica nije dijagonalno dominantna". Iterativni postupak se prekida kada za dve uzastopne iteracije važi . Program vraća rešenje i broj iteracija .
x
function [iter, x] = sistem2(A, b, tol)% Prekidamo izvršavanje programa ukoliko matrica nije dijagonalno dominantnaif dominantna(A)==0 error('Matrica nije dijagonalno dominantna'); endn = length(A);A1 = zeros(n);b1 = zeros(n, 1);for i = 1:n A1(i, :) = -A(i, :) / A(i, i); A1(i, i) = 0; b1(i) = b(i) / A(i, i);endq = norm(A1, inf); % uniformna norma matrice tol = tol * (1-q) / q;x0 = b1; % početna aproksimacija rešenjax = x0;iter = 1;while 1 % za nalaženje nove apoksimacije koordinate x_i tačnog rešenja % koristimo vrednosti koordianta x_j, j=1,...i-1 dobijenih iz iste iteracije % zbog toga moramo koristiti for petlju i u njenom i-tom prolasku % računati vrednost koordinate x_i (razlika u odnosu na metodu proste iteracije) for i = 1:n x(i) = A1(i, :) * x + b1(i); end iter = iter + 1; if all(abs(x - x0) <= tol) % kriterijum zaustavljanja break end x0 = x;end% Provera:% disp('Tacno resenje:');% disp(A\b);Formirati M-fajl sa funkcijom koja metodom LU dekompozicije vraća rešenje sistema . Koristiti ugrađenu funkciju .
x
function X = LUdekompozicija(A, b)% Rešavamo sistem Ax = b metodom LU dekompozicije% Na primer:% A = [24.21 2.42 3.85; 2.31 31.49 1.52; 3.49 4.85 28.72]; % b = [1 0 0]';n = length(b);% Koristimo ugrađenu funkciju lu() koja vraća matrice L, U i P[L U P] = lu(A);disp('L =')disp(L)disp('U =')disp(U);% Sada se problem Ax = b svodi na rešavanje dva nova sistema% L*y = b% ----------------------------------------% L(1,1)*y(1) = b(1)% L(2,1)*y(1) + L(2,2)*y(2) = b(2)% L(2,1)*y(1) + L(2,2)*y(2) + L(2,3)*y(3) = b(2)% .....% L(n,1)*y(1) + L(n,2)*y(2)+ ... + L(n,n)*y(n)= b(n)% ----------------------------------------% U*x = y% ----------------------------------------% U(1,1)*x(1) + U(1,2)*x(2) + ... + U(1,n)*x(n) = y(1)% U(2,2)*x(2) + ... + U(2,n)*x(n) = y(2)% .....% U(n-1,n-1)*x(n-1) + U(n-1,n)*x(n) = y(n-1)% U(n,n)*x(n) = y(n)% ----------------------------------------%%%%%%%%%%%%%% rešavamo sistem L*y = b %%%%%%%%%%%%%%y = zeros(n, 1);y(1) = b(1);for i = 2:n y(i) = (b(i) - (L(i, :) * y));enddisp('y =')disp(y)%%%%%%%%%%%%%% rešavamo sistem U*x = y %%%%%%%%%%%%%%X = zeros(n, 1);X(n) = y(n) / U(n, n);for i = n-1:-1:1 X(i) = (y(i) - U(i, :) * X) / U(i, i);endx
function x=LUdekomp(A,b)% kod za LU dekompoziciju (nije ugrađena funkcija, jedinice po dijagonali kod U)n = length(A);L = zeros(n);U = eye(n);L(:, 1) = A(:, 1);U(1, 2:n) = A(1, 2:n) / L(1, 1);for i = 1:n for j = 1:n if j <= i L(i, j) = A(i, j) - (L(i, 1:(j-1)) * U(1:(j-1), j)); else U(i, j) = (A(i, j)-L(i, 1:i-1) * U(1:i-1, j)) / L(i, i); end endenddisp('L =');disp(L);disp('U =');disp(U);%%%%%%%%%%%%%% rešavamo sistem L*y = b %%%%%%%%%%%%%%y = zeros(n, 1);y(1) = b(1) / L(1, 1);for i = 2:n y(i) = (b(i) - (L(i, 1:i-1) * y(1:i-1))) / L(i, i);enddisp('y=')disp(y)%%%%%%%%%%%%%% rešavamo sistem U*x = y %%%%%%%%%%%%%%x=zeros(n,1);x(n)=y(n);for j=n-1:-1:1 x(j)=y(j)-(U(j,j+1:n)*x(j+1:n));endFormirati M-fajl sa funkcijom koja nalazi matricu korišćenjem funkcije iz fajla .
x
% primer: A = [7.05 0.11 0.13 0.15; % 0.17 7.41 0.75 0.80; % 0.97 1.02 8.11 0.11; % 0.13 0.20 0.29 8.42];function inverzna = inverz(A)% dužina matrice A[n, m] = size(A);% E = jedinična matrica dimenzije nxnE = eye(n); inverzna = zeros(n);for i = 1 : n % rešavamo n sistema: A*X(i) = E(i) % inverzna = [X(1) X(2) .. X(n)] % X(i) je i-ta kolona inverzne matrice % E(i) je i-ta kolona jedinične matrice inverzna(:, i) = LUdekompozicija(A, E(:, i));end