LU Decomposition, Cholesky Fatorization, MATLAB
1. Implement Matlab functions which can compute the following factorizations of a given matrix:
(1) LU without pivoting
(2) LU with partial pivoting
(3) Cholesky
- Compare the performances of your codes on large-scaled linear systems.
LU Decomposition without pivoting
Code:
% LU without pivoting
clc
ll = 1000;
A = randi([-100,100],[ll,ll]);
AA = A;
U = A;
L = eye(size(A));
[n,m] = size(A);
% built-in function
disp("built-in function:");
tic
lu(A);
toc
for k = 1: m-1
for j = k+1 : m
L(j,k) = U(j,k)./U(k,k);
U(j,k:m) = U(j,k:m) - L(j,k)*U(k,k:m);
end
end
norm(L*U - AA)
% lower space overhead version
disp("my LU:");
tic
for k = 1: m-1
for j = k+1 : m
A(j,k) = A(j,k)./A(k,k);
x = A(j,k);
A(j,k:m) = A(j,k:m) - A(j,k)*A(k,k:m);
A(j,k) = x;
end
end
toc
norm(L+U-A-eye(size(A)));
output:
built-in function:
Elapsed time is 0.017730 seconds.
ans =
6.9136e-07
my LU:
Elapsed time is 2.379155 seconds.
>>
LU Decomposition with pivoting
% LU Decomposition with pivoting ~
ll = 1000;
A = randi([0,100],[ll,ll]);
AA = A;
[n,m] = size(A);
U = A;
L = eye(size(A));
P = L;
clc
for k = 1 : m-1
% U(k:m,k)
v = abs(U(k:m,k));
[M,i] = max(v);
i = i+k-1;
U([i,k],k:m) = U([k,i],k:m);
L([i,k],1:k-1) = L([k,i],1:k-1);
P([i,k],:) = P([k,i],:);
for j = k+1 : m
L(j,k) = U(j,k)./U(k,k);
U(j,k:m) = U(j,k:m) - L(j,k).*U(k,k:m);
end
end
norm(L*U - P*A)
% lower space overhead version
P = eye(size(A));
disp("LU Decompostion with pivoting:")
tic
for k = 1 : m-1
% U(k:m,k)
v = abs(A(k:m,k));
[M,i] = max(v);
i = i+k-1;
A([i,k],:) = A([k,i],:);
P([i,k],:) = P([k,i],:);
for j = k+1 : m
A(j,k) = A(j,k)./A(k,k);
x = A(j,k);
A(j,k:m) = A(j,k:m) - A(j,k)*A(k,k:m);
A(j,k) = x;
end
end
toc
norm(L+U-A)
Output:
ans =
1.6013e-11
LU Decompostion with pivoting:
Elapsed time is 2.568508 seconds.
ans =
1.0000
Cholesky Fatorization
% Cholesky Fatorization
clc
ll = 1000;
A = randi([1,10],[ll,ll]);
A = A*A.';
[n,m] = size(A);
disp("my Cholesky Fatorization:");
tic
R = A;
for k = 1:m
for j = k+1:m
R(j,j:m) = R(j,j:m)- R(k,j:m).*R(k,j)./R(k,k);
end
R(k,k:m) = R(k,k:m)/ sqrt(R(k,k));
R(k,1:k-1)=0;
end
toc
norm(R.'*R-A)
disp("built-in Cholesky Fatorization");
tic
R = chol(A);
toc
norm(R.'*R-A)
my Cholesky Fatorization:
Elapsed time is 2.053415 seconds.
ans =
2.1274e-09
built-in Cholesky Fatorization
Elapsed time is 0.007315 seconds.
ans =
8.9404e-10
>>
本文来自博客园,作者:miyasaka,转载请注明原文链接:https://www.cnblogs.com/kion/p/15975474.html