📄 2.cpp
字号:
#include<iostream>
#include<math.h>
using namespace std;
double a[11][11],b[11];
double x[11],w=1.25,epi=1e-6;
void Jacobi();
void SOR();
int main()
{
//定义方程组
for(int i=1;i<=10;i++)
{
for(int j=1;j<=10;j++)
a[i][j]=1.0/(i+j-1);
b[i]=1.0/i;
x[i]=0.0;//初始向量取0
}
Jacobi();
//初始向量取0
for(int i=1;i<=10;i++)
x[i]=0.0;
SOR();
system("pause");
return 0;
}
void Jacobi()
{
double max=0.0;
bool succ=1;
do{
if(max>10000)
{
cout<<"Jacobi迭代法不收敛"<<endl;
succ=0;
break;
}
max=0.0;
//保存上一次的结果
double x_last[11];
for(int i=1;i<=10;i++)
x_last[i]=x[i];
for(int i=1;i<=10;i++)
{
double sum=0.0;
for(int j=1;j<=10;j++)
if(j!=i)
sum+=a[i][j]*x_last[j];
x[i]=(b[i]-sum)/a[i][i];
if(max<fabs(x[i]-x_last[i]))
max=fabs(x[i]-x_last[i]);
}
}while(max>epi);
if (succ)
{
cout<<"Jacobi迭代法求出方程组的解x="<<endl;
for(int i=1;i<=10;i++)
cout<<x[i]<<endl;
}
}
void SOR()
{
double max;
do{
max=0.0;
for(int i=1;i<=10;i++)
{
double sum=0.0,last=x[i];
//j<i的x[j]已经更新为最新计算出的
for(int j=1;j<=10;j++)
sum+=a[i][j]*x[j];
x[i]=x[i]+w*(b[i]-sum)/a[i][i];
if(max<fabs(x[i]-last))
max=fabs(x[i]-last);
}
}while(max>epi);
cout<<"SOR迭代法求出方程组的解x="<<endl;
for(int i=1;i<=10;i++)
cout<<x[i]<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -