📄 lu.cpp
字号:
//#include "stdafx.h"
#include "LU.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
LU::LU()
{
}
LU::~LU()
{
}
void LU::ludcmp(float **a, int n, int *indx, float *d)
{
int i,imax,j,k;
float big,dum,sum,temp;
float *vv;
vv=vector(1,n);
*d=1.0;
for (i=1;i<=n;i++) {
big=0.0;
for (j=1;j<=n;j++){
if ((temp=(float)fabs(a[i][j])) > big) big=temp;
}
if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
vv[i]=(float)(1.0/big);
}
for (j=1;j<=n;j++) {
for (i=1;i<j;i++) {
sum=a[i][j];
for (k=1;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=1;k<j;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (dum=(float)(vv[i]*fabs(sum))) >= big) {
big=dum;
imax=i;
}
}
if (j != imax) {
for (k=1;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) {
dum=(float)(1.0/(a[j][j]));
for (i=j+1;i<=n;i++) a[i][j] *= dum;
}
}
free_vector(vv,1,n);
}
void LU::lubksb(float **a, int n, int *indx, double *b)
{
int i,ii=0,ip,j;
float sum;
for (i=1;i<=n;i++) {
ip=indx[i];
sum=(float)b[ip];
b[ip]=b[i];
if (ii)
for (j=ii;j<=i-1;j++) sum -= (float)(a[i][j]*b[j]);
else if (sum) ii=i;
b[i]=sum;
}
for (i=n;i>=1;i--) {
sum=(float)b[i];
for (j=i+1;j<=n;j++) sum -= (float)(a[i][j]*b[j]);
b[i]=sum/a[i][i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -