Jacobiho metoda reseni soustav rovnic

NME cv , 11.03.2019.

pozor na znaceni L,U : nejde o LU-dekompozici (neni tu nasobeni jako v ni, ale scitani)

popis metody (co-jak-proc) hledej ve skriptech

K rozdeleni matice A na horni a dolni trojuhelnikovou matici vyuzijeme built-in fce MATLABu > fce tril a triu (dolni a horni) pozn. prip. lze snadno do-implementovat pomoci FOR cyklu...

Contents

pocatecni deklarace vstupu

A = [5 1 1; 2 7 3; 2 3 8]   % zalezi na PD matic (poc.podm.)
B = [5 10 1; 2 7 3; 2 3 8]

y = [1; 1; 1] %sloupcova prava strana

x_puvodni_odhad = [1; 2; 3]

pocet_iteraci = 100;
x = x_puvodni_odhad;
A =

     5     1     1
     2     7     3
     2     3     8


B =

     5    10     1
     2     7     3
     2     3     8


y =

     1
     1
     1


x_puvodni_odhad =

     1
     2
     3

vypocet pro matici A

L = tril (A, -1);
U = triu(A, 1);

D = A - L - U;  %diag matice, na diagonale ma diagonalni prvky puvodni matice A

F = -inv(D) * (L + U);  % predpisy jsou dany ve skriptech
G = inv(D);

reseni_A = A\y; %reseni primou metodou v MATLABu pro porovnani a vypocet chyby

for i=1:pocet_iteraci
    x = F * x + G * y;
    velikost_reseni_A (i) = norm(x);
    velikost_chyby_A (i) = norm( x - reseni_A );
end

vypocet pro matici B

poyor, ted si prepisuji spoustu promennych, ktere driv byly pro matici A, realnymi daty z matice B!!!!

L = tril (B, -1);
U = triu(B, 1);

D = B - L - U;  %diag matice, na diagonale ma diagonalni prvky puvodni matice A

F = -inv(D) * (L + U);  % predpisy jsou dany ve skriptech
G = inv(D);

reseni_B = B\y; %reseni primou metodou v MATLABu pro porovnani a vypocet chyby

for i=1:pocet_iteraci
    x = F * x + G * y;
    velikost_reseni_B (i) = norm(x);
    velikost_chyby_B (i) = norm( x - reseni_B );
end

vykres RESENI pro matici A a B (prevzato)

subplot(211);
plot(1:pocet_iteraci, velikost_reseni_A, 1:pocet_iteraci, velikost_reseni_B);
title('norma reseni v i-tem kroku');
xlabel('iteraci');
ylabel('norma reseni');
legend('matice A - konverguje','matice B - diverguje');
set(gca,'YScale','log');

vykres CHYBY pro matici A a B (prevzato)

subplot(212);
plot(1:pocet_iteraci, velikost_reseni_A, 1:pocet_iteraci, velikost_chyby_B);
title('norma odchylky od skutecneho reseni');
xlabel('iteraci');
ylabel('norma odchylky');
legend('matice A - konverguje','matice B - diverguje');
set(gca,'YScale','log');