TL은, DR은 그들이보고 조건 수, 반드시 우측 차이가 있기 때문에, 매트릭스에 대한 조건 참조.
이것은 행렬과 오른쪽 벡터에 따라 다릅니다. 에 대한 설명서를*getrs
보면 정방향 오류 범위는
여기서 는 일반적인 조건 번호 아니라
(여기서 표준 안에는 성분 별 절대 값이 있습니다.) 예를 들어 Higham 에 의한 선형 시스템 및 LAPACK의 반복적 개선 또는 Higham의 수치 알고리즘 의 정확도 및 안정성 (7.2)을 참조하십시오.
∥x−x0∥∞∥x∥∞≲cond(A,x)u≤cond(A)u.
cond(A,x)κ∞(A)cond(A,x)=∥|A−1||A||x|∥∞∥x∥∞,cond(A)=∥|A−1||A|∥.
귀하의 예를 들어, 과 비슷한 문제에 대해 의사 스펙트럼 차동 연산자를 사용 했으며 실제로및 , 나는 및 계산 했습니다. 표 3.1에 나와 있습니다 (3-4는 오류가 더 좋습니다). 조건이 잘못된 임의의 행렬에 대해 동일하게 시도하면 작동하지 않으므로 의 속성이어야합니다 .n=128∥|A−1||A|∥κ∞(A)7×1032.6×107A
Kahan으로 인해 Higham (7.17, p.124)에서 가져온 두 조건 번호가 일치하지 않는 명백한 예는
내가 찾은 또 다른 예는 random 와 함께 일반 Vandermonde 행렬입니다 . 나는 갔고 조건이 좋지 않은 다른 행렬도 and 같은 이런 유형의 결과를 산출합니다 .
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
본질적으로 진행중인 것은 섭동과 관련하여 선형 시스템을 해결하는 안정성을 분석 할 때 먼저 고려할 섭동 을 지정해야 한다는 것입니다. LAPACK으로 선형 시스템을 풀 때,이 오차 한계는 성분 별 동요를 고려 하지만 동요는 고려 하지 않습니다 . 따라서 이것은 일반적인이는 와 규범적인 섭동을 고려 합니다.Abκ(A)=∥A−1∥∥A∥Ab
(예를 들어) 구별 하지 않으면 어떻게 될지 고려하십시오 . 우리는 배정 밀도로 반복 정련을 사용하면 (위 링크 참조) 행렬에 대해 의 가장 좋은 상대 상대 오차를 얻을 수 있다는 것을 알고 있습니다 . 따라서 선형 시스템을 보다 더 나은 정확도로 해결할 수 없다는 아이디어를 고려 한다면 정제 솔루션은 어떻게 작동할까요?O(u)κ(A)≪1/uκ(A)u
PS 는 그 중요한 ?getrs
계산 된 솔루션의 진정한 솔루션을 말한다 (A + E)x = 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 다음은 서로 다른 조건 수가 예기치 않게 많이 나타나는 동일한 현상의 또 다른 예입니다. 이번에는
여기서 는 의 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 행렬
이것은 , 이므로 이지만 이므로 입니다. 그리고 손으로 확인할 수 , 잠재적으로 무한한 에도 불구하고 피벗으로 와 같은 선형 방정식 시스템을 해결하는 것은 매우 정확 합니다. 따라서이 매트릭스 역시 예기치 않은 정확한 솔루션을 제공합니다.
A=⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥A∥=1∥A−1∥=ϵ−1κ∞(A)=ϵ−1|A−1|=A−1=|A|−1A x = b κ ∞ ( A )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