您的位置:首页 > 其它

#公式与实现# Jacobi迭代 Gauss-Seidel迭代

2015-12-08 14:55 453 查看




程序实现:

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迭代法

/article/1353796.html

很好的讲义地址

华东师范大学 矩阵计算 讲义

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: