Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Potrebuju vysvetlit jak funguje tento program vim ze vytvari inverzni matice ale nevim jak presne.
funkce([1 0 1 0; 0 1 0 1; 0 0 1 0; 1 0 0 1])
function y = funkce(x)
[r,s] = size(x);
if r ~= s
disp('Zadejte pouze ctvercovou matici.')
y = [];
return
end
y = eye(r);
for j = 1 : r
for i = j : r
if x(i,j) ~= 0
for k = 1 : r
s = x(j,k); x(j,k) = x(i,k); x(i,k) = s;
s = y(j,k); y(j,k) = y(i,k); y(i,k) = s;
end
t = 1/x(j,j);
for k = 1 : r
x(j,k) = t * x(j,k);
y(j,k) = t * y(j,k);
end
for L = 1 : r
if L ~= j
t = -x(L,j);
for k = 1 : r
x(L,k) = x(L,k) + t * x(j,k);
y(L,k) = y(L,k) + t * y(j,k);
end
end
end
end
break
end
if x(i,j) == 0
disp('Chybna matice!')
y = 'chyba';
return
end
end
x
dekuji za odpoved
Offline

Podle me to provadi pomoci Gauss - Jordanovy metody.
Nebo ches podrobnejsi vysvetleni - co znamenaji ty cykly, podminky a podobne?
Offline

ok, to bude ale tezke :-) no neco zkusim napsat
'x' je ta puvodni matice, ktera se prevadi na jednotkovou, 'y' je ze zacatku jednotkova a prevede se na inverzni.
for j = 1 : r
Tady prochazis vsechny sloupce, takze v 'j' mas cislo sloupce, ktery se snazis vynulovat (krome diagonaly - tam bude 1).
for i = j : r
V tomhle cyklu hledas prvni radek pod diagonalou (vcetne), ktery nema v tom j-tem sloupci nulu.
if x(i,j) ~= 0
To vybere ten "nenulovy" radek.
for k = 1 : r
s = x(j,k); x(j,k) = x(i,k); x(i,k) = s;
s = y(j,k); y(j,k) = y(i,k); y(i,k) = s;
end
To vymeni j-ty a i-ty radek, takze na diagonale, v x(j,j), bude nenulove cislo.
t = 1/x(j,j);
for k = 1 : r
x(j,k) = t * x(j,k);
y(j,k) = t * y(j,k);
end
Tady se ten radek vydeli tak aby na diagonale byla jednicka.
for L = 1 : r
if L ~= j
t = -x(L,j);
for k = 1 : r
x(L,k) = x(L,k) + t * x(j,k);
y(L,k) = y(L,k) + t * y(j,k);
end
end
end
Tenhle cyklus odecte nasobek toho radku s jednickou na diagonale od vsech ostatnich tak, aby vsude jinde v j-tem sloupci byly nuly.
break - vyskoci z cyklu po nalezeni nenuloveho radku - je v te podmince 'if x(i,j) ~= 0' a vyskoci z toho cyklu 'for i = j : r'
if x(i,j) == 0
disp('Chybna matice!')
y = 'chyba';
return
end
Vypise zpravu v pripade, ze nenasel nenulovou hodnotu ve sloupci pod diagonalou (vcetne), takze k matici neexistuje inverzni.
Jestli neco neni jasne tak se ptej, mozna ze odpovim (nebo nekdo jiny)
Offline