Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TMATH_UTIL_H
Toshihiro Shimizu 890ddd
#define TMATH_UTIL_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "texception.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <numeric></numeric>
f278a5
#include <complex></complex>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef __sgi
Toshihiro Shimizu 890ddd
#include <cmath></cmath>
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#include <math.h></math.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TNZCORE_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
enum TMathError { INFINITE_SOLUTIONS = -1 };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class DVAPI TMathException final : public TException {
Shinya Kitaoka 120a6e
  TString m_msg;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TMathException(std::string msg);
Shinya Kitaoka 120a6e
  virtual ~TMathException() {}
Shinya Kitaoka 473e70
Shinya Kitaoka 473e70
  TString getMessage() const override { return m_msg; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*!
Toshihiro Shimizu 890ddd
  Decompose a square matrix [A] dim(A)=[n x n]  using the LU method.
Toshihiro Shimizu 890ddd
  A is a matrix stored for row.
Toshihiro Shimizu 890ddd
  \par A array of coeff
Shinya Kitaoka 120a6e
  \par n size of matrix
Toshihiro Shimizu 890ddd
  \par indx array with permutation from pivoting
luz paz 6454c4
  \par d +1/-1 and depend whether the number of row interchanges (even or odd)
Toshihiro Shimizu 890ddd
  \note If error a TException is thrown.
Toshihiro Shimizu 890ddd
  \include mathutils_ex2.cpp
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI void tLUDecomposition(double *A, int n, int *indx, double &d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*!
Toshihiro Shimizu 890ddd
  Use the back-substitution method to solve the linear
Toshihiro Shimizu 890ddd
  system A*x=b.
Toshihiro Shimizu 890ddd
  \par A matrix exited from tLUDecomposition
Toshihiro Shimizu 890ddd
  \par n size of matrix
Toshihiro Shimizu 890ddd
  \par indx array exited from tLUDecomposition
Toshihiro Shimizu 890ddd
  \par b in input is array of element
Toshihiro Shimizu 890ddd
  \ret b in output contains result
Toshihiro Shimizu 890ddd
  \note A is the square matrix [n x n] returned from tLUDecomposition routine.
Toshihiro Shimizu 890ddd
  \sa tLUDecomposition
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI void tbackSubstitution(double *A, int n, int *indx, double *b);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Solve the system A*x=b.
Toshihiro Shimizu 890ddd
  It`s needed to insert b in res.
Toshihiro Shimizu 890ddd
  A and res are modifyed in the routine.
Shinya Kitaoka 120a6e
  \par A matrix
Shinya Kitaoka 120a6e
  \par n size of matrix
Toshihiro Shimizu 890ddd
  \note A is square [n x n]
Toshihiro Shimizu 890ddd
  \include mathutils_ex1.cpp
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI void tsolveSistem(double *A, int n, double *res);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Solve the system A*x=b.
Toshihiro Shimizu 890ddd
  It`s needed to insert b in res.
Toshihiro Shimizu 890ddd
  A and res are modifyed in the routine.
Toshihiro Shimizu 890ddd
  \note A is square [n x n]
Toshihiro Shimizu 890ddd
  \include mathutils_ex1.cpp
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
inline void tsolveSistem(std::vector<double> &A, std::vector<double> &res) {</double></double>
Shinya Kitaoka 120a6e
  assert(res.size() * res.size() == A.size());
Shinya Kitaoka 120a6e
  tsolveSistem(&A[0], res.size(), &res[0]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Find determinant of square matrix A
Shinya Kitaoka 120a6e
  \par A is matrix to test
Toshihiro Shimizu 890ddd
  \par n size of matrix
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI double tdet(double *A, int n);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Shinya Kitaoka 120a6e
  Find determinant of square matrix A [n x n], using information
Toshihiro Shimizu 890ddd
  from tLUDecomposition decomposition.
Toshihiro Shimizu 890ddd
  \par LUa output matrix from tLUDecomposition
Toshihiro Shimizu 890ddd
  \par n size of matrix
Toshihiro Shimizu 890ddd
  \par d parameter from tLUDecomposition
Toshihiro Shimizu 890ddd
  \sa tLUDecomposition
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI double tdet(double *LUa, int n, double d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Find real root of a polynomious
Toshihiro Shimizu 890ddd
  \par poly is a vector with coeff of polynomious in crescent order.
Toshihiro Shimizu 890ddd
  \ret sol is the vector of solution and contain real found solution.
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
DVAPI int rootFinding(const std::vector<double> &poly,</double>
Shinya Kitaoka 120a6e
                      std::vector<double> &sol);</double>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
f278a5
  Find complex roots of a quadratic equation
f278a5
    a*x^2 + b*x + c = 0
f278a5
  \ret count of roots found:
f278a5
    0 if a and b are almost zero
f278a5
    1 if a is almost zero
f278a5
    2 if a is not almost zero
f278a5
    roots may have duplicates, count depends only from type of equation
f278a5
 */
f278a5
DVAPI int solveEquation2(std::complex<double> *roots, double a, double b, double c);</double>
f278a5
f278a5
//-----------------------------------------------------------------------------
f278a5
f278a5
/*!
f278a5
  Find complex roots of a cubic equation:
f278a5
    a*x^3 + b*x^2 + c*x + d = 0
f278a5
  \ret count of roots found:
f278a5
    0 if a, b and c are almost zero
f278a5
    1 if a and b are almost zero
f278a5
    2 if a is almost zero
f278a5
    3 if a is not almost zero
f278a5
    roots may have duplicates, count depends only from type of equation
f278a5
 */
f278a5
DVAPI int solveEquation3(std::complex<double> *roots, double a, double b, double c, double d);</double>
f278a5
f278a5
//-----------------------------------------------------------------------------
f278a5
f278a5
/*!
f278a5
  Find complex roots of a power of four equation:
f278a5
    a*x^4 + b*x^3 + c*x^2 + d*x + e = 0
f278a5
  \ret count of roots found:
f278a5
    0 if a, b, c and d are almost zero
f278a5
    1 if a, b and c are almost zero
f278a5
    2 if a and b are almost zero
f278a5
    3 if a is almost zero
f278a5
    4 if a is not almost zero
f278a5
    roots may have duplicates, count depends only from type of equation
f278a5
 */
f278a5
DVAPI int solveEquation4(std::complex<double> *roots, double a, double b, double c, double d, double e);</double>
f278a5
f278a5
//-----------------------------------------------------------------------------
f278a5
f278a5
/*!
Toshihiro Shimizu 890ddd
  Check if val is nearest to epsilon.
Toshihiro Shimizu 890ddd
  \par val value to test
Toshihiro Shimizu 890ddd
  \par eps tolerance required
Toshihiro Shimizu 890ddd
  \ret true if value is nearest to zero
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
inline bool isAlmostZero(double val, double eps = TConsts::epsilon) {
Shinya Kitaoka 120a6e
  return -eps < val && val < eps;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
f278a5
  Check if complex val is nearest to epsilon.
f278a5
  \par val value to test
f278a5
  \par eps tolerance required
f278a5
  \ret true if value is nearest to zero
f278a5
 */
f278a5
inline bool isAlmostZero(std::complex<double> val, double eps = TConsts::epsilon) {</double>
f278a5
  return val.real()*val.real() + val.imag()*val.imag() < eps*eps;
f278a5
}
f278a5
f278a5
f278a5
//-----------------------------------------------------------------------------
f278a5
f278a5
/*!
Toshihiro Shimizu 890ddd
  Find number of roots of a poly in interval min max.
Toshihiro Shimizu 890ddd
  \par order degree of polynomious
Toshihiro Shimizu 890ddd
  \par coeff of poly in crescent order
Toshihiro Shimizu 890ddd
  \par lesser extreme
Toshihiro Shimizu 890ddd
  \par greater extreme
Toshihiro Shimizu 890ddd
  \ret number of root
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
DVAPI int numberOfRootsInInterval(int order, const double *polyH, double min,
Shinya Kitaoka 120a6e
                                  double max);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Find the real root of the poly a*x^3+b*x^2+c*x+d in [0,1]
Toshihiro Shimizu 890ddd
  \par a coeff of x^3
Toshihiro Shimizu 890ddd
  \par b coeff of x^2
Toshihiro Shimizu 890ddd
  \par c coeff of x^1
Toshihiro Shimizu 890ddd
  \par d coeff of x^0
Toshihiro Shimizu 890ddd
  \ret the real root of the poly, or 1.0 if the root is not in [0,1]
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
DVAPI double cubicRoot(double a, double b, double c, double d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Find the root of the poly a*x^2+b*x+c
Toshihiro Shimizu 890ddd
  \par a coeff of x^2
Toshihiro Shimizu 890ddd
  \par b coeff of x^1
Toshihiro Shimizu 890ddd
  \par c coeff of x^0
Toshihiro Shimizu 890ddd
  \ret the root of the poly, or 1.0 if it does not exist
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
DVAPI double quadraticRoot(double a, double b, double c);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // #ifndef TMATH_UTIL_H
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
// End Of File
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------