Developer documentation

strgy_cvmatrix.h
Go to the documentation of this file.
1 /**********************************************************************
2  * This file is part of the source code of the realroot library.
3  * Author(s): J.P. Pavone, GALAAD, INRIA
4  * $Id: cvmatrix.h,v 1.1 2005/07/11 10:03:57 jppavone Exp $
5  **********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_STRGY_CVMATRIX_HPP
7 #define realroot_SOLVE_SBDSLV_STRGY_CVMATRIX_HPP
8 //--------------------------------------------------------------------
9 #include <realroot/strgy_empty.h>
12 //--------------------------------------------------------------------
13 namespace mmx {
14 //--------------------------------------------------------------------
15 namespace realroot
16 {
17  namespace strgy
18  {
19  template< class system, class _previous_ = strgy::empty<system> >
20  struct cvmatrix : _previous_
21  {
22  typedef typename system::creal_t creal_t;
23  typedef typename system::sz_t sz_t;
24  typedef typename system::interval_t interval_t;
25 
26  void symeigen2( creal_t * base, creal_t * m, bool normalise = false )
27  {
28  numerics::rounding< creal_t > rnd( numerics::rnd_nr() );
29  creal_t b, c, delta;
30  creal_t vp[2];
31  // valeurs propres
32  b = -(m[0]+m[3]);
33  c = m[0]*m[3] - m[1]*m[1];
34  delta = b*b-4*c;
35  assert(delta>=0);
36  delta = std::sqrt(delta);
37  vp[0] = -b - delta;
38  vp[1] = -b + delta;
39  // vecteurs propres
40  base[0] = -m[1];
41  base[1] = m[0]-vp[0];
42  creal_t sc;
43  if ( normalise ) sc = std::sqrt( base[0] * base[0] + base[1] * base[1] ) * vp[0];
44  else sc = std::max(base[0],base[1]);
45  base[0] /= sc;
46  base[1] /= sc;
47  base[2] =-(m[3]-vp[1]);
48  base[3] = m[1];
49  if ( normalise ) sc = std::sqrt( base[2] * base[2] + base[3] * base[3] ) * vp[1];
50  else sc = std::max(base[2],base[3]);
51  base[2] /= sc;
52  base[3] /= sc;
53  };
54 
55  void symeigen( system * slv, creal_t * base, creal_t * m, unsigned n, const creal_t& eps = 1e-12 )
56  {
57  if ( n == 2 ) { symeigen2( base, m ); return; };
58  creal_t vp[n];
59  std::copy(m,m+n*n,base);
60  linear::symeigen(base,vp,n);
61  /* normalisation (vecteur propre / valeur propre) */
62  unsigned i,j;
63  for ( i = 0; i < n; i ++ )
64  for ( j = i+1; j < n; j ++ )
65  std::swap(base[i*n+j],base[j*n+i]);
66 
67  for ( i = 0; i < n ; i ++ )
68  {
69  // creal_t s = 0.0;
70  if ( std::abs(vp[i]) < 1e-3 )
71  for ( unsigned k = 0; k < n; base[i*n+k] /= vp[i], k ++ ) ;
72  };
73  };
74 
75  void applycvmatrix( system * slv, sz_t * eqs, sz_t n )
76  {
77  slv->restrict( eqs, n ); /* restriction des équations */
78  slv->elevate ( eqs, n ); /* élévation des équations */
79  creal_t mean[n];
80  creal_t cvmatrix[ n * n ];
81 
82  unsigned nsmp = slv->m_elenv.sz();
83 
84  for ( sz_t ie = 0; ie < n; ie ++ )
85  {
86  creal_t * data = slv->elldata(eqs[ie]);
87  mean[ie] = 0;
88  for ( unsigned k = 0; k < nsmp; k ++ )
89  mean[ie] += (data[k]-mean[ie])/(k+1);
90  };
91 
92  /* calcul de la partie supérieure de cvmatrix */
93  for ( sz_t ie = 0; ie < n; ie ++ )
94  {
95  creal_t * data0 = slv->elldata(eqs[ie]);
96  creal_t m0 = mean[ie];
97  for ( sz_t id = ie; id < n; id ++ )
98  {
99  creal_t * data1 = slv->elldata(eqs[id]);
100  creal_t m1 = mean[id];
101  creal_t cm = 0.0;
102  for ( int k = 0; k < slv->m_elenv.sz(); k ++ )
103  cm += ((data0[k]-m0)*(data1[k]-m1)-cm)/(k+1);
104  cvmatrix[ ie*n + id ] = cm;
105  };
106  };
107 
108  /* matrice ring_sparseetrique */
109  for ( sz_t ie = 0; ie < n; ie ++ )
110  for ( sz_t id = 0; id < ie; id ++ )
111  cvmatrix[ie*n+id] = cvmatrix[id*n+ie];
112  /* calcul de la base des vecteurs propres */
113  creal_t base[n*n];
114  symeigen( slv, base, cvmatrix, n );
115  slv->transform( base, eqs, n ); /* transformation du systeme */
116  slv->project();
117  };
118 
119  bool process( system * slv )
120  {
121  if ( ! _previous_::process(slv) ) return false;
122  applycvmatrix( slv, slv->m_eqssel, slv->neqs() );
123  return true;
124  };
125  };
126  };
127 };
128 //--------------------------------------------------------------------
129 } //namespace mmx
130 /********************************************************************/
131 #endif //
system::creal_t creal_t
Definition: strgy_cvmatrix.h:22
void symeigen(system *slv, creal_t *base, creal_t *m, unsigned n, const creal_t &eps=1e-12)
Definition: strgy_cvmatrix.h:55
const C & b
Definition: Interval_glue.hpp:25
eenv_t m_elenv
Definition: system_system.h:264
dstack_t::interval_t interval_t
Definition: system_system.h:31
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
void symeigen(real_t *M, real_t *d, int n)
Definition: linear_householder.hpp:170
int sz_t
Definition: system_system.h:35
void elevate(sz_t e, const texp::false_t &)
Definition: system_system.h:433
system::interval_t interval_t
Definition: strgy_cvmatrix.h:24
real_t mean(real_t const *const data, int sz, int st)
Definition: loops_vctops.hpp:122
bool project(sz_t *eqs=0, sz_t ne=0)
Definition: system_system.h:548
void transform(creal_t *mat, sz_t *eqs, sz_t n)
Definition: system_system.h:530
Definition: rounding_mode.hpp:71
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
real_t creal_t
Definition: system_system.h:28
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
void applycvmatrix(system *slv, sz_t *eqs, sz_t n)
Definition: strgy_cvmatrix.h:75
Definition: system_system.h:25
int sz() const
return the total number of coefficients of the dense representation
Definition: tensor_eenv_fcts.hpp:16
scalar< T > sqrt(const scalar< T > &b)
Definition: scalar.hpp:501
Definition: strgy_cvmatrix.h:20
bool process(system *slv)
Definition: strgy_cvmatrix.h:119
sz_t * m_eqssel
Definition: system_system.h:46
const C & c
Definition: Interval_glue.hpp:45
sz_t neqs() const
Definition: system_system.h:85
creal_t * elldata(sz_t e)
Definition: system_system.h:405
system::sz_t sz_t
Definition: strgy_cvmatrix.h:23
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
Definition: array.hpp:12
void symeigen2(creal_t *base, creal_t *m, bool normalise=false)
Definition: strgy_cvmatrix.h:26
#define assert(expr, msg)
Definition: shared_object.hpp:57
Home