function X=uptrbk(A,B)
%Input -A is an N x N nonsingular matrix
% -B is an N x 1 matrix
%Output -X is an N x 1 matrix containing the solution to AX=B
%Initialize X and the temporary storage matrix C
[N N]=size(A);
X = zeros(N,1);
C = zeros(1,N+1);
%Form the augmented matrix : Aug=[A|B]
Aug=[A B];
for p=1:N-1
% Partial povoting for column p
[Y,j]=max(abs(Aug(p:N,p)));
%Interchange row p and j
C=Aug(p,:);
Aug(p,:)=Aug(j+p-1,:);
Aug(j+p-1,:)=Aug(j+p-1,:);
Aug(j+p-1,:)=C;
if Aug(p,p)==0
'A was singular. No unique solution';
end
%Elimination process for column p
for k=p+1:N
m=Aug(k,p)/Aug(p,p);
Aug(k,p:N+1)=Aug(k,p:N+1)-m*Aug(p,p:N+1);
end
end
U=Aug(1:N,1:N);
Y=Aug(1:N,N+1);
X=backsub(U,Y);