tl; dr違いがあるため、必ずしもマトリックスの正しい条件番号ではなく、条件番号を報告しました。
これは、行列と右側のベクトルに固有です。あなたが見ればのドキュメント*getrs
、それがバインドされ、前方誤りがあると言う
ここで、C、O、N、D(Aは、Xは)非常に通常の条件数ないκ∞(A)、むしろ
、C、O、ND(A、X)=‖| A − 1
∥ X - X0∥∞∥ X ∥∞≲ C 、O 、N D(A 、X )U ≤ C 、O 、N D(A )U 。
c o n d(A、x)κ∞(A )
(ここでは、これらはコンポーネントごとの絶対値です。)たとえば、
Highamによる線形システムとLAPACKの反復改良、またはHighamの
数値アルゴリズムの
精度と安定性(7.2)を参照してください。
cond(A,x)=∥|A−1||A||x|∥∞∥x∥∞,cond(A)=∥|A−1||A|∥.
あなたの例では、同様の問題に対して擬似スペクトル微分演算子を使用しましたが、実際には‖ | A − 1 | | A | ‖及びκ ∞(A )、Iが計算7 × 10 3及び2.6 × 10 7n=128∥|A−1||A|∥κ∞(A)7×1032.6×107、これはすべての右辺でこれが起こるという観察を説明するのに十分です。なぜなら、桁数は表3.1で見られるものとほぼ一致するからです(3-4桁のより良い誤差)。これは、ランダムな悪条件のマトリックスに対して同じことをしようとすると機能しません。したがって、プロパティでなければなりません。A
原因カハンに私はハイアム(7.17、P.124)から取った2条件番号が一致しないため、明示的な例は、ある
私が見つけた別の例は、ランダムなbをもつ単なるVandermonde行列です。私はを経て、いくつかの他の悪条件の行列も同様に、結果のこのタイプを生産して。
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
本質的に、起こっていることは、摂動に関して線形システムを解く安定性を分析するとき、最初に考慮している摂動を指定する必要があるということです。LAPACKで線形システムを解くとき、この誤差限界は成分ごとの摂動を考慮しますが、bの摂動は考慮しません。通常とは異なるこれにはκ (A )= ‖ A - 1 ‖ ‖ A ‖両方でnormwise摂動を考慮し、AおよびB。Abκ(A)=∥A−1∥∥A∥Ab
(反例として)区別しないとどうなるかを考えてください。倍精度の反復改良(上記のリンクを参照)を使用すると、κ (A )≪ 1 / uの行列に対して可能な限り最良の前方相対誤差を得ることができます。それでは、線形システムはκ (A )uよりも正確に解くことができないという考えを考慮すると、どのように精製解が機能するのでしょうか?O(u)κ(A)≪1/uκ(A)u
PSそれはそれは問題に?getrs
計算された解が真の解であると言う(A + E)x = b
摂動とにおけるAが、中に無摂動B。摂動がbで許可されている場合、状況は異なります。EAbb
編集これをコードでより直接的に示すために、これはまぐれや運の問題ではなく、特定のマトリックス、つまり
c o n d(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これは、異なる条件番号が予想外に大きく異なる同じ現象の別の例です。このとき、
ここでAは上に10×10 Vandermonde行列であり、1 :10、および場合xはランダムに選択され、C 、O 、N D(A 、xは)よりnoticably小さいですκ
C 、O 、N D(A、X)« C 、O 、N D(A)≈κ(A)。
A1 :10バツc o n d(A、x)、最悪の場合
、Xはで与えられる
X iは = I一部の
A。
κ (A )バツバツ私= 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行列です。これは、A = (0 1 0 0 0 0 1 0の形式の任意のサイズの摂動を受けたJordanブロックです
A = ⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟。
∥ A ∥ = 1∥ A− 1∥ = ϵ− 1κ∞(A )= ϵ− 1| A− 1| = A− 1= | A |− 1c o n d(A)=1A x = bκ∞(A )
C 、O 、N D(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