Developer documentation

strgy_newton.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: newton.h,v 1.1 2005/07/11 10:03:57 jppavone Exp $
5  **********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_STRGY_NEWTON_HPP
7 #define realroot_SOLVE_SBDSLV_STRGY_NEWTON_HPP
8 //--------------------------------------------------------------------
11 #include <realroot/strgy_empty.h>
12 //--------------------------------------------------------------------
13 namespace mmx {
14 //--------------------------------------------------------------------
15 namespace realroot
16 {
17  namespace strgy
18  {
19  template< class system, class _previous_ = empty<system> >
20  struct newton : _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  bool process( system * slv )
27  {
28  /* application de la strategie de la classe de base */
29  if ( !_previous_::process(slv) ) return false;
30  /* estimation de la jacobienne en utilisant une différence finie sur le polygone */
31  /* de contrôle, la position correspond à l'abscisse de greville la plus proche */
32  /* du centre du domaine */
33  sz_t nvars = slv->nvr();
34  sz_t neqs = slv->neqs();
35  sz_t * selected = slv->m_eqssel;
36  assert(nvars<=neqs);
37  slv->restrict(selected,neqs); /*std::min(neqs,nvars));*/
38  slv->elevate(selected,neqs); /*selected,std::min(neqs,nvars));*/
39  creal_t jac[nvars*neqs];
40  sz_t add = 0;
41  sz_t * str = slv->m_elenv.str();
42  sz_t * szs = slv->m_elenv.szs();
43  for ( sz_t v = 0; v < nvars; v ++ )
44  add += (szs[v]-1)/2*str[v];
45  for ( sz_t s = 0; s < nvars; s ++ )
46  {
47  sz_t e = selected[s];
48  creal_t * src = slv->elldata(e);
49  /* calcul du coefficient */
50  for ( sz_t v = 0; v < nvars; v ++ )
51  jac[s*nvars+v] = (src[add+str[v]]-src[add])/(slv->top()[v].size()*szs[v]);
52  };
53 
54  // vctops::print(jac,(unsigned)nvars*nvars);
55  // std::cout << std::endl;
56  // vctops::scale(jac,(unsigned)nvars*nvars);
57  // vctops::print(jac,(unsigned)nvars*nvars);
58  // std::cout << std::endl;
59  /* inversion de la jacobienne */
60  int c = 0;
61  creal_t ijac[nvars*nvars];
62  /* tant que la matrice est singuliere */
63  while( !linear::LUinverse(ijac, jac, nvars) )
64  {
65  /* on bruite ses coefficients */
66  // for ( sz_t v = 0; v < nvars; v ++ )
67  for ( sz_t e = 0; e < nvars; e ++ )
68  jac[e*nvars+e] += 1;
69  c ++ ;
70  };
71  // std::cout << std::endl;
72  // std::cout << " try = " << c << std::endl;
73  // for ( unsigned i = 0; i < nvars; i ++ )
74  // {
75  // vctops::print(ijac + i*nvars, nvars );
76  // std::cout << std::endl;
77  // };
78  // std::cout << std::endl;
79 
80  slv->transform( ijac,selected, nvars );
81  slv->project(selected,nvars);
82  /* faire tourner la selection (devrait être cacher dans select(n) du solver */
83  sz_t sv = selected[0];
84  for ( sz_t e = 0; e< neqs-1; e ++ )
85  selected[e] = selected[e+1];
86  selected[neqs-1] = sv;
87  return true;
88  };
89  };
90  };
91 };
92 
93 //--------------------------------------------------------------------
94 } //namespace mmx
95 /********************************************************************/
96 #endif
eenv_t m_elenv
Definition: system_system.h:264
dstack_t::interval_t interval_t
Definition: system_system.h:31
int * szs()
Definition: tensor_eenv_fcts.hpp:12
sz_t nvr() const
Definition: system_system.h:84
T * top()
Definition: system_nstack.h:34
int sz_t
Definition: system_system.h:35
void elevate(sz_t e, const texp::false_t &)
Definition: system_system.h:433
int * str()
Definition: tensor_eenv_fcts.hpp:21
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
real_t creal_t
Definition: system_system.h:28
system::interval_t interval_t
Definition: strgy_newton.h:24
bool process(system *slv)
Definition: strgy_newton.h:26
Definition: system_system.h:25
system::creal_t creal_t
Definition: strgy_newton.h:22
Definition: strgy_newton.h:20
sz_t * m_eqssel
Definition: system_system.h:46
const C & c
Definition: Interval_glue.hpp:45
system::sz_t sz_t
Definition: strgy_newton.h:23
sz_t neqs() const
Definition: system_system.h:85
bool LUinverse(real_t *iM, real_t const *const M, unsigned n)
Definition: linear_doolittle.hpp:74
creal_t * elldata(sz_t e)
Definition: system_system.h:405
Definition: array.hpp:12
void add(dynamic_exp< E > &r, const dynamic_exp< E > &A, const dynamic_exp< E > &B)
Definition: dynamicexp.hpp:295
#define assert(expr, msg)
Definition: shared_object.hpp:57
Home