病态方程组检验-基于matlab

一. 病态方程组是什么

假设我们有一个线性方程组要求解, 记为

Ax=bAx = b\\

虽然理论上可能是有解的, 甚至可能是唯一解

但是在误差分析的时候, 我们给bb一些小扰动, 会导致xx的剧烈变化, 以至于准确解和近似解之间相差太多

而通过数值分析的学习, 我们知道现实中求解基本都是近似解, 因此病态方程组是很难获得一个误差不大的准确解的

同时还取决于方程的数量, 也就是矩阵的大小, 线性空间的维数.

二. matlab实际展示

一个典型的病态矩阵例子是HilbertHilbert矩阵, 一般定义如下:

Hn=[11121n12131n+11n1n+112n1]H_n = \begin{bmatrix} \frac 11 & \frac 12 & \dots & \frac 1n \\ \frac 12 & \frac 13 & \dots & \frac1{n+1}\\ \vdots & \vdots & \ddots & \vdots \\ \frac 1n & \frac1{n+1} & \dots & \frac1{2n-1} \end{bmatrix}

实验思路:

x=[1,1,,1]Tn维向量b=Hnx由于计算机的存储误差,反过来计算x时只能得到x的近似解xx=b/Hn比较xx的误差令 x = [1, 1, \dots , 1]^T 为n维向量\\ 令b = H_n*x\\ 由于计算机的存储误差, 反过来计算x时只能得到x的近似解x'\\ x' = b/H_n\\ 比较x和x'的误差

1
2
3
4
5
6
7
8
9
10
11
12
13
% 以下是一个简单的分析程序
% n 表示 Hilbert矩阵大小
n = 3;
% 获得一个n*n的Hilbert矩阵
H = hilb(n);
% x为精确解
x = transpose(linspace(1,1,n));
% 计算b
b = H*x;
% v为x的近似解
v = H\b;
% 评估指标, 观察变化倍率, 对于x的每一维x_i=1来说, v_i相对x_i放大了v_i倍, 我们求出最大的放大倍数
maxd = max(abs(v))

实验结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
n =

3


ans =

1.0000


n =

5


ans =

1.0000


n =

7


ans =

1.0000


n =

10


ans =

1.0003


n =

15

ans =

7.5244


n =

20


ans =

27.3759


n =

25


ans =

36.0329

基本上在n>10n>10之后开始变得极其不准, 误差超过22倍, 但是和老师上课讲的还是有点区别, 似乎没有在n>5n>5时就开始病态

结果可能依赖于输入的准确解xx