realroot_doc 0.1.1
descartes_solver< real_t, local_method > Class Template Reference

#include <system_descartes1d.hpp>

List of all members.

Public Member Functions

Public Attributes


Detailed Description

template<class real_t, class local_method = bsearch< real_t >>
class mmx::solvers::descartes_solver< real_t, local_method >

Definition at line 303 of file system_descartes1d.hpp.


Constructor & Destructor Documentation

descartes_solver ( unsigned  sz,
const real_t &  eps = 1e-12 
) [inline]

Definition at line 426 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_lmth, descartes_solver< real_t, local_method >::m_prec, descartes_solver< real_t, local_method >::m_stck, and descartes_solver< real_t, local_method >::m_sz.

    {
      m_stck = 0;
      m_sz   = sz;
      m_prec = eps;
      m_lmth = 0;
      unsigned maxdeep = 1;
      real_t ex = 1;
      while ( ex > m_prec ) { ex/=2; maxdeep ++ ; };
      //      std::cout << maxdeep << std::endl;
      maxdeep ++;
      maxdeep *= 3;
      unsigned tsz = maxdeep*(2+m_sz);
      m_stck = new real_t[ tsz ];
    };
~descartes_solver ( ) [inline]

Definition at line 442 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_stck.

                        { 
      delete[] m_stck; 
    };

Member Function Documentation

void output ( Prms &  prms,
real_t *  stck,
const texp::true_t  
) [inline]

Definition at line 369 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_sz.

Referenced by descartes_solver< real_t, local_method >::solve().

    { prms.output( stck[m_sz], stck[m_sz+1], stck[0] > 0, stck[m_sz-1] > 0 ); };
void output ( Prms &  prms,
real_t *  stck,
const texp::false_t  
) [inline]

Definition at line 372 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_sz.

    { prms.output( stck[m_sz], stck[m_sz+1] ); };
void output ( Prms &  prms,
real_t *  stck 
) [inline]

Definition at line 376 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::output().

Referenced by descartes_solver< real_t, local_method >::output().

    { output( prms, stck, sign_wanted< Prms >::result_t() ); };
real_t precision ( real_t *  l) [inline]
bool precision_reached ( real_t *  l) [inline]
void reset ( unsigned  sz,
const real_t &  prec 
) [inline]

Definition at line 312 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_prec, and descartes_solver< real_t, local_method >::m_sz.

    {
      if ( sz <= m_sz && prec >= m_prec ) 
        {
          m_sz = sz;
          m_prec = prec;
          return;
        };
      m_sz = sz; m_prec = prec; 
      this->alloc();
    };
void rockwoodcuts ( real_t *  nxt,
real_t *  prv,
real_t *  mid 
) [inline]

Definition at line 345 of file system_descartes1d.hpp.

References mmx::brnops::decasteljau(), descartes_solver< real_t, local_method >::m_sz, and mmx::brnops::rockwood_cut().

    {
      //      [-------------] b
      //      [---][--------] b 
      //      [---][---][---] b
      real_t i0, i1;
      brnops::rockwood_cut( i0, nxt, m_sz );
      brnops::rockwood_cut( i1, nxt+m_sz-1, m_sz, -1 );
      std::cout << i0 << ", " << (1.0-i1) << std::endl;
      i1 = (1.0-i1);
      brnops::decasteljau(nxt,prv,m_sz,i0);
      brnops::decasteljau(nxt,mid,m_sz,(i1-i0)/(1.0-i0));
      i0 = (1.0-i0)*nxt[m_sz] + i0*nxt[m_sz+1];
      i1 = (1.0-i1)*nxt[m_sz] + i1*nxt[m_sz+1];
      prv[m_sz]   = nxt[m_sz];
      prv[m_sz+1] = i0;
      mid[m_sz]   = i0;
      mid[m_sz+1] = i1;
      nxt[m_sz]   = i1;
    };
void set_sz ( unsigned  sz) [inline]

Definition at line 366 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_sz.

{ m_sz = sz;};
unsigned solve ( Prms &  prms,
const In &  in,
int  option = 0 
) [inline]

Definition at line 380 of file system_descartes1d.hpp.

References descartes_solver< real_t, local_method >::m_lmth, descartes_solver< real_t, local_method >::m_prec, descartes_solver< real_t, local_method >::m_stck, descartes_solver< real_t, local_method >::m_sz, descartes_solver< real_t, local_method >::output(), descartes_solver< real_t, local_method >::precision(), mmx::realroot::sgn(), mmx::vctops::sgncnt(), and descartes_solver< real_t, local_method >::split().

    {
      for ( unsigned i = 0; i < m_sz; i ++ )  m_stck[i] = in[i]; 
      m_stck[m_sz] = 0.0; m_stck[m_sz+1] = 1.0;
      unsigned    roots = 0;
      const unsigned    inc  = m_sz+2;
      real_t * stck = m_stck;
      real_t * stop = stck-inc;
      do
        {
          unsigned sgn = vctops::sgncnt(stck,m_sz);
          switch( sgn )
            {
            case 0:
              stck -= inc;
              break;
            case 1:
              roots ++;
              if ( !option || (roots == option) )
                {
                  if ( m_lmth == 0 ) m_lmth = new local_method(in,m_sz);
                  m_lmth->reach( stck, stck[m_sz], stck[m_sz+1], m_prec );
                  output( prms, stck );
                };
              stck -= inc;
              break;
            default:
              if(  precision( stck ) < m_prec  )
                { 
                  roots++; 
                  if ( !option || (roots == option) ) output(prms,stck);
                  stck -= inc;
                  break;
                };
              split(stck);
              stck += inc;
              break;
            }
        }
      while( stck != stop  );
      if ( m_lmth ) { delete m_lmth; m_lmth = 0; };
      return roots;
    };
void split ( real_t *  r) [inline]

Definition at line 324 of file system_descartes1d.hpp.

References mmx::brnops::decasteljau(), and descartes_solver< real_t, local_method >::m_sz.

Referenced by descartes_solver< real_t, local_method >::solve().

    {
      real_t * l = r+m_sz+2;
      brnops::decasteljau(r,l,m_sz);
      l[m_sz]   = r[m_sz];
      l[m_sz+1] = (r[m_sz]+r[m_sz+1])/2.0;
      r[m_sz]   = l[m_sz+1];
    };

Member Data Documentation

unsigned m_ssz

Definition at line 306 of file system_descartes1d.hpp.


The documentation for this class was generated from the following file: