lu.c 1.8 KB

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