LU-faktorisering
Syfte: Matematik är ett av de verktyg som används inom numerisk analys. Detta innebär dock inte att man alltid bör använda matematiska formler för praktisk problemlösning, ofta krävs en omformulering. Vi såg detta redan i den första laborationen. Här följer några fler exempel.
När man gör teori för linjära ekvationssystem är det bekvämt med matrisinverser; detta gäller även om man är numeriker. Detta faktum medför dock inte att matrisinverser är bra för praktiska beräkningar.
![]() |
Kör kodavsnittet nedan. Klipp och klista. Kommentarer? Förklara tidsskillnaden! Spara körtiderna. |
n = 3000;
A = randn(n);
b = randn(n, 1);
tic; x = inv(A) * b; toc
tic; y = A \ b; toc
Det är vanligt att man arbetar med stora matriser som innehåller många nollor, så kallade glesa matriser. Glesa matriser uppkommer t.ex. när man löser olika typer av differentialekvationsproblem. Som Du strax kommer att se är det alldeles speciellt ineffektivt att arbeta med inverser av glesa matriser.
I följande övning kommer Du att använda kommandot
spdiags
för att skapa en så kallad
tridiagonal matris, dvs. en matris som har nollor överallt
utom på (huvud)diagonalen och den första diagonalen
under
och över huvud-diagonalen. Man kan använda kommandot
spy
för att plotta matrisen gleshetsstruktur, dvs.
man
ritar en punkt för varje ickenolla, nollor ritas ej. Observera att
Matlab
använder ett annat lagringsformat för glesa matriser än
för
fulla matriser. När matrisen är gles så lagras endast
ickenollorna och i Matlab (det finns andra datastrukturer) lagras alla
tripplar,
(j, k, ajk), där ajk är skilt
från
noll.
![]() |
Matrisen A är positivt definit. Studera
gleshetsstrukturerna (help spy ) hos A, chol(A)
respektive inv(A) . Hur många element krävs
för att lagra inversen respektive Choleskyfaktorn? Titta i
spy-graferna eller använd nnz . Spara
körtider och uppgifter om minnesbehoven. Chol-kommandot
beräknar den sk Choleskyfaktoriseringen av en matris, ett
specialfall av LU-faktoriseringen, som i sin tur är en variant av
Gausselimination. |
n = 3000;
e = ones(n, 1);
A = spdiags([e 2*e e], -1:1, n, n);
spy(A)
b = randn(n, 1);
tic; x = inv(A) * b; toc
tic; y = A \ b; toc
Här följer en övning på illakonditionerade matriser, konditionstal och residualvektorer.
Den sk Hilbertmatrisen (help hilb
) är mycket
illakonditionerad
för stora dimensioner. Vi vill lösa A x = b, där A
är
en Hilbertmatris av ordning 10. För att skaffa oss ett facit,
fuskar
vi lite och väljer x som består av idel ettor och genererar
så
b (känner vi x, så är ju b = A x). Vi skall nu räkna
ut x och jämföra med den exakta lösningen (som vi ju
känner).
![]() |
Lös A x = b på vanligt sätt och
jämför med den exakta lösningen. Kommentarer? Hur stämmer det med teorin? |
![]() |
Räkna nu ut residualvektorn, r = A x - b (x är
alltså den beräknade lösningen och inte facit).
Kommentarer? Hur stämmer det med teorin (i boken)? |