L U decomposition
57 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Below I have a code written for solving the L U decomposition of a system of equations however I need my code to just output the answers with this format it outputs the variables in the matrix for example i need the function to output x [1;2;3;4] any suggestions?
function[L,U,X]=LU_Parker(A,B)
[m n]=size(A);
if (m ~= n )
disp ( 'LR2 error: Matrix must be square' );
return;
end;
% Part 2 : Decomposition of matrix into L and U
L=zeros(m,m);
U=zeros(m,m);
for i=1:m
% Finding L
for k=1:i-1
L(i,k)=A(i,k);
for j=1:k-1
L(i,k)= L(i,k)-L(i,j)*U(j,k);
end
L(i,k) = L(i,k)/U(k,k);
end
% Finding U
for k=i:m
U(i,k) = A(i,k);
for j=1:i-1
U(i,k)= U(i,k)-L(i,j)*U(j,k);
end
end
end
for i=1:m
L(i,i)=1;
end
% Program shows U and L
U
L
% Now use a vector y to solve 'Ly=b'
y=zeros(m,1);
y(1)=B(1)/L(1,1);
for i=2:m
y(i)=-L(i,1)*y(1);
for k=2:i-1
y(i)=y(i)-L(i,k)*y(k);
y(i)=(B(i)+y(i))/L(i,i);
end;
end;
% Now we use this y to solve Ux = y
x=zeros(m,1);
x(1)=y(1)/U(1,1);
for i=2:m
x(i)=-U(i,1)*x(1);
for k=i:m
x(i)=x(i)-U(i,k)*x(k);
x(i)=(y(i)+x(i))/U(i,i);
end;
end
2 commentaires
Daz
le 3 Fév 2015
Aren't you going to get a divide by 0 error? At the very end of what I quoted, you have L(i,k) = L(i,k)/U(k,k);
But the first time through, U is a zero matrix.
L=zeros(m,m); U=zeros(m,m); for i=1:m % Finding L for k=1:i-1 L(i,k)=A(i,k); for j=1:k-1 L(i,k)= L(i,k)-L(i,j)*U(j,k); end L(i,k) = L(i,k)/U(k,k); end
ela mti
le 17 Nov 2020
is "i" a counter that shows how many time should loop be done?could you explain that to me?and also "k" and "j" are counter for rows and coluomn?is that so?
Réponses (7)
Oleg Komarov
le 15 Fév 2011
Matlab is case-sensitive, if you want to store the output of x then in the first line change X to lowercase.
Oleg
0 commentaires
Mohamed Said Attia
le 4 Juin 2011
*there is a problem with the way you are solving the equation to get y & x try*
% Now use a vector y to solve 'Ly=b'
y=zeros(m,1); % initiation for y
y(1)=B(1)/L(1,1);
for i=2:m
%y(i)=B(i)-L(i,1)*y(1)-L(i,2)*y(2)-L(i,3)*y(3);
y(i)=-L(i,1)*y(1);
for k=2:i-1
y(i)=y(i)-L(i,k)*y(k);
end;
y(i)=(B(i)+y(i))/L(i,i);
end;
y
% Now we use this y to solve Ux = y
x=zeros(m,1);
x(m)=y(m)/U(m,m);
i=m-1;
q=0;
while (i~= 0)
x(i)=-U(i,m)*x(m);
q=i+1;
while (q~=m)
x(i)=x(i)-U(i,q)*x(q);
q=q+1;
end;
x(i)=(y(i)+x(i))/U(i,i);
i=i-1;
end;
x
3 commentaires
Walter Roberson
le 12 Mai 2021
Refer back to the original question; the Answer here only shows the changes instead of copying everything before then as well.
Mohamed Said Attia
le 4 Juin 2011
and when you call the function from matlab use
[L,U,X]=LU_Parker(A,B) not LU_Parker(A,B)
1 commentaire
Walter Roberson
le 4 Juin 2011
Not really relevant: if you do not specify output variables and do not put a semi-colon at the end of the line, you will get
ans =
for each of the output variables, in left-to-right order.
John
le 15 Fév 2011
1 commentaire
Oleg Komarov
le 15 Fév 2011
Then can you post the undesired result and the desired one? It's not very clear from your first description.
Tan Edwin
le 15 Fév 2011
Maybe u can try adding X=x to allow it to ouput the values of x?
not sure if this is what u want.
edwin
0 commentaires
Mahesh Prajapati
le 21 Sep 2020
Modifié(e) : Walter Roberson
le 30 Déc 2020
any suggestions?
function[L,U,X]=LU_Parker(A,B)
[m n]=size(A);
if (m ~= n ) disp ( 'LR2 error: Matrix must be square' ); return; end;
% Part 2 : Decomposition of matrix into L and U
L=zeros(m,m);
U=zeros(m,m);
for i=1:m
% Finding L
for k=1:i-1
L(i,k)=A(i,k);
for j=1:k-1
L(i,k)= L(i,k)-L(i,j)*U(j,k);
end
L(i,k) = L(i,k)/U(k,k);
end
% Finding U
for k=i:m
U(i,k) = A(i,k);
for j=1:i-1
U(i,k)= U(i,k)-L(i,j)*U(j,k);
end
end
end
for i=1:m
L(i,i)=1;
end
% Program shows U and L U L
% Now use a vector y to solve 'Ly=b'
y=zeros(m,1);
y(1)=B(1)/L(1,1);
for i=2:m
y(i)=-L(i,1)*y(1);
for k=2:i-1
y(i)=y(i)-L(i,k)*y(k);
y(i)=(B(i)+y(i))/L(i,i);
end;
end;
% Now we use this y to solve Ux = y
x=zeros(m,1);
x(1)=y(1)/U(1,1);
for i=2:m
x(i)=-U(i,1)*x(1);
for k=i:m
x(i)=x(i)-U(i,k)*x(k);
x(i)=(y(i)+x(i))/U(i,i);
end;
end
3 commentaires
Gudi Vara Prasad
le 20 Avr 2021
Modifié(e) : Gudi Vara Prasad
le 20 Avr 2021
% There is some mistake with the Back Substituion at the end in the above code. Please check it again..
clc;
clear all;
close all;
format 'short';
% input:
% A = coefficient matrix
% B = right hand side vector
% output:
% x = solution vector
disp('Application of LU Decomposition')
tic
A = % user input
B = % user input
[m, n] = size(A);
if m ~= n, error('Matrix A must be square'); end
% Decomposition of matrix into L and U :
L=zeros(m,m);
U=zeros(m,m);
for i=1:m
% Finding L
for k=1:i-1
L(i,k)=A(i,k);
for j=1:k-1
L(i,k)= L(i,k)-L(i,j)*U(j,k);
end
L(i,k) = L(i,k)/U(k,k);
end
% Finding U
for k=i:m
U(i,k) = A(i,k);
for j=1:i-1
U(i,k)= U(i,k)-L(i,j)*U(j,k);
end
end
end
for i=1:m
L(i,i)=1;
end
% Program shows U and L U L :
% Now use a vector y to solve 'Ly=b' :
y=zeros(m,1);
y(1)=B(1)/L(1,1);
for i=2:m
y(i)=-L(i,1)*y(1);
for k=2:i-1
y(i)=y(i)-L(i,k)*y(k);
y(i)=(B(i)+y(i))/L(i,i);
end
end
fprintf("Lower Decomposition Traingle = ")
L
fprintf("Upper Decomposition Traingle = ")
U
% Now we use this y to solve Ux = y
% x=zeros(m,1);
% x(1)=y(1)/U(1,1);
% for i=2:m
% x(i)=-U(i,1)*x(1);
% for k=i:m
% x(i)=x(i)-U(i,k)*x(k);
% x(i)=(y(i)+x(i))/U(i,i);
% end
% end
% Back substitution :
x = zeros(n, 1);
AM = [U B];
x(n) = AM(n, n+1) / AM(n, n);
for i = n - 1: - 1:1
x(i) = (AM(i, n+1) - AM(i, i + 1:n) * x(i + 1:n)) / AM(i, i);
end
fprintf("Solution of the system is = ")
x
Voir également
Catégories
En savoir plus sur Matrix Decomposition dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!