为什么病态线性系统可以精确解决?


13

根据此处答案,较大的条件数(用于线性系统求解)会减少浮点解中保证的正确数字位数。伪光谱方法中的高阶微分矩阵通常条件非常恶劣。为什么它们仍然是非常准确的方法?

我了解病态矩阵带来的低精度只是一个保证值,但仍然令我感到奇怪的是,为什么实际上可以通过直接方法准确地解决病态矩阵-例如,LCOL第11页的表3.1 的列Wang等人,使用伪光谱积分矩阵的条件良好的聚集方法,SIAM J. Sci。计算36(3)


2
我的直觉是,Ax = b系统的可解性/准确性与强制向量b绑定,而不仅与矩阵A绑定。也许如果b不“探查”或“激发” A的病态模式,则可以得到精确解仍然可能。作为一个限制示例,A可以精确地是奇数(无限条件数),但是Ax = b仍然可以拥有一个解决方案,如果强制数据b位于A的范围内,则可以准确地计算出该解决方案。我承认这很简单-波浪状,这就是为什么我只评论而不是回答。
rchilton1980 '17

@ rchilton1980“但是Ax = b可能仍然拥有解决方案”,但是该解决方案并不是唯一的。我要参考的示例具有独特的解决方案。
佐尔坦Csáti

这是一个合理的对策-可能是选择无限条件数(特征值恰好为零)的人工产物。但是我认为您可以用机器epsilon代替零特征值,我的观点仍然成立。(也就是说,系统具有非常大的条件数,系统是非奇异的,只有一个独特的解决方案,如果b在那个微小的特征对上没有分量,我们就可以非常精确地计算出来)。
rchilton1980 '17

1
更具体地说,我的思想实验在这里类似于A = diag([1 1 1 1 1 eps]),b = [b1 b2 b3 b4 b5 0]。它是人为的,但我认为足以证明最初的主张是正确的:“有时病态的A可以针对b的特定选择准确地解决”
rchilton1980 '17

1
只是举个例子,从Moler的博客blogs.mathworks.com/cleve/2015/02/16/...
percusse

Answers:


7

在我的最初答案之后添加:

在我看来,参考文献的作者正在表中给出条件编号(显然是2范式条件编号,但可能是无穷范数条件编号),同时给出最大绝对误差而不是范数相对误差或最大元素相对误差(这些都是不同的度量。)请注意,最大逐元素相对误差与无穷范数相对误差不是同一件事。此外,表中的误差是相对于原始微分方程边界值问题的精确解,而不是离散的线性方程组。因此,本文中提供的信息确实不适用于基于条件编号的错误界限。

但是,在我的计算复制中,我确实看到了这样的情况:相对无穷范数误差(或两范数相对误差)大大小于无穷范数条件数(分别为2范数条件数)所设置的边界。有时候你只是幸运。

我使用了DMSUITE MATLAB软件包,并使用带有Chebyshev多项式的伪光谱方法解决了本文中的示例问题。我的条件编号和最大绝对错误与论文中报道的相似。

我还看到基于条件编号的规范相对误差要好于人们预期的误差。例如,在与示例问题,使用Ñ = 1024,我得到ϵ=0.01N=1024

cond(A,2)= 7.9e + 8

cond(A,inf)= 7.8e + 8

范数(u-uexact,2)/范数(uexact,2)= 3.1e-12

规范(u-uexact,inf)/规范(uexact,inf)= 2.7e-12

看来解决方案适用于大约11到12位数字,而条件编号约为1e8。

但是,带有元素错误的情况更加有趣。

最大值(abs(u-uexact))= 2.7e-12

看起来还是不错的。

max(abs((u-uexact)./ uexact)= 6.1e + 9

哇-解决方案的至少一个组成部分存在很大的相对误差。

发生了什么?该方程的精确解具有很小的分量(例如1.9e-22),而近似解的谷底值则大得多(9e-14)。这被规范相对误差度量(无论是2范数还是无穷范)所隐藏,并且仅当您查看元素相对误差并取最大值时才可见。

我下面的原始答案解释了为什么在解决方案中可以获得小于条件编号给出的界限的标准相对误差。


正如您在问题中所指出的,非奇异矩阵的条件数为摄动方程组提供了最坏情况的相对误差界。也就是说,如果我们解决X + Δ X = b + Δ b准确和解决X = b完全相同,则κ(A)A(x+Δx)=b+ΔbAx=b

Δxxκ(A)Δbb

可以针对各种规范来计算条件编号,但是经常使用两个标准的条件编号,这就是您所引用的论文中使用的条件编号。

时,会发生最坏的情况下错误是的左奇异向量对应的最小奇异值。当是的左奇异矢量,对应于的最大奇异值时,发生最佳情况。当是随机的,那么你在的预测看在所有的左奇异向量的和相应的奇异值。取决于的频谱,事情可能会变得非常糟糕或非常好。 Δ b Δ b Δ b ΔbAAΔbAAΔbΔbAA

考虑两个矩阵,它们的2范数条件数均为。第一矩阵具有奇异值,,,。所述第二矩阵具有奇异值,,,,。 1.0 × 10 10 1 1 × 10 101 × 10 10 1 1 1 1 × 10 10A1.0×101011×10101×10101111×1010

在第一种情况下,随机扰动不太可能朝着第一个左奇异矢量的方向,而更可能接近奇异值的奇异矢量之一。因此,解决方案中的相对变化可能非常大。在第二种情况下,几乎所有扰动都将在方向上接近具有奇异值的奇异矢量,并且解中的相对变化将很小。 11×10101

PS(稍后我从瑜伽课回来后添加...)

用于溶液的式是AΔx=Δb

Δx=VΣ1UTΔb=i=1nUiTΔbσiVi

根据毕达哥拉斯定理,

Δx22=i=1n(UiTΔbσi)2

如果我们保留,则当时此和最大,而当时此和最小。Δ b = û ÑΔb2=1Δb=UnΔb=U1

在此处考虑的情况下,是随机舍入误差的结果,因此值都应具有大致相同的大小。值较小的项将对错误起很大的作用,而值较大的项将没有太大的作用。根据频谱,这很容易比最坏情况下的范围小。 ü Ť Δ b σ σ ΔbUiTΔbσiσi


该论点是否表示示例中的矩阵可能(即使不太可能)达到的最坏情况边界?AFAIU,根据我的回答以及基于的文档,这是不可能的。κ(A)?getrs
基里尔

@BrianBorchers能否请您详细阐述时候为什么“会发生最坏的情况下错误是左奇异向量对应的最小奇异值的。最好的情况发生时是左奇异向量对应的最大奇异值。” 持有?在下面的示例中,这是合乎逻辑的,但是我需要一些公式。让的SVD是。在第一种情况下,。如何进行?Δ b = û Σ V Ť= Δ b σ 1 v Ť 1 + Σ Ñ = 2 ü σ v Ť ΔbAAΔbAAAA=UΣVTA=Δbσ1v1T+i=2NuiσiviT
佐尔坦Csáti

我没有讨论过矩阵中的舍入误差,但是总体效果是相似的-除非您对舍入误差感到非常不走运,否则您通常会比悲观的最坏情况更好。A
Brian Borchers

(-1)关于输出中组件方面的相对误差的讨论是严重的误导。
基里尔

1

tl; dr他们报告条件号,不一定是矩阵的正确条件号,因为存在差异。

这特定于矩阵和右侧向量。如果您查看的文档*getrs,它会指出前向错误界限为 这里并非通常的条件编号,而是 (在规范内,这是按组件分配的绝对值。)例如,参见Higham的线性系统和LAPACK迭代优化,或Higham的数值算法准确性和稳定性(7.2)。

xx0xcond(A,x)ucond(A)u.
cond(A,x)κ(A)
cond(A,x)=|A1||A||x|x,cond(A)=|A1||A|.

在您的示例中,我为的类似问题采用了伪谱微分算子,实际上之间有很大的差异 和,我计算了和,这足以解释这种情况发生在所有右侧的观察,因为数量级大致匹配如表3.1所示(3-4阶更好的错误)。当我仅对随机病态矩阵尝试相同操作时,这将不起作用,因此它必须是的属性。n=128|A1||A|κ(A)7×1032.6×107A

我从Higham(7.17,p.124)摘下的两个条件编号不匹配的显式示例是 我发现的另一个示例只是带有随机的纯Vandermonde矩阵。我经历了一些其他条件不佳的矩阵,也产生了这种类型的结果,例如和。

(2111ϵϵ1ϵϵ),(2+2ϵϵϵ).
[1:10]bMatrixDepot.jltriwmoler

从本质上讲,这是怎么回事,就是当你分析解决相对于扰动线性系统的稳定性,你首先要指定哪些你正在考虑扰动。使用LAPACK求解线性系统时,此误差界线考虑分量扰动,但不考虑扰动。因此,这不同于通常的,它考虑了和规范扰动。Abκ(A)=A1AAb

考虑(作为一个反例)如果进行区分也会发生什么。我们知道,使用具有双精度的迭代细化(请参见上面的链接,对于具有那些矩阵,我们可以获得的最佳可能正向相对误差。因此,如果我们认为不能以比更好的精度解决线性系统的想法,那么精炼解决方案将如何工作?O(u)κ(A)1/uκ(A)u

PS它很重要的是?getrs说,计算的解决方案是真正的解决方案(A + E)x = b有干扰的,但在任何扰动。如果在中允许摄动,情况将有所不同。EAbb

编辑为了更直接地显示此代码的工作原理,这不是a幸或运气问题,而是两个条件数对于某些特定矩阵(

cond(A,x)cond(A)κ(A).
function main2(m=128)
    A = matrixdepot("chebspec", m)^2
    A[1,:] = A[end,:] = 0
    A[1,1] = A[end,end] = 1
    best, worst = Inf, -Inf
    for k=1:2^5
        b = randn(m)
        x = A \ b
        x_exact = Float64.(big.(A) \ big.(b))
        err = norm(x - x_exact, Inf) / norm(x_exact, Inf)
        best, worst = min(best, err), max(worst, err)
    end
    @printf "Best relative error:       %.3e\n" best
    @printf "Worst relative error:      %.3e\n" worst
    @printf "Predicted error κ(A)*ε:    %.3e\n" cond(A, Inf)*eps()
    @printf "Predicted error cond(A)*ε: %.3e\n" norm(abs.(inv(A))*abs.(A), Inf)*eps()
end

julia> main2()
Best relative error:       2.156e-14
Worst relative error:      2.414e-12
Predicted error κ(A)*ε:    8.780e-09
Predicted error cond(A)*ε: 2.482e-12

编辑2这是同一现象的另一个示例,其中不同的条件编号出乎意料地相差很多。这次, 这里是上的10×10 Vandermonde矩阵,并且当随机选择时,明显小于,并且最坏的情况由给出代表。

cond(A,x)cond(A)κ(A).
A1:10xcond(A,x)κ(A)xxi=iaa
function main4(m=10)
    A = matrixdepot("vand", m)
    lu = lufact(A)
    lu_big = lufact(big.(A))
    AA = abs.(inv(A))*abs.(A)
    for k=1:12
        # b = randn(m) # good case
        b = (1:m).^(k-1) # worst case
        x, x_exact = lu \ b, lu_big \ big.(b)
        err = norm(x - x_exact, Inf) / norm(x_exact, Inf)
        predicted = norm(AA*abs.(x), Inf)/norm(x, Inf)*eps()
        @printf "relative error[%2d]    = %.3e (predicted cond(A,x)*ε = %.3e)\n" k err predicted
    end
    @printf "predicted κ(A)*ε      = %.3e\n" cond(A)*eps()
    @printf "predicted cond(A)*ε   = %.3e\n" norm(AA, Inf)*eps()
end

平均情况(错误几近9个数量级):

julia> T.main4()
relative error[1]     = 6.690e-11 (predicted cond(A,x)*ε = 2.213e-10)
relative error[2]     = 6.202e-11 (predicted cond(A,x)*ε = 2.081e-10)
relative error[3]     = 2.975e-11 (predicted cond(A,x)*ε = 1.113e-10)
relative error[4]     = 1.245e-11 (predicted cond(A,x)*ε = 6.126e-11)
relative error[5]     = 4.820e-12 (predicted cond(A,x)*ε = 3.489e-11)
relative error[6]     = 1.537e-12 (predicted cond(A,x)*ε = 1.729e-11)
relative error[7]     = 4.885e-13 (predicted cond(A,x)*ε = 8.696e-12)
relative error[8]     = 1.565e-13 (predicted cond(A,x)*ε = 4.446e-12)
predicted κ(A)*ε      = 4.677e-04
predicted cond(A)*ε   = 1.483e-05

最坏的情况():a=1,,12

julia> T.main4()
relative error[ 1]    = 0.000e+00 (predicted cond(A,x)*ε = 6.608e-13)
relative error[ 2]    = 1.265e-13 (predicted cond(A,x)*ε = 3.382e-12)
relative error[ 3]    = 5.647e-13 (predicted cond(A,x)*ε = 1.887e-11)
relative error[ 4]    = 8.895e-74 (predicted cond(A,x)*ε = 1.127e-10)
relative error[ 5]    = 4.199e-10 (predicted cond(A,x)*ε = 7.111e-10)
relative error[ 6]    = 7.815e-10 (predicted cond(A,x)*ε = 4.703e-09)
relative error[ 7]    = 8.358e-09 (predicted cond(A,x)*ε = 3.239e-08)
relative error[ 8]    = 1.174e-07 (predicted cond(A,x)*ε = 2.310e-07)
relative error[ 9]    = 3.083e-06 (predicted cond(A,x)*ε = 1.700e-06)
relative error[10]    = 1.287e-05 (predicted cond(A,x)*ε = 1.286e-05)
relative error[11]    = 3.760e-10 (predicted cond(A,x)*ε = 1.580e-09)
relative error[12]    = 3.903e-10 (predicted cond(A,x)*ε = 1.406e-09)
predicted κ(A)*ε      = 4.677e-04
predicted cond(A)*ε   = 1.483e-05

编辑3另一个示例是Forsythe矩阵,它是一个扰动的Jordan块,其形式为 它具有,,所以,但是,因此。可以手动验证的是,尽管有可能无界的,但通过枢轴求解线性方程组(例如)非常精确。因此,该矩阵也将产生意想不到的精确解。

A=(010000100001ϵ000).
A=1A1=ϵ1κ(A)=ϵ1|A1|=A1=|A|1X = b κ cond(A)=1Ax=bκ(A)

编辑4个Kahan矩阵也是如此:cond(A)κ(A)

A = matrixdepot("kahan", 48)
κ, c = cond(A, Inf), norm(abs.(inv(A))*abs.(A), Inf)
@printf "κ=%.3e c=%.3e ratio=%g\n" κ c (c/κ)

κ=8.504e+08 c=4.099e+06 ratio=0.00482027

OP所指论文中的条件编号是两个标准条件编号。如果回到ElBarbary的参考文献[17],您会发现在较早的论文中,这些是两个标准的条件数。另外,我使用DMsuite设置了本文中的示例,并获得了与论文中报道的几乎完全相同的2规范条件编号。
Brian Borchers

我使用dmsuite和Chebyshev插值得到的这些示例的无穷范数条件范数在数量上与两次范数条件数相似。对于这个特定示例,我认为无穷范数条件数中的2范数之间的差异并不重要。
Brian Borchers

我认为,这些错误在报纸报道是绝对的,而不是相对误差(它不会使除相差太多,其中溶液接近骤降至0ϵ=0.01
布赖恩Borchers的

对于和,解的接近0的部分的相对误差很大,但绝对误差很小。我同意,该文件是关于什么使用条件数量和什么“错误”都是一模一样非常模糊(相对或绝对错误的。)N = 1024ϵ=0.01N=1024
布赖恩Borchers的

@BrianBorchers我不确定您的意思:这不是2-范数条件条件和强式范数条件数之间的区别,而是范数和分量方式的条件数(输入中的分量方式相对扰动,而不是分量)正确的相对误差,如您的答案)。
基里尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.