追趕法比較特殊,比前面的算法實現起來都要簡單,唯一要注意的是gamma的座標從1開始
程序分別用3個數組存放三條對角線
代碼如下:
///對於係數矩陣是三對角矩陣的方程組可以用追趕法
#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
const int MAXN = 1000;
double a[MAXN];
double d[MAXN];
double c[MAXN];
double b[MAXN];
double A[MAXN];
double B[MAXN];
double x[MAXN];
double y[MAXN];
int main()
{
int n;
freopen("in.txt","r",stdin);
while(cin >> n){
for(int i = 0;i<n;i++)cin >> b[i];
for(int i = 0;i<n;i++)cin >> a[i];///先輸入主對角線
for(int i = 0;i<n-1;i++)cin >> c[i];///再輸入上對角線---瞎編的名稱
for(int i = 1;i<n;i++)cin >> d[i];///下對角線---瞎編的名稱,注意下角標從1開始
///Crout分解
A[0] = a[0];B[0] = c[0]/A[0];
for(int i = 1;i<n;i++){
A[i] = a[i] - d[i]*B[i-1];
if(i<n-1)B[i] = c[i]/A[i];
}
///迴帶求y
y[0] = b[0]/A[0];
for(int i = 1;i<n;i++){
y[i] = (b[i] - y[i-1]*d[i])/A[i];
}
///迴帶求x
x[n-1] = y[n-1];
for(int i = n-2;i>=0;i--){
x[i] = y[i] - x[i+1]*B[i];
}
///輸出
/*for(int i = 0;i<n;i++){
if(!i)cout << y[i];
else cout << " " << y[i];
}
cout << endl;*/
for(int i = 0;i<n;i++){
if(!i)cout << x[i];
else cout << " " << x[i];
}
cout << endl;
}
return 0;
}