根据此处的答案,较大的条件数(用于线性系统求解)会减少浮点解中保证的正确数字位数。伪光谱方法中的高阶微分矩阵通常条件非常恶劣。为什么它们仍然是非常准确的方法?
我了解病态矩阵带来的低精度只是一个保证值,但仍然令我感到奇怪的是,为什么实际上可以通过直接方法准确地解决病态矩阵-例如,LCOL
第11页的表3.1 的列Wang等人,使用伪光谱积分矩阵的条件良好的聚集方法,SIAM J. Sci。计算36(3)。
根据此处的答案,较大的条件数(用于线性系统求解)会减少浮点解中保证的正确数字位数。伪光谱方法中的高阶微分矩阵通常条件非常恶劣。为什么它们仍然是非常准确的方法?
我了解病态矩阵带来的低精度只是一个保证值,但仍然令我感到奇怪的是,为什么实际上可以通过直接方法准确地解决病态矩阵-例如,LCOL
第11页的表3.1 的列Wang等人,使用伪光谱积分矩阵的条件良好的聚集方法,SIAM J. Sci。计算36(3)。
Answers:
在我的最初答案之后添加:
在我看来,参考文献的作者正在表中给出条件编号(显然是2范式条件编号,但可能是无穷范数条件编号),同时给出最大绝对误差而不是范数相对误差或最大元素相对误差(这些都是不同的度量。)请注意,最大逐元素相对误差与无穷范数相对误差不是同一件事。此外,表中的误差是相对于原始微分方程边界值问题的精确解,而不是离散的线性方程组。因此,本文中提供的信息确实不适用于基于条件编号的错误界限。
但是,在我的计算复制中,我确实看到了这样的情况:相对无穷范数误差(或两范数相对误差)大大小于无穷范数条件数(分别为2范数条件数)所设置的边界。有时候你只是幸运。
我使用了DMSUITE MATLAB软件包,并使用带有Chebyshev多项式的伪光谱方法解决了本文中的示例问题。我的条件编号和最大绝对错误与论文中报道的相似。
我还看到基于条件编号的规范相对误差要好于人们预期的误差。例如,在与示例问题,使用Ñ = 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完全相同,则
可以针对各种规范来计算条件编号,但是经常使用两个标准的条件编号,这就是您所引用的论文中使用的条件编号。
时,会发生最坏的情况下错误是的左奇异向量对应的最小奇异值。当是的左奇异矢量,对应于的最大奇异值时,发生最佳情况。当是随机的,那么你在的预测看在所有的左奇异向量的和相应的奇异值。取决于的频谱,事情可能会变得非常糟糕或非常好。 阿甲Δ b 阿甲Δ b Δ b 甲
考虑两个矩阵,它们的2范数条件数均为。第一矩阵具有奇异值,,,。所述第二矩阵具有奇异值,,,,。 1.0 × 10 10 1 1 × 10 − 10 … 1 × 10 − 10 1 1 … 1 1 × 10 − 10
在第一种情况下,随机扰动不太可能朝着第一个左奇异矢量的方向,而更可能接近奇异值的奇异矢量之一。因此,解决方案中的相对变化可能非常大。在第二种情况下,几乎所有扰动都将在方向上接近具有奇异值的奇异矢量,并且解中的相对变化将很小。 1
PS(稍后我从瑜伽课回来后添加...)
用于溶液的式是
根据毕达哥拉斯定理,
如果我们保留,则当时此和最大,而当时此和最小。Δ b = û Ñ
在此处考虑的情况下,是随机舍入误差的结果,因此值都应具有大致相同的大小。值较小的项将对错误起很大的作用,而值较大的项将没有太大的作用。根据频谱,这很容易比最坏情况下的范围小。 ü Ť 我 Δ b σ 我 σ 我
?getrs
tl; dr他们报告了条件号,不一定是矩阵的正确条件号,因为存在差异。
这特定于矩阵和右侧向量。如果您查看的文档*getrs
,它会指出前向错误界限为
这里并非通常的条件编号,而是
(在规范内,这是按组件分配的绝对值。)例如,参见Higham的线性系统和LAPACK的迭代优化,或Higham的数值算法的准确性和稳定性(7.2)。
在您的示例中,我为的类似问题采用了伪谱微分算子,实际上之间有很大的差异 和,我计算了和,这足以解释这种情况发生在所有右侧的观察,因为数量级大致匹配如表3.1所示(3-4阶更好的错误)。当我仅对随机病态矩阵尝试相同操作时,这将不起作用,因此它必须是的属性。
我从Higham(7.17,p.124)摘下的两个条件编号不匹配的显式示例是 我发现的另一个示例只是带有随机的纯Vandermonde矩阵。我经历了一些其他条件不佳的矩阵,也产生了这种类型的结果,例如和。
[1:10]
MatrixDepot.jl
triw
moler
从本质上讲,这是怎么回事,就是当你分析解决相对于扰动线性系统的稳定性,你首先要指定哪些你正在考虑扰动。使用LAPACK求解线性系统时,此误差界线考虑分量扰动,但不考虑扰动。因此,这不同于通常的,它考虑了和规范扰动。
考虑(作为一个反例)如果不进行区分也会发生什么。我们知道,使用具有双精度的迭代细化(请参见上面的链接,对于具有那些矩阵,我们可以获得的最佳可能正向相对误差。因此,如果我们认为不能以比更好的精度解决线性系统的想法,那么精炼解决方案将如何工作?
PS它很重要的是?getrs
说,计算的解决方案是真正的解决方案(A + E)x = b
有干扰的,但在任何扰动。如果在中允许摄动,情况将有所不同。
编辑为了更直接地显示此代码的工作原理,这不是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矩阵,并且当随机选择时,明显小于,并且最坏的情况由给出代表。
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
最坏的情况():
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块,其形式为 它具有,,所以,但是,因此。可以手动验证的是,尽管有可能无界的,但通过枢轴求解线性方程组(例如)非常精确。因此,该矩阵也将产生意想不到的精确解。
用编辑4个Kahan矩阵也是如此:
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