雅可比迭代法——高赛迭代法

求解线性方程组的解
(1)雅可比迭代法


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1000;
const double e=0.5*1e-5;
int n;
double a[maxn][maxn];
double x[maxn],y[maxn];
double flag;
//雅可比
void show()
{
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        printf("%lf  ",y[i]);
    }
    cout<<endl;
    return;
}

void die_dai(int cur)
{
    //迭代
    //迭代的终止条件
    double tmp=0;
    for(int i=0;i<n;i++)
    {
        double sum=a[i][n];
        for(int j=0;j<n;j++)
        {
            if(i!=j)
            {
                sum-=a[i][j]*x[j];
            }
        }
        //cout<<sum<<" "<<endl;
        y[i]=sum/a[i][i];
        tmp=max(tmp,fabs(y[i]));
    }
    for(int i=0;i<n;i++)
        x[i]=y[i];
    if(fabs(tmp-flag)>e)
    {
            show();flag=tmp;
            die_dai(cur+1);
        //  show();

    }
    else
    {
        cout<<endl<<cur;
        show();
        return ;
    }
}

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<=n;j++)
            cin>>a[i][j];
    //初始x带入
    for(int i=0;i<n;i++)
        x[i]=0;//
    flag=0;//无穷范数
    die_dai(1);
    return 0;
}
/*
3
10 -1 -2 7.2
-1 10 -2 8.3
-1 -1 5 4.2

*/

(2)高斯赛德尔

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1000;
const double e=0.5*1e-5;
int n;
double a[maxn][maxn];
double x[maxn];
double flag;
//高赛
void show()
{
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        printf("%lf ",x[i]);
    }
    cout<<endl;
    return;
}

void die_dai(int cur)
{
    //迭代
    //迭代的终止条件
    double tmp=0;
    for(int i=0;i<n;i++)
    {
        double sum=a[i][n];
        for(int j=0;j<n;j++)
        {
            if(i!=j)
            {
                sum-=a[i][j]*x[j];
            }
        }
        //cout<<sum<<" "<<endl;
        x[i]=sum/a[i][i];
        tmp=max(tmp,fabs(x[i]));
    }
    if(fabs(tmp-flag)>e)
    {
            show();flag=tmp;
            die_dai(cur+1);
        //  show();
    }
    else
    {
        cout<<endl<<cur;
        show();
        return ;
    }

}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<=n;j++)
            cin>>a[i][j];
    //初始x带入
    for(int i=0;i<n;i++)
        x[i]=0;//
    flag=0;//无穷范数
    die_dai(1);
    return 0;
}
/*

3
1 6 -2 1
2 -2 5 2
4 1 -1 3
3
10 -1 -2 7.2
-1 10 -2 8.3
-1 -1 5 4.2
*/

猜你喜欢

转载自blog.csdn.net/miranda_ymz/article/details/81071777