程序实现:
double MaxOfList(vector<double>x){
double max=x[0];
int n=x.size();
for(int i=0;i<n;i++)
if(x[i]>max) max=x[i];
return max;
}
//雅可比迭代公式
void Jacobi(vector<vector<double> > A,vector<double> B,int n){
vector<double> X(n,0);
vector<double> Y(n,0);
vector<double> D(n,0);
int k=0; //记录循环次数
do{
X=Y;
for(int i=0;i<n;i++){
double sum=0;
for(int j=0;j<n;j++){
if(i!=j) sum += A[i][j]*X[j];
}
Y[i]=(B[i]-sum)/A[i][i];
cout<<left<<setw(8)<<Y[i]<<" ";
}
cout<<endl;
k++;
for(int a=0;a<n;a++){
D[a]=X[a]-Y[a];
}
}while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);
return ;
}
//高斯赛让德迭代公式
void GaussSeidel(vector<vector<double> > A,vector<double> B,int n){
vector<double> X(n,0);
vector<double> Y(n,0);
vector<double> D(n,0);
int k=0; //记录循环次数
do{
Y=X;
for(int i=0;i<n;i++){
double sum=0;
for(int j=0;j<n;j++){
if(i!=j) sum += A[i][j]*X[j];
}
X[i]=(B[i]-sum)/A[i][i];
cout<<left<<setw(8)<<X[i]<<" ";
}
cout<<endl;
k++;
for(int a=0;a<n;a++){
D[a]=X[a]-Y[a];
}
}while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);
return ;
}
对比
Jacobi
Gauss-Seidel
对应程序实现中,只需用新生成的X值,直接覆写掉原来的X值即可,但是最后为了查看是否达到迭代精度,需要暂存一趟迭代的结果。
程序引用:
【数值分析】迭代法解方程:牛顿迭代法、Jacobi迭代法
http://blog.csdn.net/xiaowei_cqu/article/details/8585703
很好的讲义地址
华东师范大学 矩阵计算 讲义
http://math.ecnu.edu.cn/~jypan/Teaching/MatrixComp/index.html
另一个程序引用:
Jacobi迭代法的思想及C语言编程
http://wenku.baidu.com/link?url=hF1RZMfra4htZ33k6HY8rHXkEQ2hAZGREnOBUSB12zfChPPTJomCgd3pEcHhNNO69s4ahW3wUy6aI6ctB_6HXsLtNAMOF6bHAP6u-IvZVMW
Gauss-seidel迭代法的思想及C语言编程
http://wenku.baidu.com/link?url=QYNW-VS5YrLnbjaQH-LIwky7FIOv8GbcQpDq5NFNFQUATIgTDwW2ANSuKYQZ5RGtdSCWtm1SIqLGsAXc8zEKDSd-Bsca5UxcNiaMJz3gzGe