一、实验内容:
考虑方程组 Hx=b 的求解,其中系数矩阵 H 为 Hilbert 矩阵,
H
(
h
,
nnji
)
,
h
,
ji
1
j
,
1
i
i
,
j
,2,1
,
n
这是一个著名的病态问题。通过首先给定解(例如取为各个分量均为 1)再计算出右端 b 的办法给出确定
的问题。
实验要求:
(1)选择问题的维数为 6,分别用 Jacobi 迭代法、GS 迭代法和 SOR 迭代法求解方程组,其各自的结
果如何?将计算结果与问题的解比较,结论如何?
(2)逐步增大问题的维数,仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?
(3)讨论病态问题求解的算法。
二、程序设计的基本思想、原理和算法描述:
1、 算法
Jacobi 迭代法
若 A 为稀疏矩阵,只需遍历非零元素
GS 迭代法
若 A 为稀疏矩阵,只需遍历非零元素
每步迭代计算量相当于一次矩阵与向量的乘法;不需要保留上一步的迭代解,与 Jacobi 迭代法计算量一
样。
SOR 迭代法(稠密矩阵)
2、 函数组成
double max(double array[100]) 求数组中的最大值函数
3、 输入/输出设计
对于方程组 Hx=b 的求解,系数矩阵 H 为 Hilbert 矩阵,矩阵中的数由下列函数生成。
H
(
h
,
nnji
)
,
h
,
ji
1
j
,
1
i
i
,
j
,2,1
,
n
X*取一个特解[1,1,1,……,1]
b 数组由矩阵的每行元素相加得来。
4、符号名说明
double c[100] 用来存储第 k+1 次和第 k 次迭代结果的差值的绝对值
double x[100] 第 k+1 次迭代结果,储存解数组
double x0[100] 初始向量
double r
第 k+1 次和第 k 次迭代结果的差值的绝对值的最大值
double sum
矩阵方程变换后右侧值的和
迭代次数
int k
double a[100][100] 存储 Hilbert 矩阵
double b[100]
存储 b 向量
三、源程序及注释:
Jacobi 迭代法
#include
#include
#include
#include
using namespace std;
int n;
double max(double array[100])//求最大值函数
{
}
double a=array[0];
int i;
for(i=1; i
{
double s=0;
int i,k,j;//k 为迭代次数
double a[100][100];
double b[100]= {0.0};
cout<<"请输入维数:"<>n;
cout<<"输出 a 数组:"<>s;
for(k=1;; k++)
{
for(i=0; i
}
r=max(c);
if(r
#include
#include
#include
using namespace std;
int n;
double max(double array[100])//求最大值函数
{
double a=array[0];
int i;
for(i=1;i
cin>>n;
cout<<"输出 a 数组:"<>s;
for(k=1;;k++)
{
for(i=0;i
}
}
SOR 迭代法
#include
#include
#include
#include
using namespace std;
int n;
double max(double array[100])
{
double a=array[0];
int i;
for(i=1;i>n;
cout<<"输出 a 数组:"<