lu.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/gmath.h>
  4. #define TINY 1.0e-20;
  5. int G_ludcmp(double **a, int n, int *indx, double *d)
  6. {
  7. int i, imax = 0, j, k;
  8. double big, dum, sum, temp;
  9. double *vv;
  10. vv = G_alloc_vector(n);
  11. *d = 1.0;
  12. for (i = 0; i < n; i++) {
  13. big = 0.0;
  14. for (j = 0; j < n; j++)
  15. if ((temp = fabs(a[i][j])) > big)
  16. big = temp;
  17. if (big == 0.0) {
  18. *d = 0.0;
  19. return 0; /* Singular matrix */
  20. }
  21. vv[i] = 1.0 / big;
  22. }
  23. for (j = 0; j < n; j++) {
  24. for (i = 0; i < j; i++) {
  25. sum = a[i][j];
  26. for (k = 0; k < i; k++)
  27. sum -= a[i][k] * a[k][j];
  28. a[i][j] = sum;
  29. }
  30. big = 0.0;
  31. for (i = j; i < n; i++) {
  32. sum = a[i][j];
  33. for (k = 0; k < j; k++)
  34. sum -= a[i][k] * a[k][j];
  35. a[i][j] = sum;
  36. if ((dum = vv[i] * fabs(sum)) >= big) {
  37. big = dum;
  38. imax = i;
  39. }
  40. }
  41. if (j != imax) {
  42. for (k = 0; k < n; k++) {
  43. dum = a[imax][k];
  44. a[imax][k] = a[j][k];
  45. a[j][k] = dum;
  46. }
  47. *d = -(*d);
  48. vv[imax] = vv[j];
  49. }
  50. indx[j] = imax;
  51. if (a[j][j] == 0.0)
  52. a[j][j] = TINY;
  53. if (j != n) {
  54. dum = 1.0 / (a[j][j]);
  55. for (i = j + 1; i < n; i++)
  56. a[i][j] *= dum;
  57. }
  58. }
  59. G_free_vector(vv);
  60. return 1;
  61. }
  62. #undef TINY
  63. void G_lubksb(double **a, int n, int *indx, double b[])
  64. {
  65. int i, ii, ip, j;
  66. double sum;
  67. ii = -1;
  68. for (i = 0; i < n; i++) {
  69. ip = indx[i];
  70. sum = b[ip];
  71. b[ip] = b[i];
  72. if (ii >= 0)
  73. for (j = ii; j < i; j++)
  74. sum -= a[i][j] * b[j];
  75. else if (sum)
  76. ii = i;
  77. b[i] = sum;
  78. }
  79. for (i = n - 1; i >= 0; i--) {
  80. sum = b[i];
  81. for (j = i + 1; j < n; j++)
  82. sum -= a[i][j] * b[j];
  83. b[i] = sum / a[i][i];
  84. }
  85. }