% gauss_sp.m: Gaussian elimination with scaled partial pivoting. clear; format short; % Step 0: Assign the matrix A and the vector b. n = 4; A = [ 6, -2, 2, 4; 12, -8, 6, 10; 3, -13, 9, 3; -6, 4, 1, -18 ]; b = [ 0.23; 0.32; 0.33; 0.31 ]; % Step 1: Gaussian Elimination with scaled partial pivoting. % Overwrite the matrix. p = (1:n)'; % initialize the pivoting vector s = max(abs(A')); % compute the scale of each row for k = 1:(n-1) r = abs(A(p(k),k)/s(p(k))); kp = k; for i = (k+1):n t = abs(A(p(i),k)/s(p(i))); if t > r, r = t; kp = i; end end l = p(kp); p(kp) = p(k); p(k) = l; % interchange p(kp) and p(k) for i = (k+1):n A(p(i),k) = A(p(i),k)/A(p(k),k); for j = (k+1):n A(p(i),j) = A(p(i),j)-A(p(i),k)*A(p(k),j); end end end p % output the pivoting vector A % output the overwritten matrix % Step 2: Forward subsitiution to solve L*y = b, where % L(i,j) = 0 for j>i; L(i,i) = 1; L(i,j) = A(p(i),j) for i>j. y = zeros(n,1); % initialize y to be a column vector y(1) = b(p(1)); for i = 2:n y(i) = b(p(i)); for j = 1:(i-1) y(i) = y(i)-A(p(i),j)*y(j); end end y % output y % Step 3: Back subsitiution to solve U*x = y % U(i,j) = A(p(i),j) for j>=i; U(i,j) = 0 for i>j. x = zeros(n,1); % initialize x to be a column vector x(n) = y(n)/A(p(n),n); for i = (n-1):-1:1 x(i) = y(i); for j = (i+1):n x(i) = x(i)-A(p(i),j)*x(j); end x(i) = x(i)/A(p(i),i); end x % output x