realroot_doc 0.1.1
|
void mmx::linear::caract_polynom | ( | real_t * | p, |
real_t * | M, | ||
int | n | ||
) |
Definition at line 215 of file linear_householder.hpp.
References cpolynom(), and householder().
{ real_t d[n]; real_t e[n]; householder( M, d, e, n ); cpolynom( p, M, n ); };
void mmx::linear::cpolynom | ( | real_t * | p, |
real_t * | M, | ||
int | n | ||
) |
Definition at line 178 of file linear_householder.hpp.
References mmx::sparse::copy(), and mmx::sparse::swap().
Referenced by caract_polynom().
{ real_t cp1[n+1]; real_t * p1 = cp1; real_t * p0 = p; int i,k,c; for ( k = 0; k <= n; p0[k] = p1[k] = 0, k ++ ) ; p0[0] = 1; p1[0] = M[n*(n-1)+(n-1)]; p1[1] = -1; c = 0; for ( i = n-2; i >= 0; i -- ) { real_t a = M[i*n+i]; real_t b = M[i*n+i+1]; for ( k = 0; k <= n-2-i; k ++ ) p0[k] = -p0[k]*(b*b); for ( k = 0; k <= n-1-i; k ++ ) p0[k] += a*p1[k]; for ( k = 1; k <= n-i; k ++ ) p0[k] -= p1[k-1]; // for ( k = 0; k <= n-1-i; k ++ ) // p0[k] += a*p1[k]; // for ( k = 1; k <= n-i; k ++ ) // p0[k] -= p1[k-1]; std::swap(p0,p1); }; if ( p1 != p ) std::copy( p1, p1 + n+1, p ); // if ( c ) std::copy( p1, p1 + n+1, p0 ); };
bool mmx::linear::doolittle | ( | real_t const *const | A, |
real_t * | L, | ||
real_t * | U, | ||
unsigned | n | ||
) |
Definition at line 41 of file linear_doolittle.hpp.
References mmx::abs(), and mmx::vctops::sum().
Referenced by LUinverse(), and LUsolve().
{ unsigned k,i,p; for ( k = 0; k < n; k++ ) { // valueof(k); for ( i = k; i < n; i ++ ) { U[ k*n + i ] = A[ k*n + i ]; for ( p = 0; p < k; p ++ ) U[ k*n + i ] -= L[ k*n + p ]*U[ p*n + i ]; }; for ( i = k + 1; i < n; i ++ ) { if ( std::abs( U[ k*n + k ] ) < numerics::epsilon<real_t>::result*n*n ) return false; real_t sum = 0.0; for ( p = 0; p < k; p ++ ) sum += L[i*n+p]*U[p*n+k]; L[i*n+k] = (A[i*n + k] - sum)/U[ k*n + k ]; }; }; return true; };
bool mmx::linear::gramschmidt | ( | real_t * | M, |
unsigned | m, | ||
unsigned | n | ||
) |
Definition at line 17 of file linear_gramschmidt.hpp.
References assert.
{ unsigned i,j,k; assert(m<=n); for ( i = 0; i < m; i ++ ) { real_t s = 0.0; for ( k = 0; k < n; k ++ ) s += M[i*n+k]*M[i*n+k]; if ( s < numerics::epsilon<real_t>::result ) return false; for ( j = i+1; j < m; j ++ ) { real_t d = 0.0; for ( k = 0; k < n; k ++ ) d += M[i*n+k]*M[j*n+k]; d /= s; for ( k = 0; k < n; k ++ ) M[j*n+k] -= d*M[i*n+k]; }; }; return true; };
void mmx::linear::householder | ( | real_t * | M, |
real_t * | d, | ||
real_t * | e, | ||
int | n | ||
) |
Definition at line 22 of file linear_householder.hpp.
References mmx::scale(), and mmx::sqrt().
Referenced by caract_polynom(), and symeigen().
{ int i,j,k,l; real_t scale, hh, h, g, f; real_t * mi = M + (n-1)*n; for ( i = n-1; i >= 1; i--, mi -= n ) { l = i-1; h = scale = 0.0; if ( l > 0 ) { for ( k = 0; k <= l; scale += fabs(mi[k]), k ++ ) ; if ( scale == 0.0 ) e[i] = mi[l]; else { for ( k = 0; k <= l; mi[k] /= scale, h += mi[k]*mi[k], k ++ ) ; f = mi[l]; g = (f >= 0.0 ? -std::sqrt(h) : std::sqrt(h)); e[i] = scale*g; h -= f*g; mi[l] = f - g; f = 0.0; real_t * mj = M; for ( j = 0; j <= l; j ++, mj += n ) { mj[i] = mi[j]/h; g = 0.0; for ( k = 0; k <= j; g += mj[k]*mi[k], k ++ ) ; for ( k = j+1; k<= l; g += M[k*n+j]*mi[k], k ++ ) ; e[j] = g/h; f += e[j]*mi[j]; }; hh = f /(h+h); for ( j = 0; j <= l; j ++ ) { f = mi[j]; e[j] = g = e[j] - hh*f; for ( k = 0; k <= j; M[j*n+k] -= (f*e[k]+g*mi[k]), k ++ ) ; }; } } else e[i] = mi[l]; d[i] = h; }; d[0] = 0; e[0] = 0; mi = M; for ( i = 0; i < n; i ++, mi += n ) { l = i - 1; if ( d[i] ) for ( j = 0; j <= l; j ++ ) { g = 0.0; for ( k = 0; k <= l; g += mi[k]*M[k*n+j], k ++ ) ; for ( k = 0; k <= l; M[k*n+j] -= g*M[k*n+i], k ++ ) ; }; d[i] = mi[i]; mi[i] = 1.0; for ( j = 0; j <= l; j ++ ) M[j*n+i] = mi[j] = 0.0; }; };
void mmx::linear::library | ( | real_t * | M, |
unsigned | n, | ||
real_t * | v | ||
) |
Definition at line 45 of file linear_gramschmidt.hpp.
References mmx::sparse::copy().
{ int m = n; int goods[n]; int c = 0; int i,j,k,p; int already =0; real_t sc[ n ]; c = 0; for ( i = 0; i < n; i ++ ) { real_t s = 0.0; for ( k = 0; k < n; s += M[i*n+k]*M[i*n+k], k ++ ) ; if ( s < numerics::epsilon<real_t>::result ) continue; goods[c++] = i; for ( j = i+1; j < n; j ++ ) { real_t d = 0.0; for ( k = 0; k < n; k ++ ) d += M[i*n+k]*M[j*n+k]; d /= s; for ( k = 0; k < n; k ++ ) M[j*n+k] -= d*M[i*n+k]; }; sc[i] = s; }; if ( c == n ) return; k = 0; while( k < c && goods[k] == k ) k ++; while ( k < c ) { std::copy( M + goods[k]*n, M + (goods[k]+1)*n, M + k ); sc[k] = sc[goods[k]]; k++; }; // vctops::print(goods,c); // std::cout << std::endl; // vctops::print(M,n); // std::cout << std::endl; // vctops::print(M+n,n); // std::cout << std::endl; // std::cout << "c = " << c << std::endl; // std::cout << "n = " << n << std::endl; for ( i = c; i < n; i ++ ) for ( k = 0; k < n; k ++ ) M[i*n+k] = ((real_t)rand())/((real_t)RAND_MAX); // vctops::print(M+c*n,n); // std::cout << std::endl; for ( i = c; i < n; i ++ ) { for ( p = i-1; p >= 0; p-- ) { // std::cout << sc[p] << std::endl; real_t d = 0.0; for ( k = 0; k < n; k ++ ) d += M[p*n+k]*M[i*n+k]; d /= sc[p]; for ( k = 0; k < n; k ++ ) { // std::cout << M[i*n+k] << std::endl; M[i*n+k] -= d*M[p*n+k]; // std::cout << M[i*n+k] << std::endl; }; }; real_t s = 0.0; for ( k = 0; k < n; k ++ ) s += M[i*n+k]*M[i*n+k]; sc[i] = s; }; };
void mmx::linear::Lsolve | ( | real_t * | x, |
real_t const *const | L, | ||
real_t const *const | b, | ||
unsigned | n | ||
) |
Definition at line 17 of file linear_doolittle.hpp.
References mmx::vctops::sum().
Referenced by LUinverse(), and LUsolve().
bool mmx::linear::LUinverse | ( | real_t * | iM, |
real_t const *const | M, | ||
unsigned | n | ||
) |
Definition at line 74 of file linear_doolittle.hpp.
References doolittle(), mmx::vct::fill(), Lsolve(), and Usolve().
Referenced by mmx::realroot::include3().
{ real_t lu[n*n]; real_t xtmp[n] ; real_t tmp[n]; real_t _b[n+1]; real_t * b = _b+1; std::fill( b, b + n , (real_t)0.0 ); if ( ! doolittle( M, lu, lu, n ) ) return false; for ( unsigned c = 0; c < n; c ++ ) { if (c > 0) b[c-1] = 0; b[c] = 1; Lsolve( xtmp, lu, b, n ); if ( !Usolve( tmp, lu, xtmp, n ) ) return false; for ( unsigned i = 0; i < n; i ++ ) iM[ i*n + c ] = tmp[i]; }; return true; };
bool mmx::linear::LUsolve | ( | real_t * | x, |
real_t const *const | M, | ||
real_t const *const | b, | ||
unsigned | n | ||
) |
Definition at line 64 of file linear_doolittle.hpp.
References doolittle(), Lsolve(), and Usolve().
real_t mmx::linear::pythag | ( | const real_t & | a, |
const real_t & | b | ||
) |
Definition at line 87 of file linear_householder.hpp.
References mmx::abs(), and mmx::sqrt().
Referenced by tqli().
void mmx::linear::symeigen | ( | real_t * | M, |
real_t * | d, | ||
int | n | ||
) |
Definition at line 170 of file linear_householder.hpp.
References householder(), and tqli().
{ real_t e[n]; householder( M, d, e, n ); tqli( d, e, n, M ); };
void mmx::linear::tqli | ( | real_t * | d, |
real_t * | e, | ||
int | n, | ||
real_t * | z | ||
) |
Definition at line 106 of file linear_householder.hpp.
References mmx::abs(), assert, and pythag().
Referenced by symeigen().
{ int m,l,iter,i,k; real_t s,r,p,g,f,dd,c,b; for ( i = 1; i < n; i ++ ) e[i-1] = e[i]; e[n-1] = 0.0; for ( l = 0; l < n; l++ )//for ( l = 1; l <= n; l ++ ) { iter = 0; do { for ( m = l; m < n-1; m++ )// for ( m = 1; m <=n-1; m++ ) { dd = std::abs(d[m])+std::abs(d[m+1]); if ( (real_t)(std::abs(e[m])+dd) == dd ) { break; }; }; if ( m != l ) { iter++; assert(iter<30); g = (d[l+1]-d[l])/(2.0*e[l]); r = pythag(g,(real_t)1.0); if ( g >= 0.0 ) g = d[m]-d[l]+e[l]/(g+std::abs(r)); else g = d[m]-d[l]+e[l]/(g-std::abs(r)); s = c = 1.0; p = 0.0; for ( i = m-1; i >= l; i-- ) { f = s*e[i]; b = c*e[i]; e[i+1] = (r=pythag(f,g)); if ( r == 0.0 ) { d[i+1] -= p; e[m] = 0.0; break; }; s = f/r; c = g/r; g = d[i+1]-p; r=(d[i]-g)*s+2.0*c*b; d[i+1]= g +(p=s*r); g = c*r-b; for ( k = 0; k < n; k++ )// for ( k = 1; k <= n; k++ ) { f = z[k*n+i+1];//f = z[k][i+1]; z[k*n+i+1] = s*z[k*n+i]+c*f;//z[k][i+1] = s*z[k][i]+c*f; z[k*n+i] = c*z[k*n+i]-s*f;//z[k][i] = c*z[k][i]-s*f; }; } if ( r == 0.0 && i >= l ) continue; d[l] -= p; e[l] = g; e[m] = 0.0; }; } while( m != l ); }; };
bool mmx::linear::Usolve | ( | real_t * | x, |
real_t const *const | U, | ||
real_t const *const | b, | ||
unsigned | n | ||
) |
Definition at line 28 of file linear_doolittle.hpp.
References mmx::abs(), and mmx::vctops::sum().
Referenced by LUinverse(), and LUsolve().