悪条件の線形システムを正確に解決できるのはなぜですか?


13

ここでの答えによると、(線形システムの解法のための)条件数が大きいと、浮動小数点ソリューションで保証される正しい桁数が減少します。擬似スペクトル法の高次微分行列は、通常、非常に悪条件です。なぜ彼らはまだ非常に正確な方法であるのですか?

悪条件の行列から生じる低精度は保証された値にすぎないことを理解していますが、それでも悪条件の行列が実際の直接的な方法で正確に解かれるのか疑問に思いLCOLます。Wang et al。、擬似スペクトル積分行列を使用したウェル条件付きコロケーション方法、SIAM J. Sci。計算、36(3)


2
私の直感では、Ax = bシステムの可解性/精度は、行列Aだけでなく強制ベクトルbにも結び付けられています。おそらく、bがAの悪条件のモードを「プローブ」または「励起」しない場合、正確な解可能です。制限的な例として、Aは厳密に特異(無限の条件数)ですが、強制データbがAの範囲内にある場合、Ax = bは依然として正確に計算できる解を持っている場合があります。 -wavy、だから答えの代わりにコメントするだけです。
rchilton1980

@ rchilton1980「まだAx = bは解決策を持っているかもしれません」しかし、その解決策はユニークではありません。そして、私が言及している例には独自の解決策があります。
ゾルタンチャティ

それは公平な対位法です-おそらく無限の条件数(正確にゼロの固有値)を選ぶことのアーティファクトです。ただし、そのゼロの固有値を機械イプシロンに置き換えることができると思いますが、私のポイントはまだ立っています。(つまり、システムは非常に大きな条件数を持ち、システムはaユニークなソリューションで特異ではなく、bがその小さな固有ペアに沿ったコンポーネントを持たない場合、非常に正確に計算できます)。
rchilton1980

1
より具体的には、ここでの私の思考実験は、A = diag([1 1 1 1 1 eps])、b = [b1 b2 b3 b4 b5 0]のようなものです。それは工夫が、私は本来の主張を正当化するsuffcientだと思うされます。「時々病気AさんがBの特定の選択肢のために正確に解くことができる条件」
rchilton1980

1
ただ、Molerのブログからの別の例を与えるblogs.mathworks.com/cleve/2015/02/16/...
percusse

回答:


7

私の最初の答えの後に追加されました:

参照された論文の著者は、テーブルで条件番号(明らかに2ノルム条件番号、場合によっては無限大ノルム条件番号)を与えているが、ノルム相対誤差または最大要素ごとの相対誤差ではなく最大絶対誤差(これらはすべて異なる尺度です。)最大の要素ごとの相対誤差は、無限大ノルムの相対誤差と同じではないことに注意してください。さらに、表の誤差は、離散化された線形連立方程式ではなく、元の微分方程式境界値問題の正確な解に関連しています。したがって、論文で提供された情報は、条件番号に基づいたエラー範囲での使用には実際には適切ではありません。

ただし、計算の複製では、相対無限ノルム誤差(または2ノルム相対誤差)が無限ノルム条件数(それぞれ2ノルム条件数)によって設定された境界よりも大幅に小さい状況が見られます。時々あなたは幸運になります。

DMSUITE MATLABパッケージを使用し、チェビシェフ多項式を使用した擬似スペクトル法を使用して、このホワイトペーパーの問題例を解決しました。私の状態番号と最大絶対誤差は、論文で報告されたものと同様でした。

また、条件番号に基づいて予想されるよりもやや良い標準相対エラーも見ました。たとえば、問題の例では、N = 1024を使用して、ϵ=0.01N=1024

cond(A、2)= 7.9e + 8

cond(A、inf)= 7.8e + 8

norm(u-uexact、2)/ norm(uexact、2)= 3.1e-12

norm(u-uexact、inf)/ norm(uexact、inf)= 2.7e-12

解決策は約11〜12桁で、条件番号は1e8程度であるように見えます。

ただし、要素ごとのエラーの状況はさらに興味深いです。

max(abs(u-uexact))= 2.7e-12

それはまだよさそうだ。

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

うわー、ソリューションの少なくとも1つのコンポーネントに非常に大きな相対誤差があります。

どうした?この方程式の正確な解には小さな成分(1.9e-22など)がありますが、近似解は9e-14の非常に大きな値で底をつきます。これは、ノルム相対誤差測定(2ノルムまたは無限ノルム)によって隠されており、要素ごとの相対誤差を見て最大値をとるときにのみ表示されます。

以下の私の元の答えは、解で条件番号で与えられた限界よりも小さい標準相対誤差を得ることができる理由を説明しています。


質問で指摘したように、非特異行列の条件数は、摂動方程式の解の最悪の相対誤差範囲を与えます。我々は解決する場合すなわち、AがX + Δ X = B + Δ B正確かつ解決A X = B正確、次いでκ(A)A(x+Δx)=b+ΔbAx=b

Δxxκ(A)Δbb

条件番号はさまざまな基準に関して計算できますが、2ノルムの条件番号がよく使用されます。これは、参照する論文で使用されている条件番号です。

場合最悪の場合の誤差が発生し左特異ベクトルであり、Aの最小特異値に対応するA。場合に最良のケースが発生し、Δ bは左特異ベクトルであり、Aの最大特異値に対応するA。とき、Δ bはランダムです、あなたはの予測を見ているΔのBの左特異ベクトルの全てにAと対応する特異値。Aのスペクトルに応じて、物事は非常にうまくいかない場合があります。 ΔbAAΔbAAΔbΔbAA

両方とも2ノルム条件数1.0 × 10 10の 2つの行列考えます。最初の行列は特異値を有する11 × 10 - 10、、。第2の行列は特異値を有する、、、A1.0×101011×10101 × 10 10 1 1 1×101011 1 × 10 - 1011×1010

最初のケースでは、ランダム摂動は最初の左特異ベクトルの方向にある可能性は低く、特異値の特異ベクトルの1つに近い可能性が高くなります。したがって、ソリューションの相対的な変化は非常に大きい可能性があります。2番目の場合、ほとんどすべての摂動は、特異値1の特異ベクトルに近い方向になり、解の相対的な変化は小さくなります。 1×10101

PS(ヨガのクラスから戻った後に追加...)

解決するための式ありますAΔx=Δb

バツ=VΣ1うんTb==1nうんTbσV

ピタゴラスの定理により、

バツ22==1nうんTbσ2

我々は続ける場合、この和が場合最大とΔ B = U Nとするとき最小Δ B = U 1b2=1b=うんnb=うん1

ここで検討状況では、ので、ランダム丸め誤差の結果であるU T I ΔのBの値がすべてほぼ同じ大きさであるべきです。値が小さいとの観点σ 私はエラーに多くを貢献するには、より大きな値を持つ用語ながら、σは、私はあまり寄与しません。スペクトルに応じて、これは最悪の場合の限界よりもはるかに小さくなります。 bうんTbσσ


考えていないこの引数は、それがことを意味するものであるの下限最悪の場合到達するために(たとえそうであれば)可能性の例では行列のために?AFAIU、私の答えとのドキュメントに基づいて、これは不可能です。κ(A)?getrs
キリル

@BrianBorchersあなたは最悪の場合エラーが発生した理由を」手の込んだてもらえ左特異ベクトルであるAの最小特異値に対応するA。最良のケースが発生したときに、Δ bは左特異ベクトルであるAの最大に対応するが、Aの特異値。」保持?以下の例からは論理的ですが、いくつかの式が必要になります。SVDましょAがであり、A = U Σ V T。最初のケースでは、A = Δ B σ 1 、V T 1 +bAAbAAAA=うんΣVT。どうやって進める?A=bσ1v1T+=2NあなたはσvT
ゾルタンCsáti17年

マトリックスの丸め誤差については説明しませんでしたが、一般的な効果は似ています。丸め誤差で本当に不運にならない限り、悲観的な最悪の場合の限界よりも多少良くなります。A
ブライアンボーチャーズ

(-1)出力におけるコンポーネントごとの相対的なエラーの議論は、重大な誤解を招きます。
キリル

1

tl; dr違いがあるため、必ずしもマトリックスの正しい条件番号ではなく条件番号を報告しまし

これは、行列と右側のベクトルに固有です。あなたが見ればのドキュメント*getrs、それがバインドされ、前方誤りがあると言う ここで、C、O、N、DAはXは非常に通常の条件数ないκA、むしろ 、C、O、NDAX=| A1

バツバツ0バツcondAバツあなたはcondAあなたは
condAバツκA (ここでは、これらはコンポーネントごとの絶対値です。)たとえば、Highamによる線形システムとLAPACKの反復改良、またはHighamの数値アルゴリズム精度と安定性(7.2)を参照してください。
cond(A,x)=|A1||A||x|x,cond(A)=|A1||A|.

あなたの例では、同様の問題に対して擬似スペクトル微分演算子を使用しましたが、実際には| A 1 | | A | 及びκ A 、Iが計算7 × 10 3及び2.6 × 10 7n=128|A1||A|κ(A)7×1032.6×107、これはすべての右辺でこれが起こるという観察を説明するのに十分です。なぜなら、桁数は表3.1で見られるものとほぼ一致するからです(3-4桁のより良い誤差)。これは、ランダムな悪条件のマトリックスに対して同じことをしようとすると機能しません。したがって、プロパティでなければなりません。A

原因カハンに私はハイアム(7.17、P.124)から取った2条件番号が一致しないため、明示的な例は、ある 私が見つけた別の例は、ランダムなbをもつ単なるVandermonde行列です。私はを経て、いくつかの他の悪条件の行列も同様に、結果のこのタイプを生産して。

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

本質的に、起こっていることは、摂動に関して線形システムを解く安定性を分析するとき、最初に考慮している摂動を指定する必要があるということです。LAPACKで線形システムを解くとき、この誤差限界は成分ごとの摂動を考慮しますが、bの摂動は考慮しません。通常とは異なるこれにはκ A = A - 1A 両方でnormwise摂動を考慮し、AおよびBAbκ(A)=A1AAb

(反例として)区別しないとどうなるかを考えてください。倍精度の反復改良(上記のリンクを参照)を使用すると、κ A 1 / uの行列に対して可能な限り最良の前方相対誤差を得ることができます。それでは、線形システムはκ A uよりも正確に解くことができないという考えを考慮すると、どのように精製解が機能するのでしょうか?O(u)κ(A)1/uκ(A)u

PSそれはそれは問題に?getrs計算された解が真の解であると言う(A + E)x = b摂動とにおけるAが、中に無摂動B。摂動がbで許可されている場合、状況は異なります。EAbb

編集これをコードでより直接的に示すために、これはまぐれや運の問題ではなく、特定のマトリックス、つまり

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これは、異なる条件番号が予想外に大きく異なる同じ現象の別の例です。このとき、 ここでAは上に10×10 Vandermonde行列であり、1 10、および場合xはランダムに選択され、C 、O 、N DA xはよりnoticably小さいですκ

condAバツcondAκA
A110バツcondAバツ、最悪の場合、Xはで与えられる X iは = I一部の AκAバツバツ=aa
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=112

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=010000100001ϵ000
A=1A1=ϵ1κA=ϵ1|A1|=A1=|A|1condA=1Aバツ=bκA

condAκ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が参照する論文の条件番号は、2ノルムの条件番号です。ElBarbaryの参考文献[17]に戻ると、以前の論文ではこれらが2ノルムの条件数であったことがわかります。また、DMsuiteを使用してこのホワイトペーパーの例をセットアップし、ホワイトペーパーで報告されているものとほぼ同じ2ノルムの条件数を取得しました。
ブライアンボーチャーズ

dmsuiteおよびChebyshev補間を使用して得たこれらの例の無限ノルム条件ノルムは、2ノルム条件数と大きさが似ていました。この特定の例にとって、無限ノルム条件数の2ノルムの違いはそれほど重要ではないと思います。
ブライアンボーチャーズ

ϵ=0.01

ϵ=0.01N=1024

@BrianBorchersあなたが何を言っているのか分かりません:これは2ノルムとinftyノルムの条件数の違いではなく、むしろノルムワイズとコンポーネントワイズの条件数(コンポーネントではなく、コンポーネントワイズの相対的な摂動です)あなたの答えのように出力の賢明な相対誤差)。
キリル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.