L U decomposition

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
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
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?

Connectez-vous pour commenter.

Réponses (7)

Oleg Komarov
Oleg Komarov le 15 Fév 2011

1 vote

Matlab is case-sensitive, if you want to store the output of x then in the first line change X to lowercase.
Oleg
Mohamed Said Attia
Mohamed Said Attia le 4 Juin 2011

1 vote

*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

ela mti
ela mti le 17 Nov 2020
would you explain to me this part and what is q ?
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
THEOPHILUS GODFREEY
THEOPHILUS GODFREEY le 12 Mai 2021
undefined function or variable m
Walter Roberson
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.

Connectez-vous pour commenter.

Mohamed Said Attia
Mohamed Said Attia le 4 Juin 2011

1 vote

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
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.

Connectez-vous pour commenter.

John
John le 15 Fév 2011

0 votes

I tried this but it still outputs my answer the same way, I originally had it as a lowercase x but I changed it to upper case after I realized it didn't change anything.

1 commentaire

Oleg Komarov
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.

Connectez-vous pour commenter.

Tan Edwin
Tan Edwin le 15 Fév 2011

0 votes

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
John
John le 15 Fév 2011

0 votes

Yes, redefining the x like you said allowed the function to output what I was needing, however I must have an error in my coding because I inputed the following matrices and got the following answer but I am getting a 0 for one of the answers which should not be there. Any possible solutions?
INPUT
A=[ 6 0 0 0 0; 0 1 0 -2 0; 1 0 -3 0 0; 0 8 -4 -3 -2; 0 2 0 0 -1];
B=[1;0;0;1;0];
LU_Parker(A,B)
Output:
X =
0.1667
0
0.0432
0.1841
1.7778
ans =
1.0000 0 0 0 0
0 1.0000 0 0 0
0.1667 0 1.0000 0 0
0 8.0000 1.3333 1.0000 0
0 2.0000 0 0.3077 1.0000
Mahesh Prajapati
Mahesh Prajapati le 21 Sep 2020
Modifié(e) : Walter Roberson le 30 Déc 2020

0 votes

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

Walter Roberson
Walter Roberson le 30 Déc 2020
Suggestions about what?
One thing I would suggest is that you format the code you post.
Gudi Vara Prasad
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
Edmar
Edmar le 25 Fév 2024
Do you have sample of code in LU Decomposition for a 24x24 matrix using MatLab

Connectez-vous pour commenter.

Catégories

En savoir plus sur Statistics and Linear Algebra dans Centre d'aide et File Exchange

Question posée :

le 15 Fév 2011

Commenté :

le 25 Fév 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by