求解线性方程组的解
(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
*/