超松弛迭代法解线性方程组讲课稿.docx
《超松弛迭代法解线性方程组讲课稿.docx》由会员分享,可在线阅读,更多相关《超松弛迭代法解线性方程组讲课稿.docx(6页珍藏版)》请在冰豆网上搜索。
![超松弛迭代法解线性方程组讲课稿.docx](https://file1.bdocx.com/fileroot1/2022-11/24/c9ac6420-68bf-4c89-b370-5da22056a9e2/c9ac6420-68bf-4c89-b370-5da22056a9e21.gif)
超松弛迭代法解线性方程组讲课稿
超松弛迭代法解线性方程组
2013-2014
(1)专业课程实践论文
题目:
超松弛迭代法解线性方程组
一、算法理论
逐次超松弛迭代法是Gauss-Seidel方法的一种加速方法,世界大型稀疏矩阵方程组的有效方法之一,它具有计算公式简单,程序设计容易,占用计算机内存较少等优点,但需要选择好的加速因子(即最佳松弛因子)
设有方程组
(1)
其中
为非奇异矩阵,且设
,分解
为
(2)
设已知第
次迭代向量
,及第
次迭代向量
的分量
,要求计算分量
首先用Gauss—Seidel迭代法定义辅助量
(3)
再把
取为
某个平均值(即加权平均),即
(4)
用式(3)代入式(4)即得到解方程组
的逐次超松弛迭代公式
(5)
其中
为松弛因子,显然,当
时,解式
(1)的SOR方法就是Gauss-Seidel迭代法。
在SOR方法中,迭代一次主要的运算量是计算一次矩阵与向量的乘法。
由式(5)可知,在计算机上应用SOR方法解方程组时只需一组工作单元,以便存放近似解。
二、算法框图
三、算法程序
#defineN3//线性方程组的阶数
#include
#include
voidmain()
{
doublea[N][N]={5,2,1,2,8,-3,1,-3,-6},//系数矩阵
b[N]={8,21,1};//右端常数向量
doublex0[N]={1,1,1},x[N];//迭代初始向量和迭代向量
doublee=1e-5;//精度要求
intM=5000;//最大迭代次数
inti,j,c_M=0;
doublesum,current_e;
do{
current_e=0;
for(i=0;i{
sum=0;
for(j=0;j{
if(j!
=i)
{
sum=sum+a[i][j]*x0[j];
}
}
x[i]=(b[i]-sum)/a[i][i];
}//更新迭代向量
c_M++;//迭代次数加1
for(i=0;i{
if(fabs(x[i]-x0[i])>current_e)
current_e=fabs(x[i]-x0[i]);
}//计算当前误差
for(i=0;ix0[i]=x[i];//更新初始向量
}while(current_e>e&&c_Mfor(i=0;icout<cout<}
四、算法实现
例1.用超松弛迭代法解方程组
解:
将方程组的系数放于a[n][n]中,将等号右端常数放入b[n]中。
运行程序,即可得出结果
例2.用超松弛迭代法解方程组
解:
将方程组的系数放于a[n][n]中,将等号右端常数放入b[n]中。
运行程序,即可得出结果