Практичний приклад того, чому недобре інвертувати матрицю


16

Мені відомо про те, що інвертування матриці для вирішення лінійної системи не є хорошою ідеєю, оскільки вона не настільки точна і настільки ефективна, як безпосередньо розв’язання системи або з використанням розкладання LU, Cholesky або QR.

Однак я не зміг перевірити це на практичному прикладі. Я спробував цей код (у MATLAB)

M   = 500;    
A   = rand(M,M);
A   = real(expm(1i*(A+A.')));
b   = rand(M,1);

x1  = A\b;
x2  = inv(A)*b;

disp(norm(b-A*x1))
disp(norm(b-A*x2))

і залишки завжди в одному порядку (10 ^ -13).

Чи може хтось надати практичний приклад, у якому inv (A) * b набагато менш неточний, ніж A \ b?

------ Оновлення питань ------

Дякую за відповіді. Однак припустимо, що ми повинні розв’язати разів систему A x = b , де A завжди однакова матриця. Вважайте цеnAx=bA

- повно, і , таким чином - 1 вимагає того ж зберігання пам'яті , ніж A .AA1A

- Кількість умов невелике, отже, A - 1 можна обчислити з точністю.AA1

У цьому випадку, чи не було б більш ефективним обчислити а не використовувати розклад LU? Наприклад, я спробував цей код Matlab:A1

%Set A and b:
M           = 1000; 
A           = rand(M,M);
A           = real(expm(1i*(A+A.')));
b           = rand(M,1);

%Times we solve the system:
n           = 3000;

%Performing LU decomposition:
disp('Performing LU decomposition')
tic
[L,U,P]     = lu(A);
toc
fprintf('\n')

%Solving the system n times with LU decomposition:
optsL.LT    = true;   %Options for linsolve
optsU.UT    = true;
disp('Solving the system n times using LU decomposition')
tic
for ii=1:n
    x1      = linsolve(U, linsolve(L,P*b,optsL) , optsU);
end
toc
fprintf('\n')

%Computing inverse of A:
disp('Computing inverse of A')
tic
Ainv        = inv(A);
toc
fprintf('\n')

%Solving the system n times with Ainv:
disp('Solving the system n times with A inv')
tic
for ii=1:n
    x2  = Ainv*b;
end
toc
fprintf('\n')

disp('Residuals')
disp(norm(b-A*x1))
disp(norm(b-A*x2))

disp('Condition number of A')
disp(cond(A))

Для матриці з числом умов близько 450 залишковими є в обох випадках, але для розв’язання системи n разів за допомогою розкладання LU потрібно 19 секунд, тоді як для використання зворотного A це займає лише 9 секунд.O(1011)


8
сторінка довідки MATLAB для запрошення - хороший приклад. Подивіться в розділ під назвою Розв’язати лінійну систему .
GoHokies

1
btw, який номер умови вашої матриці ? Я не маю MATLAB на своєму ПК на роботі, тому я не можу перевірити, але я припускаю, що він досить малий, щоб отримати точний зворотній ...A
GoHokies

2
Я ознайомився з Трефетеном та Бау (вправа 21.4), і вони описують це суто це умови обчислення, флопа проти 22n3флопа. Тож навіть якщо ви знайдете залишки схожими (ви спробували перевірити більш погано обумовлені матриці, як у коментарі GoHokies?), Непотрібна вартість обчислення сама по собі, ймовірно, варта поради. 23n3
Кирило

3
Ваш розмір матриці є занадто малим і добре обумовлений для цього порівняння. Не те, що немає таких проблем, коли у вас є такі матриці, але отримана думка, яку ви не повинні інвертувати, призначена для іншої настройки (наприклад, тієї, яку згадував у своїй відповіді Кріс Ракаукас). Насправді, для малих та - достовірно - добре кондиціонованих матриць обчислення обернених дійсно може бути кращим варіантом. Крайнім випадком будуть матриці обертання 3x3 (або, що більш реально, афінне перетворення).
Крістіан Класон

1
Якщо вам потрібно неодноразово вирішувати Ax=bодне Aі те ж, і це досить мало, щоб зробити зворотну, ви можете замість цього зберегти LU-коефіцієнт і використовувати його повторно.
Кріс Ракаукас

Відповіді:


11

Зазвичай є деякі основні причини, щоб віддати перевагу вирішенню лінійної системи щодо використання зворотного. Коротко:

  • проблема з умовним числом (коментар @GoHokies)
  • проблема в рідкісному випадку (@ChrisRackauckas відповідь)
  • ефективність (@Kirill коментар)

У будь-якому випадку, як зауважив @ChristianClason у коментарях, можуть бути деякі випадки, коли використання зворотного є хорошим варіантом.

У примітці / статті Олексія Друінського, Сівана Толедо, наскільки точним є запрошення (A) * b? є певний розгляд цієї проблеми.

x

inverse||xVx||O(κ2(A)ϵmachine) backward stable (LU, QR,...)||xbackwardstablex||O(κ(A)ϵmachine)

xV

V

V

V||xV||||x||

bA

Отож, можливість використання чи не зворотного залежить від програми, чи можете ви перевірити статтю, чи є у випадку, якщо ваш випадок задовольняє умові отримати відсталу стабільність або якщо вона вам не потрібна.

Загалом, на мій погляд, безпечніше вирішити лінійну систему.


12

Δu

ut=Δu+f(t,u).

A

ut=Au+f(t,u)

AIγASpecialMatrices.jl

julia> using SpecialMatrices
julia> Strang(5)
5×5 SpecialMatrices.Strang{Float64}:
 2.0  -1.0   0.0   0.0   0.0
-1.0   2.0  -1.0   0.0   0.0
 0.0  -1.0   2.0  -1.0   0.0
 0.0   0.0  -1.0   2.0  -1.0
 0.0   0.0   0.0  -1.0   2.0

nO(3n)O(1)

Однак скажімо, ми хочемо перевернути матрицю.

julia> inv(collect(Strang(5)))
5×5 Array{Float64,2}:
 0.833333  0.666667  0.5  0.333333  0.166667
 0.666667  1.33333   1.0  0.666667  0.333333
 0.5       1.0       1.5  1.0       0.5
 0.333333  0.666667  1.0  1.33333   0.666667
 0.166667  0.333333  0.5  0.666667  0.833333

O(n2)

\IterativeSolvers.jlAx=bA1A

Як уже згадували інші, номер умови та числова помилка - це ще одна причина, але той факт, що обернена частина рідкої матриці є щільною, дає дуже чітке "це погана ідея".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.