有了对牛顿迭代法的掌握,理解起jacobi迭代法就很容易了。
Nerd:十四讲--第三章第6题--牛顿迭代法--代码解析zhuanlan.zhihu.com同样参考大佬博客
【数值分析】迭代法解方程:牛顿迭代法、Jacobi迭代法blog.csdn.netjacobi迭代就是将牛顿迭代思想拓展到了矩阵运算
代码实现:
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
using namespace std;
//函数求数组中的最大值
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 tem=0;
for(int j=0;j<n;j++){
if(i!=j) tem += A[i][j]*X[j];
}
Y[i]=(B[i]-tem)/A[i][i];
cout<<left<<setw(8)<<Y[i]<<" ";
}
cout<<endl;
k++;
if(k>100){
cout<<"迭代失败!(可能是函数不收敛)"<<endl;
return ;
}
for(int a=0;a<n;a++){
D[a]=X[a]-Y[a];
}
}while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);
return ;
}
int main(){
int n;
cout<<"请输入方程组未知数的个数n:";
cin>>n;
cout<<endl;
vector<vector<double> >A(n,vector<double>(n,0));
vector<double>B(n,0);
cout<<"请输入方程组的系数矩阵:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>A[i][j];
}
}
cout<<endl;
cout<<"请输入方程组的值向量:"<<endl;
for(int k=0;k<n;k++){
cin>>B[k];
}
cout<<endl;
cout<<"您输入的方程组为:"<<endl;
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
cout<<A[a][b]<<" ";
}
cout<<" "<<B[a]<<endl;
}
cout<<endl;
cout<<"由雅可比迭代公式求的方程组的解为:"<<endl;
Jacobi(A,B,n);
return 0;
}
总感觉代码的颜色很像妹子的风格...
jacobi()就是进行迭代计算的函数,tem += A[i][j]*X[j]就是用来计算公式里这一堆
并赋值给tem,B[i]就是b,A[i][j]就是a,所以Y[i]=(B[i]-tem)/A[i][i]就是最后的方程
main()里面是程序使用者输入矩阵的操作。
done!