Неодноразово розв'язуючи


12

Я використовую MATLAB для вирішення проблеми, яка включає вирішення на кожному кроці, де b змінюється з часом. Зараз я досягаю цього за допомогою MATLAB :Ax=bbmldivide

x = A\b

У мене є можливість зробити стільки попередніх обчислень, скільки потрібно, тому мені цікаво, чи існує швидший і / або більш точний метод, ніж mldivide. Що зазвичай робиться тут? Дякую всім!


1
Чи маєте ви конкретні знання про структуру ? Наприклад, це симетрично? Позитивний певний? Тридіагональний? Ортогональні? A
Домінік

Матриця - щільна квадратна матриця. A
Сумнів

3
Якщо ви не маєте інших знань про , найкраща ставка для L U, як описано у відповіді нижче. ALU
Домінік

Відповіді:


14

Найбільш очевидне, що ви можете зробити, це попередньо обчислити

[L,U] = lu(A) ~ O (n ^ 3)

Тоді ви просто обчислюєте

x = U \ (L \ b) ~ O (2 n ^ 2)

Це значно знизить вартість і зробить її швидшою. Точність була б однаковою.


1
Зауважте, що в документації L необов'язково нижній трикутний. Ця відповідь, швидше за все, буде швидше, ніж пряме рішення, однак я був би обережний, щоб переконатися, що команда L \ b є достатньо розумною, щоб знати, як вирішувати L у правильному порядку (це, мабуть, є, але це не говорить напевно в документації).
Годрік Провид

Так, ти маєш рацію, L - добуток матриці нижньої трикутної форми та перестановної матриці. Але я буду проклятий, якщо він не визнає, що все, що він повинен робити, - це відставання заміни L\b. Оскільки я бачив, як саме цей рядок використовується у високоефективних кодах тими, кого я вважаю експертами.
Milind R

8
O(n2)

1
A

3
@BrianBorcher Наскільки я знаю, найкращий спосіб відстежувати перестановку - це [L,U,p] = lu(A,'vector'); x = U\(L\b(p));див. Приклад 3 у lu документах .
Стефано М

5

Ми провели декілька обширних комп'ютерних лабораторій на наших наукових курсах з обчислень на цю тему. Для "невеликих" обчислень, які ми робили там, оператор зворотної косої лінії Matlab завжди був швидшим за будь-що інше, навіть після того, як ми максимально оптимізували свій код і заздалегідь відредагували всі матриці (наприклад, із замовленням Reverse Cuthill McKee для замовлення рідких матриць) .

Ви можете ознайомитися з однією з наших інструкцій лабораторії . Відповідь на ваше запитання міститься (скоро) на сторінці 4.

Хорошу книгу на цю тему написав, наприклад, Чейні .


4

An×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

Деякі примітки

Щоб дізнатися про стабільність та аналіз помилок, будь ласка, дивіться коментарі до цієї різної відповіді , особливо відповіді VictorLiu.

mn

Синхронізацію проводили за допомогою Matlab R2011b на 12-ядерному комп'ютері із досить постійним середнім навантаженням UNIX 5; найкращий tic, tocчас з трьох зондів.


Дійсно, в матриці-векторному множенні доступно набагато більше паралелізму, ніж трикутний розв'язувач, тому це має бути ще більш очевидним, якщо обчислення робляться паралельно (багатоядерні / GPU / тощо) будь-яким способом.
Арон Ахмадія

@AronAhmadia Я погоджуюся: оцінки точок беззбитковості, що базуються лише на підрахунку операцій, мають сенс лише для серійної реалізації.
Стефано М

1
Зауважте, що речі будуть сильно відрізнятися, якщо матриця А буде рідкою - обернена, як правило, досить щільна, тоді як коефіцієнти LU, як правило, досить рідкі, відхилення речей у напрямку LU відбувається швидше.
Брайан Борчерс

1
A

1
inv(A)Ax=bbBA\B

2

Погляньте на це питання , відповіді показують, що mldivideце досить розумно, а також дає пропозиції щодо того, як бачити, що Matlab використовує для вирішення A\b. Це може дати вам підказку щодо варіантів оптимізації.


0

Використання зворотної косої риси більш-менш еквівалентно inv(A)*B, якщо ви кодуєте її вільно, остання може бути більш інтуїтивно зрозумілою. Вони приблизно однакові (просто різні в тому, як проводяться обчислення), хоча вам слід перевірити документацію Matlab для уточнення.

Щоб відповісти на ваше запитання, зворотна косої риси, як правило, добре, але це залежить від властивостей матриці маси.


1
Математично inv (A) * b є тим самим, що і \ однак чисельно, насправді формування зворотного є і менш ефективним, і менш точним. Якщо ви працюєте над вивченням лінійної алгебри, це може бути прийнятним, але я б заперечив, що вам потрібна дуже вагома причина, щоб сформувати обернене.
Годрік Провид

Але чому б ти коли-небудь обчислював, inv(A)оскільки це одне дорожче, ніж A\b?
Домінік

7
@Godric: Існує нещодавній документ, який обговорює "міф" про те, що inv (A) * b менш точний: на ArXiv . Не кажучи про те, що зазвичай є причина обчислити фактичну обернену, а просто сказати.
Віктор Лю

3
@ Домінік: Трикутні розв’язки набагато менш паралельні, ніж множення матричного вектора, а складні попередньо обумовлені ітераційні методи часто використовують прямі методи на субдоменах. Часто корисно чітко формувати звороти кількох скромних розмірів щільних трикутних матриць, щоб поліпшити паралелізм.
Джек Поульсон

@VictorLiu: Дякую за статтю. Я виправляю свою заяву про точність (як мінімум для розумних реалізацій inv (A)).
Годрік Провид
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.