about summary refs log tree commit diff
path: root/usth/MATH2.4/labwork/3/GaussPivot.m
diff options
context:
space:
mode:
Diffstat (limited to 'usth/MATH2.4/labwork/3/GaussPivot.m')
-rw-r--r--usth/MATH2.4/labwork/3/GaussPivot.m25
1 files changed, 25 insertions, 0 deletions
diff --git a/usth/MATH2.4/labwork/3/GaussPivot.m b/usth/MATH2.4/labwork/3/GaussPivot.m
new file mode 100644
index 0000000..7764b3a
--- /dev/null
+++ b/usth/MATH2.4/labwork/3/GaussPivot.m
@@ -0,0 +1,25 @@
+function x = GaussPivot (A, b)
+  [m n] = size (A);
+  m ~= n && error ('Matrix A must be square');
+  nb = n + 1;
+  Aug = [A b];
+  % forward elimination
+  for k = 1 : n - 1
+    % partial pivoting
+    [big i] = max (abs (Aug(k:n, k)));
+    ipr = i + k - 1;
+    if ipr ~= k
+      Aug([k ipr], :) = Aug([ipr k], :);
+    end
+    for i = k + 1 : n
+      coeff = Aug(i, k) / Aug(k, k);
+      Aug(i, k:nb) = Aug(i, k:nb) - coeff * Aug(k, k:nb);
+    end
+  end
+  % back substitution
+  x = zeros (n, 1);
+  x(n) = Aug(n, nb) / Aug(n, n);
+  for i = n - 1 : -1 : 1
+    x(i) = (Aug(i, nb) - Aug(i, i+1:n) * x(i+1:n)) / Aug(i, i);
+  end
+end