12 #ifndef TBCI_SOLVER_GAUSS_JORDAN_H
13 #define TBCI_SOLVER_GAUSS_JORDAN_H
15 #include "tbci/basics.h"
16 #include "tbci/matrix.h"
19 # pragma interface "gauss_jordan.h"
23 # define GJ_MINVAL 1e-16
48 const int n = a.
row, m = b.
col;
57 for (
int i = 0;
i < n; ++
i) {
59 int icol = 0, irow = 0;
60 for (
int j = 0; j < n; ++j)
62 for (
register int k = 0; k < n; ++k) {
68 }
else if (ipiv(k) > 1) {
69 STD__ cerr <<
"\n\n error: gaussj: singular Matrix-1 \n\n";
75 for (
register int l = 0; l < n; ++l)
76 SWAP(
a(irow, l),
a(icol, l));
77 for (
register int z = 0; z < m; ++z)
78 SWAP(
b(irow, z),
b(icol, z));
84 STD__ cerr <<
"\n\n error: gaussj: singular Matrix-2 \n" <<
STD__ endl;
85 err |= 2; pivinv = (
T)
HVAL;
87 pivinv = 1.0 /
a(icol, icol);
88 a(icol, icol) = (
T)1.0;
89 for (
register int l = 0; l < n; ++l)
91 for (
register int z = 0; z < m; ++z)
93 for (
int ll = 0; ll < n; ++ll)
95 register T dum =
a(ll, icol);
97 for (
register int v = 0; v < n; ++v)
98 a(ll, v) -=
a(icol, v) * dum;
99 for (
register int w = 0; w < m; ++w)
100 b(ll, w) -=
b(icol, w) * dum;
103 for (
int l = n-1; l >= 0; --l) {
104 if (indxr(l) != indxc(l))
105 for(
register int k = 0; k < n; ++k)
106 SWAP(
a(k, indxr(l)),
a(k, indxc(l)));
NAMESPACE_TBCI char gaussj(Matrix< T > &a, Matrix< T > &b)
#define BCHK(cond, exc, txt, ind, rtval)
void SWAP(T &a, T &b)
SWAP function Note: We could implement a swap function without temporaries: a -= b b += a a -= b a = ...
const Vector< T > const Vector< T > const Vector< T > int T T & err