You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tred2.cc 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "ABACUS.h"
  2. using namespace std;
  3. void ABACUS::tred2 (SQMat_DP& a, Vect_DP& d, Vect_DP& e)
  4. {
  5. int l, k, j, i;
  6. DP scale, hh, h, g, f;
  7. int n = a.size();
  8. for (i = n-1; i > 0; i--) {
  9. l = i - 1;
  10. h = scale = 0.0;
  11. if (l > 0) {
  12. for (k = 0; k < l + 1; k++) scale += fabs(a[i][k]);
  13. if (scale == 0.0) e[i] = a[i][l];
  14. else {
  15. for (k = 0; k < l + 1; k++) {
  16. a[i][k] /= scale;
  17. h += a[i][k] * a[i][k];
  18. }
  19. f = a[i][l];
  20. g = (f >= 0.0 ? -sqrt(h) : sqrt(h));
  21. e[i] = scale * g;
  22. h -= f * g;
  23. a[i][l] = f - g;
  24. f = 0.0;
  25. for (j = 0; j < l + 1; j++) {
  26. a[j][i] = a[i][j]/h;
  27. g = 0.0;
  28. for (k = 0; k < j + 1; k++) g += a[j][k] * a[i][k];
  29. for (k = j + 1; k < l + 1; k++) g += a[k][j] * a[i][k];
  30. e[j] = g/h;
  31. f += e[j] * a[i][j];
  32. }
  33. hh = f/(h +h);
  34. for (j = 0; j < l + 1; j++) {
  35. f = a[i][j];
  36. e[j] = g = e[j] - hh * f;
  37. for (k = 0; k < j + 1; k++) a[j][k] -= (f * e[k] + g * a[i][k]);
  38. }
  39. }
  40. } else
  41. e[i] = a[i][l];
  42. d[i] = h;
  43. }
  44. d[0] = 0.0;
  45. e[0] = 0.0;
  46. for (i = 0; i < n; i++) {
  47. l = i;
  48. if (d[i] != 0.0) {
  49. for (j = 0; j < l; j++) {
  50. g = 0.0;
  51. for (k = 0; k < l; k++) g += a[i][k] * a[k][j];
  52. for (k = 0; k < l; k++) a[k][j] -= g * a[k][i];
  53. }
  54. }
  55. d[i] = a[i][i];
  56. a[i][i] = 1.0;
  57. for (j = 0; j < l; j++) a[j][i] = a[i][j] = 0.0;
  58. }
  59. } // void tred2