超松弛迭代法解线性方程组讲课稿Word文档格式.docx
《超松弛迭代法解线性方程组讲课稿Word文档格式.docx》由会员分享,可在线阅读,更多相关《超松弛迭代法解线性方程组讲课稿Word文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
![超松弛迭代法解线性方程组讲课稿Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/24/c9ac6420-68bf-4c89-b370-5da22056a9e2/c9ac6420-68bf-4c89-b370-5da22056a9e21.gif)
为非奇异矩阵,且设
,分解
为
(2)
设已知第
次迭代向量
,及第
的分量
,要求计算分量
首先用Gauss—Seidel迭代法定义辅助量
(3)
再把
取为
某个平均值(即加权平均),即
(4)
用式(3)代入式(4)即得到解方程组
的逐次超松弛迭代公式
(5)
为松弛因子,显然,当
时,解式
(1)的SOR方法就是Gauss-Seidel迭代法。
在SOR方法中,迭代一次主要的运算量是计算一次矩阵与向量的乘法。
由式(5)可知,在计算机上应用SOR方法解方程组时只需一组工作单元,以便存放近似解。
二、算法框图
三、算法程序
#defineN3//线性方程组的阶数
#include<
iostream.h>
math.h>
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<
N;
i++)
{
sum=0;
for(j=0;
j<
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;
{
if(fabs(x[i]-x0[i])>
current_e)
current_e=fabs(x[i]-x0[i]);
}//计算当前误差
x0[i]=x[i];
//更新初始向量
}while(current_e>
e&
&
c_M<
M);
//判断是否仍未达到精度要求且未达到最大迭代次数
for(i=0;
cout<
<
x[i]<
endl;
//输出结果
cout<
c_M<
//输出迭代次数
}
四、算法实现
例1.用超松弛迭代法解方程组
解:
将方程组的系数放于a[n][n]中,将等号右端常数放入b[n]中。
运行程序,即可得出结果
例2.用超松弛迭代法解方程组
将方程组的系数放于a[n][n]中,将等号右端常数放入b[n]中。