病态方程组检验-基于matlab
一. 病态方程组是什么
假设我们有一个线性方程组要求解, 记为
Ax=b
虽然理论上可能是有解的, 甚至可能是唯一解
但是在误差分析的时候, 我们给b一些小扰动, 会导致x的剧烈变化, 以至于准确解和近似解之间相差太多
而通过数值分析的学习, 我们知道现实中求解基本都是近似解, 因此病态方程组是很难获得一个误差不大的准确解的
同时还取决于方程的数量, 也就是矩阵的大小, 线性空间的维数.
二. matlab实际展示
一个典型的病态矩阵例子是Hilbert矩阵, 一般定义如下:
Hn=1121⋮n12131⋮n+11……⋱…n1n+11⋮2n−11
实验思路:
令x=[1,1,…,1]T为n维向量令b=Hn∗x由于计算机的存储误差,反过来计算x时只能得到x的近似解x′x′=b/Hn比较x和x′的误差
1 2 3 4 5 6 7 8 9 10 11 12 13
|
n = 3;
H = hilb(n);
x = transpose(linspace(1,1,n));
b = H*x;
v = H\b;
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>10之后开始变得极其不准, 误差超过2倍, 但是和老师上课讲的还是有点区别, 似乎没有在n>5时就开始病态
结果可能依赖于输入的准确解x