如何解决线性病态方程组
63(30天)
显示旧的评论
你好,我有一个典型的线性问题来解决
,在那里
一个
是一个三对角,illconditioned矩阵。使用表示系统的解决方案,我计算一个向量
R
,这样
R = kv。* diff (x)
。我有什么我知道的正确的值
R
,我在接下来的几次执行此计算涉及我获得的线性系统的解决方案,并比较此值
R
我有。
我用两种方式来解决病态:
- 我使用了典型的L-U分解,然而我仍然得到一个警告,结果正如你所看到的并不准确。
- 我执行相同的过程,但是,我的条件U通过添加的单位矩阵似乎解决了调节问题。此外,我注意到结果R2的常数吗R2 (1)从已知的答案R被纠正,所以,这种方法似乎给我正确的答案。
清晰;clc
= (663100000,663100000,0,0,0,0,0,0,0,0,0,0,-663100000,1407100000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1865000000.00000,-1121000000.00000,0,0,0,0,0,0,0,0,0,0,-1121000000.00000,3086000000.00000,-1965000000.00000,0,0,0,0,0,0,0,0,0,0,-1965000000.00000,51965000000.0000,-50000000000.0000,0,0,0,0,0,0,0,0,0,0,-50000000000.0000,50022150000.0000,-22150000,0,0,0,0,0,0,0,0,0,0,-22150000,111860000,-89710000,0,0,0,0,0,0,0,0,0,0,-89710000,89710000);
b = [0, 97346.0079330557; 97020.9494874157; 97246.0491601032; 97462.7637751785; 97128.3959227217; 97326.7056988805; 0, 0, 0, 0; -460875.388953404);
R = [0, 97346.0079330557; 194366.957420471; 291613.006580575; 389075.770355753; 486204.166278475; 583530.871977355; 583530.871977355; 583530.871977355; 583530.871977355; 583530.871977355);
kv =诊断接头(1);
% L U分解
陆[L U] =(一个);
x1 = U \ (L \ b);
R1 = kv。* diff (x1);
% L U分解预处理
x2 = (U +眼(长度(A))) \ (L \ b);
R2 = kv。*差异(x2);
%比较结果。R是正确的解决方案的问题
[R R1 R2-R2 (1)]
在此基础上我有两个问题:
- 我不能解释为什么我第二种方法的工作原理,具体为什么我要执行计算R2-R2 (1)为了得到正确的结果。这是一个巧合对于这种情况,还是我可以安全地概括这对于其他类似的坏脾气的矩阵呢一个我,这样我就可以正确解决类似的问题?
- 如果上面不是一个可靠的解决方案,你能建议的方法来处理这个问题?(我看着Tikhonov regularisationregtools但是我无法工作,因为它使返回的函数南)。
提前谢谢你的帮助。
接受的答案
马特·J
2021年11月7日
编辑:马特·J
2021年11月8日
我不认为方程需要正规化。唯一向量的零空间的(12日1),但这种零向量R是不敏感因为kv。* (diff (x + c *(12日1))= kv。* diff (x)。
你得到的差异在版本R1似乎因为你的预期值R不正确或其他有一些错在你
A、b
数据,可能最后一行。我怀疑这是因为我从lsqlin得到下面的结果。我在这里解决最小二乘解的A * x =受约束R = kv。* diff (x)。正如你所看到的,最后方程在* x = b是不能很好地解决了相比其他方程。
= (663100000,663100000,0,0,0,0,0,0,0,0,0,0,-663100000,1407100000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1488000000.00000,-744000000,0,0,0,0,0,0,0,0,0,0,-744000000,1865000000.00000,-1121000000.00000,0,0,0,0,0,0,0,0,0,0,-1121000000.00000,3086000000.00000,-1965000000.00000,0,0,0,0,0,0,0,0,0,0,-1965000000.00000,51965000000.0000,-50000000000.0000,0,0,0,0,0,0,0,0,0,0,-50000000000.0000,50022150000.0000,-22150000,0,0,0,0,0,0,0,0,0,0,-22150000,111860000,-89710000,0,0,0,0,0,0,0,0,0,0,-89710000,89710000);
b = [0, 97346.0079330557; 97020.9494874157; 97246.0491601032; 97462.7637751785; 97128.3959227217; 97326.7056988805; 0, 0, 0, 0; -460875.388953404);
R = [0, 97346.0079330557; 194366.957420471; 291613.006580575; 389075.770355753; 486204.166278475; 583530.871977355; 583530.871977355; 583530.871977355; 583530.871977355; 583530.871977355);
s = 1 e6;
= A / s;b = b / s;R = R / s;
kv =诊断接头(1);
[m, n] =大小(一个);
E = kv (:)。* diff(眼(n));
选择= optimoptions (“lsqlin”,“OptimalityTolerance”1 e-20“ConstraintTolerance”1 e-20);
[x, fval] = lsqlin (A, b, [] [], E, R,[],[],[],选择);fval
equationError = *取向;
equationError([1:4,十12))