此处只给定一个函数,传入的数组计算是从1开始,而不是从0开始
这个版本比较复杂,但是便于理解求解过程
int TM(double a[], double b[], double c[], double r[], double x[],int n)
{
//原矩阵形式 要求 对角占优 a(1)=0 c(n)=0
//b1 c1
//a2 b2 c2
// a3 b3 c3
// ···
// an bn
//分解后的矩阵 LU分解 上三角为单位阵
//alpha 1 beta
//gamma alpha 1 beta
// gamma alpha 1 beta
// `````` ``` `` ``
// gamma alpha 1
// Ax=b LUx=d Ux=y Ly=d
//仅对A分解
double *gamma, *alpha, *beta, *y;
gamma=new double[n+1];
alpha=new double[n+1];
beta=new double[n+1];
y=new double[n+1];
gamma[1]=0;//gamma没有1,这里设为0
alpha[1]=b[1];
beta[1]=c[1]/alpha[1];
for (int i=2;i<=n-1;i++){
gamma[i]=a[i];
alpha[i]=b[i]-beta[i-1]*gamma[i];
beta[i]=c[i]/alpha[i];//beta只到n-1
}
gamma[n]=a[n];
alpha[n]=b[n]-beta[n-1]*gamma[n];
//由Ly=d求y 追
y[1]=r[1]/alpha[1];
for (int i=2;i<=n;i++){
y[i]=(r[i]-gamma[i]*y[i-1])/alpha[i];
}
//由Ux=y求x 赶
x[n]=y[n];
for (int i=n-1;i>=1;i--){
x[i]=y[i]-beta[i]*x[i+1];
}
delete[] gamma;
delete[] alpha;
delete[] beta;
delete[] y;
return 0;
}