📄 sor.cpp
字号:
#include"math.h"
#include<iostream>
using namespace std;
#define MAX 12 //定义最大迭代次数
void Jacobi(int n,double **A,double b[],double X[],double w,double e){
int i,j,flag; //flag标志位,记录满足条件的t[i]的个数
double *t=new double[n]; //记录迭代前后迭代解向量的距离
double *Y=new double[n];
double *X_T=new double[n];
cout<<"刚输入的矩阵为:"<<endl; //输出矩阵A
cout<<"**********************************"<<endl;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout<<A[i][j]<<'\t';
cout<<endl;
}
cout<<"**********************************"<<endl;
for(int k=0;k<MAX;k++){ //迭代过程
flag=0;
for(i=0;i<n;i++){
Y[i]=0;
for(j=0;j<n;j++){
if(i!=j)
Y[i]=Y[i]+A[i][j]*X[j];
}
X_T[i]=(1-w)*X[i]+w*(b[i]-Y[i])/A[i][i];
t[i]=fabs(X[i]-X_T[i]); //计算迭代前后迭代解向量的距离
X[i]=X_T[i];
}
for(i=0;i<n;i++) //检验达到要求精度的解的分量的个数
if(t[i]<=e)
flag++;
if(flag==n){ //如果全部都达到精度,输出
cout<<"迭代次数为:"<<endl;
cout<<(k+1)<<endl;
break;
}
} //迭代不成功,退出,输出
if(k==MAX)
cout<<"迭代不成功,超出最大迭代次数 "<<MAX<<",退出!"<<endl;
delete []t;
delete []X_T; //释放空间
delete []Y;
}
void main(){
int n,i,j;
cout<<"请输入矩阵的阶数:"<<endl;
cin>>n;
double **A=new double*[n]; //动态申请空间,存放系数矩阵A
for(i=0;i<n;i++)
A[i]=new double[n];
cout<<"请按行优先输入系数矩阵A:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>A[i][j];
double w;
cout<<"请输入超松弛因子:"<<endl;
cin>>w;
double e;
cout<<"请输入期望的精度:"<<endl;
cin>>e;
double *X=new double[n]; //预先定义初次迭代解向量为0
for(i=0;i<n;i++)
X[i]=0;
double *b=new double[n];
cout<<"请输入向量b :"<<endl;
for(i=0;i<n;i++)
cin>>b[i];
Jacobi(n,A,b,X,w,e);
cout<<"求得的解向量为:"<<endl;
for(i=0;i<n;i++)
cout<<X[i]<<'\t';
cout<<endl;
delete[]X; //释放内存空间
delete[]b;
for(i=0;i<n;i++)
delete[]A[i];
delete []A;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -