中雅可比迭代法程序_十四讲--第三章第6题--jacobi迭代法--代码解析

1c1e3c943d3edb5e0db376fa6499b70f.png

有了对牛顿迭代法的掌握,理解起jacobi迭代法就很容易了。

Nerd:十四讲--第三章第6题--牛顿迭代法--代码解析​zhuanlan.zhihu.com
211a6f160ee9a2957a199614f02431ff.png

同样参考大佬博客

【数值分析】迭代法解方程:牛顿迭代法、Jacobi迭代法​blog.csdn.net

jacobi迭代就是将牛顿迭代思想拓展到了矩阵运算

9819d4898485221d8686b99c9301dfa1.png

a993abe08266aca1f2a1da75dbb189b5.png

ee4f3df6d6348999d724080b5cf8d8e7.png

代码实现:

#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]就是最后的方程

040ecf5f98923f714ba280ca49a90b97.png

main()里面是程序使用者输入矩阵的操作。

done!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值