數值分析2.2 追趕法

追趕法比較特殊,比前面的算法實現起來都要簡單,唯一要注意的是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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章