我正在尝试Ax = b
在 MATLAB 中求解系统,其中A
是一个 30x30 三角矩阵,(非零)值范围从1e-14
到0.7
,并且b
是一个 30 元素列向量,值范围从1e-3
到1e3
。当我输入时x = A\b
,我得到一个答案并且没有警告消息,但答案是不合理的(看起来只是向量底部的随机数)。我认为这是由于数字错误。
此页面上的消息 5 建议分解/缩放矩阵以避免数值错误,但我无法弄清楚如何计算缩放矩阵。
所以问题是:这确实是数值不稳定性的一个例子,如果是这样,我怎样才能重新调整我的矩阵 A,或者改变 MATLAB 执行计算的方式,以避免它?
这是产生问题的矩阵和向量:
A =
Columns 1 through 15
0.69 0.4278 0.19893 0.082223 0.031861 0.011852 0.0042866 0.0015187 0.00052965 0.00018243 6.221e-05 2.1038e-05 7.0653e-06 2.3587e-06 7.8344e-07
0 0.4761 0.44277 0.27452 0.14183 0.065953 0.028624 0.011831 0.0047156 0.0018273 0.00069233 0.00025755 9.4356e-05 3.4126e-05 1.2206e-05
0 0 0.32851 0.40735 0.3157 0.19573 0.10618 0.052668 0.02449 0.010846 0.004623 0.0019108 0.00077007 0.00030383 0.00011773
0 0 0 0.22667 0.35134 0.32675 0.23635 0.14653 0.081766 0.042246 0.02058 0.0095696 0.0042851 0.0018597 0.00078615
0 0 0 0 0.1564 0.29091 0.31564 0.26093 0.182 0.11284 0.064129 0.03408 0.017168 0.0082788 0.0038496
0 0 0 0 0 0.10792 0.23418 0.29039 0.27006 0.2093 0.14274 0.088499 0.05095 0.02764 0.014281
0 0 0 0 0 0 0.074464 0.18467 0.25761 0.2662 0.22694 0.16884 0.1134 0.070311 0.040868
0 0 0 0 0 0 0 0.05138 0.14335 0.22219 0.25256 0.23488 0.18931 0.13694 0.090965
0 0 0 0 0 0 0 0 0.035452 0.1099 0.18738 0.23235 0.2341 0.2032 0.15748
0 0 0 0 0 0 0 0 0 0.024462 0.083415 0.15515 0.20842 0.22614 0.21031
0 0 0 0 0 0 0 0 0 0 0.016879 0.062789 0.12652 0.18303 0.21277
0 0 0 0 0 0 0 0 0 0 0 0.011646 0.046935 0.10185 0.15786
0 0 0 0 0 0 0 0 0 0 0 0 0.008036 0.034876 0.081087
0 0 0 0 0 0 0 0 0 0 0 0 0 0.0055448 0.025783
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0038259
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 16 through 30
2.5906e-07 8.5327e-08 2.8007e-08 9.1646e-09 2.9906e-09 9.7342e-10 3.1613e-10 1.0246e-10 3.3142e-11 1.0702e-11 3.4504e-12 1.1108e-12 3.5709e-13 1.1465e-13 3.6767e-14
4.3246e-06 1.5194e-06 5.2988e-07 1.8359e-07 6.3236e-08 2.1667e-08 7.3883e-09 2.5085e-09 8.4833e-10 2.8585e-10 9.5998e-11 3.214e-11 1.073e-11 3.5726e-12 1.1866e-12
4.492e-05 1.6909e-05 6.2902e-06 2.3156e-06 8.445e-07 3.0543e-07 1.0963e-07 3.9084e-08 1.3847e-08 4.8779e-09 1.7094e-09 5.9615e-10 2.0698e-10 7.1568e-11 2.4651e-11
0.00032494 0.00013173 5.2503e-05 2.0616e-05 7.9887e-06 3.0592e-06 1.1591e-06 4.3497e-07 1.6181e-07 5.9715e-08 2.1877e-08 7.9615e-09 2.8794e-09 1.0354e-09 3.7037e-10
0.0017358 0.00076232 0.00032721 0.00013766 5.69e-05 2.3151e-05 9.2878e-06 3.679e-06 1.4406e-06 5.5824e-07 2.1426e-07 8.1515e-08 3.0763e-08 1.1523e-08 4.2867e-09
0.0070833 0.0033935 0.001578 0.00071495 0.00031662 0.00013741 5.8573e-05 2.4566e-05 1.0154e-05 4.1418e-06 1.6691e-06 6.6527e-07 2.6248e-07 1.0259e-07 3.9755e-08
0.022523 0.01187 0.0060211 0.0029554 0.0014095 0.00065541 0.00029799 0.00013279 5.8116e-05 2.5022e-05 1.0615e-05 4.4423e-06 1.8361e-06 7.5031e-07 3.0339e-07
0.056398 0.033024 0.018428 0.0098671 0.005098 0.0025529 0.0012436 0.00059114 0.00027488 0.00012531 5.6113e-05 2.4719e-05 1.0728e-05 4.5926e-06 1.9414e-06
0.11158 0.073506 0.045573 0.026843 0.01513 0.0082078 0.0043059 0.0021929 0.0010877 0.00052686 0.00024979 0.00011615 5.3064e-05 2.3852e-05 1.0563e-05
0.17385 0.13089 0.091294 0.059747 0.037043 0.021923 0.012459 0.0068335 0.0036315 0.0018763 0.00094518 0.00046536 0.00022441 0.00010618 4.9374e-05
0.21107 0.18539 0.14778 0.10881 0.074955 0.048796 0.030253 0.017976 0.010288 0.0056949 0.0030601 0.0016008 0.00081734 0.00040822 0.00019981
0.19575 0.20632 0.19188 0.16145 0.12513 0.090508 0.061727 0.04001 0.024806 0.014788 0.0085139 0.0047507 0.0025773 0.0013629 0.00070418
0.13406 0.17663 0.19712 0.1935 0.17139 0.13947 0.10569 0.075354 0.050967 0.032916 0.020408 0.012201 0.0070603 0.003967 0.0021702
0.063943 0.11233 0.1567 0.18459 0.19074 0.17739 0.15122 0.1198 0.089133 0.062798 0.042179 0.027157 0.016837 0.010091 0.0058655
0.018977 0.050003 0.093006 0.13695 0.16982 0.18425 0.17952 0.15999 0.13226 0.1025 0.075107 0.052387 0.034978 0.022461 0.013926
0.0026399 0.013912 0.038815 0.076207 0.11812 0.15379 0.17481 0.17806 0.16559 0.14259 0.11493 0.087452 0.063257 0.043745 0.029059
0 0.0018215 0.010164 0.029933 0.061862 0.10068 0.13733 0.16319 0.17345 0.16803 0.15048 0.12595 0.099387 0.074457 0.053266
0 0 0.0012569 0.0074028 0.022949 0.049799 0.084907 0.12108 0.15014 0.16622 0.16747 0.15575 0.13519 0.11049 0.085626
0 0 0 0.00086723 0.0053768 0.017502 0.039787 0.07092 0.10553 0.13631 0.15695 0.16421 0.15837 0.14237 0.12037
0 0 0 0 0.00059839 0.0038955 0.013284 0.031571 0.058722 0.091019 0.12227 0.1462 0.15862 0.15845 0.14736
0 0 0 0 0 0.00041289 0.0028159 0.010039 0.024896 0.048236 0.077756 0.10847 0.1345 0.15115 0.15618
0 0 0 0 0 0 0.00028489 0.0020313 0.0075564 0.019521 0.039334 0.065845 0.095256 0.12234 0.14222
0 0 0 0 0 0 0 0.00019658 0.0014625 0.0056673 0.015226 0.031861 0.05531 0.082873 0.1101
0 0 0 0 0 0 0 0 0.00013564 0.0010512 0.0042363 0.011819 0.025648 0.046115 0.071478
0 0 0 0 0 0 0 0 0 9.359e-05 0.00075433 0.0031569 0.0091339 0.020528 0.038183
0 0 0 0 0 0 0 0 0 0 6.4577e-05 0.00054051 0.0023458 0.0070296 0.016344
0 0 0 0 0 0 0 0 0 0 0 4.4558e-05 0.00038676 0.0017385 0.0053894
0 0 0 0 0 0 0 0 0 0 0 0 3.0745e-05 0.0002764 0.0012852
0 0 0 0 0 0 0 0 0 0 0 0 0 2.1214e-05 0.00019729
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.4638e-05
b =
3712
246.89
43.304
22.55
14.897
10.066
6.8138
4.6131
3.1232
2.1146
1.4316
0.96927
0.65623
0.44429
0.3008
0.20365
0.13788
0.093351
0.063202
0.04279
0.02897
0.019614
0.013279
0.0089906
0.006087
0.0041211
0.0027902
0.001889
0.0012789
0.00086589
可以在此处找到具有全精度变量的 .mat 文件。
这是我在我的机器上得到的结果(OS X 10.10.5 上的 Matlab R2013a):
>> x=A\b
x =
5087.6
433.99
64.166
27.995
19.494
14.546
10.934
8.2265
6.1834
4.6933
3.2779
3.8272
-3.5375
23.953
-79.278
254.22
-702.1
1713.2
-3658.2
6822.7
-11046
15412
-18349
18393
-15244
10181
-5273.4
1992.3
-489.85
59.155
虽然norm(A*x-b)
返回一个 1e-13 的值,但考虑到我要解决的问题,结果在物理上并不合理(x 中的值应该是单调递减的,并且没有一个应该是负数)。例如,这是一个类似的数据集,它返回具有相同矩阵 A 的正确(看起来)解决方案:
>> c
c =
5142.1
339.52
22.417
1.4802
0.097731
0.0064529
0.00042607
2.8132e-05
1.8575e-06
1.2265e-07
8.0979e-09
5.3469e-10
3.5304e-11
2.331e-12
1.5391e-13
1.0162e-14
6.7099e-16
4.4304e-17
2.9253e-18
1.9315e-19
1.2753e-20
8.4205e-22
5.5598e-23
3.671e-24
2.4239e-25
1.6004e-26
1.0567e-27
6.9771e-29
4.6068e-30
3.0418e-31
>> x = A\c
x =
7029.1
653.25
60.709
5.642
0.52434
0.04873
0.0045287
0.00042087
3.9114e-05
3.635e-06
3.3782e-07
3.1395e-08
2.9177e-09
2.7116e-10
2.52e-11
2.342e-12
2.1765e-13
2.0227e-14
1.8798e-15
1.747e-16
1.6236e-17
1.5089e-18
1.4023e-19
1.3033e-20
1.21e-21
1.1339e-22
9.9766e-24
1.1858e-24
2.3902e-26
2.078e-26