Метод Ньютона может не сходиться по многим причинам, вот некоторые из наиболее распространенных.
- Якобиан неверен (или корректен последовательно, но не параллельно).
- Линейная система не решена или не решена достаточно точно.
- Якобианская система имеет особенность, с которой линейный решатель не справляется.
- В процедуре оценки функции есть ошибка.
- Функция не является непрерывной или не имеет непрерывных первых производных (например, изменение фазы или ограничители 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 или более поздней)
- Измените единицы (безразмерность), масштабирование граничных условий или формулировку так, чтобы якобиан был лучше обусловлен.
- Функции Mollify в функции, которые не имеют непрерывных первых производных (часто происходит, когда
if
в остаточной оценке есть операторы, например, изменение фазы или ограничители TVD). Используйте средство решения вариационных неравенств ( SNESVINEWTONRSLS ), если разрывы имеют фундаментальное значение.
- Попробуйте метод доверительной области (
-ts_type tr
возможно, придется настроить параметры).
- Запустите с некоторым параметром продолжения из точки, где вы знаете решение, см. TSPSEUDO для решения стационарных задач. Существуют гомотопические решатели, такие как PHCpack, которые могут дать вам все возможные решения (и сказать, что он нашел их все), но они не масштабируемы и не могут решить ничего, кроме небольших проблем.