add numerical recipes library
This commit is contained in:
53
lib/nr/cpp/recipes/ludcmp.cpp
Normal file
53
lib/nr/cpp/recipes/ludcmp.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
#include <cmath>
|
||||
#include "nr.h"
|
||||
using namespace std;
|
||||
|
||||
void NR::ludcmp(Mat_IO_DP &a, Vec_O_INT &indx, DP &d)
|
||||
{
|
||||
const DP TINY=1.0e-20;
|
||||
int i,imax,j,k;
|
||||
DP big,dum,sum,temp;
|
||||
|
||||
int n=a.nrows();
|
||||
Vec_DP vv(n);
|
||||
d=1.0;
|
||||
for (i=0;i<n;i++) {
|
||||
big=0.0;
|
||||
for (j=0;j<n;j++)
|
||||
if ((temp=fabs(a[i][j])) > big) big=temp;
|
||||
if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
|
||||
vv[i]=1.0/big;
|
||||
}
|
||||
for (j=0;j<n;j++) {
|
||||
for (i=0;i<j;i++) {
|
||||
sum=a[i][j];
|
||||
for (k=0;k<i;k++) sum -= a[i][k]*a[k][j];
|
||||
a[i][j]=sum;
|
||||
}
|
||||
big=0.0;
|
||||
for (i=j;i<n;i++) {
|
||||
sum=a[i][j];
|
||||
for (k=0;k<j;k++) sum -= a[i][k]*a[k][j];
|
||||
a[i][j]=sum;
|
||||
if ((dum=vv[i]*fabs(sum)) >= big) {
|
||||
big=dum;
|
||||
imax=i;
|
||||
}
|
||||
}
|
||||
if (j != imax) {
|
||||
for (k=0;k<n;k++) {
|
||||
dum=a[imax][k];
|
||||
a[imax][k]=a[j][k];
|
||||
a[j][k]=dum;
|
||||
}
|
||||
d = -d;
|
||||
vv[imax]=vv[j];
|
||||
}
|
||||
indx[j]=imax;
|
||||
if (a[j][j] == 0.0) a[j][j]=TINY;
|
||||
if (j != n-1) {
|
||||
dum=1.0/(a[j][j]);
|
||||
for (i=j+1;i<n;i++) a[i][j] *= dum;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user