Re: how do i solve sparse linear equation like A*x=b

"Paul C. Leopardi" <[email protected]> Fri, 3 Sep 2004 00:46:47 +1000
Newsgroups gmane.comp.lib.mtl.devel
Message-ID <[email protected]>
Yan Yaqin,
See the example below. Best regards

On Thursday 02 September 2004 11:52, Yan Yaqin wrote:
> hi,
> I'm really appreciate for your help, but there's another thing.
> One parameter for lu_substitute is vector_expression, i'm not familiar with
> this type, Would you like to provide me a simple real number demo?
>
> Thanks and best regards!

> ls -l
total 8
lrwxrwxrwx  1 leopardi users   25 2004-09-03 00:24 boost 
-> ../boost/boost-1_31/boost
-rw-r--r--  1 leopardi users 1457 2004-09-03 00:41 sample_solve.cpp
-rw-r--r--  1 leopardi users 1458 2004-09-03 00:40 sample_solve.cpp~

> g++ -I. sample_solve.cpp -o sample_solve

> ./sample_solve
A: [2,2]((0,1),(2,0))
B: [2,2]((1,0),(0,-1))
X: [2,2]((0,-0.5),(1,0))

> cat sample_solve.cpp
#include <fstream>

#include <boost/numeric/ublas/config.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/operation_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/operation.hpp>
#include <boost/numeric/ublas/lu.hpp>

namespace ublas = boost::numeric::ublas;

typedef ublas::row_major                           orientation_t;
typedef ublas::compressed_matrix< double, orientation_t >
                                                   matrix_t;
typedef matrix_t::size_type                        matrix_index_t;
typedef ublas::permutation_matrix<matrix_index_t>  permutation_t;

// Geometric quotient
matrix_index_t
sample_solve (matrix_t& X, const matrix_t& A, const matrix_t& B)
{
  // We solve A*X == B

  matrix_t LU = A;
  permutation_t pvector(A.size1());
  matrix_index_t singular = ublas::lu_factorize(LU, pvector);

  if (! singular)
  {
    X = B;
    ublas::lu_substitute(LU, pvector, X);
  }
  return singular;
}

main()
{
  matrix_t A(2,2);
  matrix_t B(2,2);
  matrix_t X(2,2);

  A(0,1) =     1;
  A(1,0) = 2;
  std::cout << "A: " << A << std::endl;

  B(0,0) = 1;
  B(1,1) =    -1;
  std::cout << "B: " << B << std::endl;

  sample_solve(X,A,B);
  std::cout << "X: " << X << std::endl;
}
>

_______________________________________________
This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/