tl; dr Вони повідомили номер умови, не обов'язково правильний номер умови для матриці, оскільки є різниця.
Це властиво матриці та вектору правої сторони. Якщо ви подивитеся на документацію*getrs
, він говорить про те, що пов'язана помилка вперед
Тут - не зовсім звичайний номер умови , а скоріше
(Тут всередині норми це абсолютні значення, що залежать від компонентів.) Див., Наприклад, Ітераційне уточнення для лінійних систем та LAPACK за Хіггемом , або Точність та стабільність чисельних алгоритмів Хіггема (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
Явний приклад, для якого два числа умов не відповідають, який я взяв від Хіггема (7.17, стор.124), завдяки Кахану -
Ще один приклад, який я знайшов, - це просто звичайна матриця Вандермонд із випадковим . Я пройшов, і деякі інші умовні матриці також дають такий результат, як і .
⎛⎝⎜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 на , і коли вибрано випадковим чином, помітно менше, ніж , а найгірший випадок задається для деякого .
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 Іншим прикладом є матриця Форсайта, яка є збуреним Йорданським блоком будь-якого розміру форми
Це має , , тому , але , тому . І як можна перевірити вручну, розв’язування таких систем лінійних рівнянь, як з поворотом є надзвичайно точним, незважаючи на потенційно необмежений . Тож ця матриця теж дасть несподівано точні рішення.
A=⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥A∥=1∥A−1∥=ϵ−1κ∞(A)=ϵ−1|A−1|=A−1=|A|−1cond(A)=1Ax=bκ∞(A)
Редагувати 4 матриці Кахана так само, як :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