/*---------------------------------------------------------------- Tridiagonal Matrix Inversion Source Code Copyright © 2020 James R. Craig, University of Waterloo ----------------------------------------------------------------*/ #include using namespace std; ////////////////////////////////////////////////////////////////// /// \brief Inverts Tridiagonal matrix with diagonals cc,a, and b using algorithm from /// Usmani,R. A. (1994). "Inversion of a tridiagonal jacobi matrix". Linear Algebra and its Applications. 212-213: 413–414. /// assumes b[N] is zero, and all three indices correspond to matrix row - performs a shift to standard tridiagonal form /// \param cc [in ] shifted left diagonal (cc[i+1]=A[i][i-1]) [length=size] /// \param a [in ] diagonal (a[i]=A[i][i]) [length=size] /// \param b [in ] right diagonal (b[i]=A[i][i+1] [length=size] /// \param Ainv [out] resultant inverse matrix (assumes memory is already allocated in array of doubles) /// \param size [in] N, size of NxN square matrix /// void InvertTridiagonal(const double *cc,const double *a,const double *b, double **Ainv,const int size) { int i,j,k; int N=size; double th_im1,th_jm1,ph_ip1,ph_jp1; double bprod,cprod; double *theta=new double[N]; double *phi =new double[N]; double *c =new double[N]; for(i=0;i=0;i--) { phi [i]=a[i]*phi [i+1]-b[i ]*c[i ]*phi [i+2]; } for(i=0;i