线性方程组的迭代法

本文探讨了线性方程组求解的两种迭代法——Jacobi迭代法和Gauss-Seidel迭代法。Jacobi方法通过迭代公式进行计算,初始值通常设为0。Gauss-Seidel法在每一步中使用最新结果,可能更节省时间和空间,但收敛速度和稳定性各有不同。控制迭代次数能有效防止资源浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代法的突出优点是算法简单,因而写成程序比较容易,然而迭代法又要求系数矩阵在迭代过程中保持收敛(要求对角占优),否则发散的迭代没有实用价值。

1>Jacobi迭代法

对于线性方程组∑aij*xj=bi,转化为xi=(bi-∑aij*xj)/aij,选取迭代初值x1=x2=x3=0,将其代入迭代,不断用第k步的值进行迭代出k+1步,直至逼近所要的结果。

do{
	cout<<endl;		
	error1=0;//清零
	for(i=0;i<row;i++)
	{
		temp=0;
		for(j=0;j<line;j++)
			if(j!=i)temp=temp+matrix[i][j]*x[j];
		x1[i]=(result[i]-temp)/matrix[i][i];
		cout<<x1[i]<<"\t";
		if(ABS(x1[i]-x[i])>error1)error1=ABS(x1[i]-x[i]);//寻找最大误差
	}
	for(j=0;j<line;j++)x[j]=x1[j];
}while(error1>error);//精度控制


2>Gauss-Seidel迭代法

类似于上述Jacobi的迭代方法,只不过这里将每次运算出的最新结果立马运用于接下来的运算当中,而不等到下一轮才开始。

do{
	cout<<endl;		
	error1=0;//误差清零
	for(i=0;i<row;i++)
	{
		temp=0;
		for(j=0;j<line;j++)
			if(j!=i)temp=temp+matrix[i][j]*x[j];
		temp1=x[i];
		x[i]=(result[i]-temp)/matrix[i][i];
		cout<<x[i]<<"\t";
		if(ABS(x[i]-temp1)>error1)error1=ABS(x[i]-temp1);//寻找当前最大误差
	}
}while(error1>error);

说明:一般说来,后者的迭代方法省空间也节省时间自然比前者好,但有时候,后者的迭代比前者迭代收敛慢甚至可能有后者不收敛而前者收敛的情况出现。此外,为了及时制止发散情况的出现,可以通过限制运算次数的方式减少资源的浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值