trislv.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. // Triangular Solves
  10. #ifndef TRISLV_H
  11. #define TRISLV_H
  12. #include "triang.h"
  13. template <class Matrix, class _Vector>
  14. _Vector Lower_triangular_solve(const Matrix &A, const _Vector &b)
  15. {
  16.     Subscript N = A.num_rows();
  17.     // make sure matrix sizes agree; A must be square
  18.     assert(A.num_cols() == N);
  19.     assert(b.dim() == N);
  20.     _Vector x(N);
  21.     Subscript i;
  22.     for (i=1; i<=N; i++)
  23.     {
  24.         typename _Vector::element_type tmp=0;
  25.         for (Subscript j=1; j<i; j++)
  26.                 tmp += A(i,j)*x(j);
  27.         x(i) =  (b(i) - tmp)/ A(i,i);
  28.     }
  29.     return x;
  30. }
  31. template <class Matrix, class Vector>
  32. Vector Unit_lower_triangular_solve(const Matrix &A, const Vector &b)
  33. {
  34.     Subscript N = A.num_rows();
  35.     // make sure matrix sizes agree; A must be square
  36.     assert(A.num_cols() == N);
  37.     assert(b.dim() == N);
  38.     Vector x(N);
  39.     Subscript i;
  40.     for (i=1; i<=N; i++)
  41.     {
  42.         typename Matrix::element_type tmp=0;
  43.         for (Subscript j=1; j<i; j++)
  44.                 tmp = tmp + A(i,j)*x(j);
  45.         x(i) =  b(i) - tmp;
  46.     }
  47.     return x;
  48. }
  49. template <class Matrix, class Vector>
  50. Vector linear_solve(const LowerTriangularView<Matrix> &A, const Vector &b)
  51. {
  52.     return Lower_triangular_solve(A, b);
  53. }
  54.     
  55. template <class Matrix, class Vector>
  56. Vector linear_solve(const UnitLowerTriangularView<Matrix> &A, const Vector &b)
  57. {
  58.     return Unit_lower_triangular_solve(A, b);
  59. }
  60.     
  61. //********************** Upper triangular section ****************
  62. template <class Matrix, class Vector>
  63. Vector Upper_triangular_solve(const Matrix &A, const Vector &b)
  64. {
  65.     Subscript N = A.num_rows();
  66.     // make sure matrix sizes agree; A must be square
  67.     assert(A.num_cols() == N);
  68.     assert(b.dim() == N);
  69.     Vector x(N);
  70.     Subscript i;
  71.     for (i=N; i>=1; i--)
  72.     {
  73.         typename Matrix::element_type tmp=0;
  74.         for (Subscript j=i+1; j<=N; j++)
  75.                 tmp = tmp + A(i,j)*x(j);
  76.         x(i) =  (b(i) - tmp)/ A(i,i);
  77.     }
  78.     return x;
  79. }
  80. template <class Matrix, class Vector>
  81. Vector Unit_upper_triangular_solve(const Matrix &A, const Vector &b)
  82. {
  83.     Subscript N = A.num_rows();
  84.     // make sure matrix sizes agree; A must be square
  85.     assert(A.num_cols() == N);
  86.     assert(b.dim() == N);
  87.     Vector x(N);
  88.     Subscript i;
  89.     for (i=N; i>=1; i--)
  90.     {
  91.         typename Matrix::element_type tmp=0;
  92.         for (Subscript j=i+1; j<i; j++)
  93.                 tmp = tmp + A(i,j)*x(j);
  94.         x(i) =  b(i) - tmp;
  95.     }
  96.     return x;
  97. }
  98. template <class Matrix, class Vector>
  99. Vector linear_solve(const UpperTriangularView<Matrix> &A, const Vector &b)
  100. {
  101.     return Upper_triangular_solve(A, b);
  102. }
  103.     
  104. template <class Matrix, class Vector>
  105. Vector linear_solve(const UnitUpperTriangularView<Matrix> &A, const Vector &b)
  106. {
  107.     return Unit_upper_triangular_solve(A, b);
  108. }
  109.     
  110. #endif
  111. // TRISLV_H