Метод Ньютона може не зближуватися з багатьох причин, ось кілька найбільш поширених.
- Якобійський помиляється (або правильний у послідовній, але не паралельній).
- Лінійна система не вирішена або недостатньо точно вирішена.
- Якобійська система має особливість, яку лінійний розв'язувач не обробляє.
- У програмі оцінки функцій є помилка.
- Функція не є безперервною або не має безперервних перших похідних (наприклад, зміна фаз або обмежувачі TVD).
- Рівняння можуть не мати рішення (наприклад, граничний цикл замість усталеного стану) або може виникнути "пагорб" між початковою здогадкою та стаціонарним станом (наприклад, реагенти повинні запалюватися і горіти, перш ніж досягти сталого стану, але стан залишків буде більше при горінні).
Ось кілька способів допомогти налагодити відсутність конвергенції Ньютона.
- Запустити з параметрами
-snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason
. Якщо лінійна розв'язка не збігається, перевірте, чи якобіанський вірний, тоді перегляньте це питання . Якщо попередньо обумовлений залишок сходиться, але справжній залишок цього не відбувається, попередній передумови можуть бути сингулярними. Якщо лінійне розв’язання добре сходиться, але пошук рядків не вдається, якобіан може бути неправильним.
- Запустіть,
-pc_type lu or -pc_type svd
щоб переконатися, що проблема в поганому лінійному вирішенні
- Побіжіть з
-mat_view
чи -mat_view_draw
перевірте, чи виглядає якобіанець розумним
- Запустіть,
-snes_type test -snes_test_display
щоб переконатися, що якобіанець, який ви використовуєте, неправильний. Порівняйте результат, коли ви додаєте, -mat_fd_type ds
щоб побачити, чи результат чутливий до вибору параметра диференціювання.
- Запустіть,
-snes_mf_operator -pc_type lu
щоб переконатися, що якобіанець, який ви використовуєте, неправильний. Якщо проблема занадто велика для прямого вирішення, спробуйте -snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12
. Порівняйте результат, коли ви додаєте, -mat_mffd_type ds
щоб побачити, чи результат чутливий до вибору параметру розмежування.
- Запустіть на одному процесорі, щоб перевірити, чи проблема є лише паралельно.
- Запустіть,
-snes_ls_monitor
щоб побачити, чи не вдався пошук рядків (зазвичай це знак поганого якобійця).
- Запустіть,
-info
щоб отримати більш детальну інформацію про процес рішення.
Ось кілька способів допомогти процесу Ньютона, якщо все вище перевірено
- Запустіть послідовність сітки (
-snes_grid_sequence
це все, що вам потрібно, якщо працюєте з a DM
), щоб генерувати кращі початкові здогадки про вашу тоншу сітку
- Запустити з квадратичною точністю (
./configure --with-precision=__float128 --download-f2cblaslapack
для PETSc 3.2 та новіших версій, потрібні компілятори GNU версії 4.6 або новішої)
- Змініть одиниці (неконцентралізація), масштабування граничних умов або формулювання, щоб якобіанські умови були кращими.
- Моліфікувати функції у функції, які не мають постійних перших похідних (часто виникає, коли є
if
залишкові оцінки, наприклад, зміна фази або обмежувачі TVD). Використовуйте розв'язувач варіативної нерівності ( SNESVINEWTONRSLS ), якщо розриви мають принципове значення.
- Спробуйте метод області довіри (
-ts_type tr
можливо, доведеться коригувати параметри).
- Запустіть деякий параметр продовження з точки, де ви знаєте рішення, див. TSPSEUDO для вирішення стаціонарних задач. Є пакети гомотопічних рішень, таких як PHCpack, які можуть отримати всі можливі рішення (і сказати вам, що він їх знайшов), але вони не є масштабованими і не можуть вирішити нічого, крім невеликих проблем.