#include <math.h>Go to the source code of this file.
Functions | |
| int | gaussj (double **a, int n, int m, double tol) |
|
||||||||||||||||||||
|
Definition at line 3 of file gaussj.cpp. Referenced by main().
00004 {
00005 int i, j, k, d = 0; m += n;
00006
00007 /* Forward elimination. */
00008 for (j = 0; j < n; j++)
00009 {
00010 int im = j, j1 = j + 1; double t, pivot = fabs(a[j][j]);
00011
00012 /* Search for maximum coefficient in column. */
00013 for (i = j1; i < n; i++) if ((t = fabs(a[i][j])) > pivot) pivot = t, im = i;
00014
00015 /* Test for pivot less than tolerance (singular matrix). */
00016 if (pivot <= tol) return 0;
00017
00018 /* Interchange rows if necessary. */
00019 if (im != j)
00020 {
00021 double *t = a[j]; a[j] = a[im]; a[im] = t; d ^= 1;
00022
00023 for (k = n; k < m; k++) { double t = a[k][im]; a[k][im] = a[k][j]; a[k][j] = t; }
00024 }
00025
00026 /* Divide equation by leading coefficient. */
00027 pivot = 1.0 / a[j][j]; if (a[j][j] < 0.0) d ^= 1;
00028
00029 for (k = j; k < n; k++) if (a[j][k]) a[j][k] *= pivot;
00030 for (k = n; k < m; k++) if (a[k][j]) a[k][j] *= pivot;
00031
00032 /* Eliminate next variable. */
00033 for (i = j1; i < n; i++)
00034 if (t = a[i][j])
00035 {
00036 for (k = j1; k < n; k++) if (a[j][k]) a[i][k] -= t * a[j][k];
00037 for (k = n; k < m; k++) if (a[k][j]) a[k][i] -= t * a[k][j];
00038 }
00039 }
00040
00041 /* Backward substitution. */
00042 for (i = n - 2; i >= 0; i--)
00043 for (j = i + 1; j < n; j++)
00044 if (a[i][j]) for (k = n; k < m; k++) if (a[k][j]) a[k][i] -= a[i][j] * a[k][j];
00045
00046 return d ? -1 : 1;
00047 }
|
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001