數值分析3.1 J迭代法&&GS迭代法

J迭代算法:

解向量我直接開了三維的數組,第三個分量表示第k次迭代的結果

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAXN = 501;
double a[MAXN][MAXN];///係數矩陣
double b[MAXN],x[MAXN][MAXN];///右端項及解
int n,N;///n元方程組,最大迭代N次
double eps;///誤差限
int main()
{
    int ok,cur;///cur表示迭代結束所執行的最後一步
    ///freopen("in.txt","r",stdin);
    while(scanf("%d%d%lf",&n,&N,&eps) != EOF){
        ok = 0;
        for(int i = 0;i<n;i++){///輸入係數矩陣
            for(int j = 0;j<n;j++){
                scanf("%lf",&a[i][j]);
            }
        }
        for(int i = 0;i<n;i++)scanf("%lf",&b[i]);///輸入右端項
        for(int i = 0;i<n;i++)scanf("%lf",&x[i][0]);///輸入初始解向量

        double maxs = 0;
        for(int k = 1;k<=N;k++){///最大循環步數
            maxs = 0;
            for(int i = 0;i<n;i++){
                    x[i][k] = x[i][k-1]*a[i][i] + b[i];
                for(int j = 0;j<n;j++){
                    x[i][k] -= x[j][k-1]*a[i][j];
                }
                x[i][k] /= a[i][i];
                if(maxs < fabs(x[i][k] - x[i][k-1]))maxs = fabs(x[i][k] - x[i][k-1]);
            }
            if(maxs < eps){ok = 1;cur = k;break;}
        }

        if(ok){
            printf("solution :\n");
            for(int i = 0;i<n;i++){
                cout << x[i][cur] << endl;
            }
        }
        else cout << "failed" << endl;
    }
    return 0;
}

可以開兩個二維數組來相互賦值。

GS迭代算法:

其實實現起來比J迭代要舒服。

#include<iostream>
#include<cmath>
#include<fstream>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAX(x,y)  (((x)>(y))?(x):(y))
#define MIN(x,y)  (((x)<(y))?(x):(y))

using namespace std;

const int MAXN=10005;
typedef long long LL;
double a[MAXN][MAXN];///係數矩陣
double b[MAXN],x[MAXN];///右端項及解
int n,N;///n元方程組,最大迭代N次
double eps;///誤差限
int main()
{
    int ok,cur;///cur表示迭代結束所執行的最後一步
    ///freopen("in.txt","r",stdin);
    while(scanf("%d%d%lf",&n,&N,&eps) != EOF){
        ok = 0;
        for(int i = 0;i<n;i++){///輸入係數矩陣
            for(int j = 0;j<n;j++){
                scanf("%lf",&a[i][j]);
            }
        }
        for(int i = 0;i<n;i++)scanf("%lf",&b[i]);///輸入右端項
        for(int i = 0;i<n;i++)scanf("%lf",&x[i]);///輸入初始解向量

        double maxs = 0,xx;
        for(int k = 1;k<=N;k++){///最大循環步數
            maxs = 0;
            for(int i = 0;i<n;i++){
                    xx = x[i];
                    x[i] = b[i];
                for(int j = 0;j<n;j++)if(i!=j){
                    x[i] -= x[j]*a[i][j];
                }
                x[i] /= a[i][i];
                if(maxs < fabs(x[i] - xx))maxs = fabs(x[i] - xx);
            }
            if(maxs < eps){ok = 1;cur = k;break;}
        }

        if(ok){
            printf("solution :\n");
            for(int i = 0;i<n;i++){
                cout << x[i] << endl;
            }
        }
        else cout << "failed" << endl;
    }
    return 0;
}


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