Задание (не)линейных решателей и предобусловливателей
Одной из ключевых особенностей пакета DifferentialEquations.jl является его гибкость. В соответствии с этой тенденцией многие из собственных решателей Julia, предоставляемых в DifferentialEquations.jl, позволяют выбирать метод для линейного и нелинейного решения. Здесь подробно описывается, как сделать такой выбор.
Настоятельно рекомендуется изучить руководство Решение больших жестких уравнений, в котором эти варианты рассматриваются на реальном примере. |
Они неприменимы к решателям дифференциальных уравнений Sundials ( |
Линейные решатели: спецификация linsolve
Для линейных решателей DifferentialEquations.jl использует LinearSolve.jl. В качестве линейного решателя можно использовать любой алгоритм LinearSolve.jl, просто передав выбранный алгоритм в linsolve. Например, ниже указывается, что TRBDF2
должен использовать KLU.jl.
TRBDF2(linsolve = KLUFactorization())
Существует множество вариантов, включая разгрузку GPU, поэтому для получения более подробной информации об этих вариантах см. документацию по LinearSolve.jl.
Предобусловливатели: спецификация precs
В качестве левого или правого предобусловливателя может использоваться любой предобусловливатель, совместимый с LinearSolve.jl. Предобусловливатели задаются функцией Pl,Pr = precs(W,du,u,p,t,newW,Plprev,Prprev,solverdata)
, аргументы которой определяются следующим образом.
-
W
: текущий якобиан нелинейной системы. Задается как или в зависимости от алгоритма. Как правило, это будет типWOperator
, определенный в OrdinaryDiffEq.jl. Это отложенное представление оператора. Пользователи могут построить W-матрицу по запросу , вызвав функциюconvert(AbstractMatrix,W)
для получения матрицыAbstractMatrix
, соответствующейjac_prototype
. -
du
: текущая производная ODE; -
u
: текущее состояние ODE; -
p
: параметры ODE; -
t
: текущее время ODE -
newW
: значениеBool
, указывающее, обновлялась ли матрицаW
с момента последнего вызоваprecs
. Рекомендуется установить этот флажок, чтобы обновлять предобусловливатель только в том случае, еслиnewW == true
. -
Plprev
: предыдущийPl
. -
Prprev
: предыдущийPr
. -
solverdata
: необязательные дополнительные данные, которые решатели могут передавать функцииprecs
. Зависит от решателя и может изменяться.
Возвращается кортеж (Pl,Pr)
из совместимых с LinearSolve.jl предобусловливателей. Чтобы задать одностороннее предобусловливание, достаточно возвратить nothing
для неиспользуемого предобусловливателя.
Кроме того, precs
должен обеспечивать диспетчеризацию:
Pl, Pr = precs(W, du, u, p, t, ::Nothing, ::Nothing, ::Nothing, solverdata)
которая используется на этапе настройки решателя для построения типа интегратора с предобусловливателями (Pl,Pr)
.
По умолчанию используется precs=DEFAULT_PRECS
, где функция предусловливателя по умолчанию определяется следующим образом:
DEFAULT_PRECS(W, du, u, p, t, newW, Plprev, Prprev, solverdata) = nothing, nothing
Нелинейные решатели: спецификация nlsolve
Все неявные решатели на основе Julia (OrdinaryDiffEq.jl, StochasticDiffEq.jl и др.) позволяют выбрать нелинейный решатель, который будет использоваться для обработки неявной системы. Несмотря на то, что решатели являются полностью изменяемыми и настраиваемыми, большинству пользователей следует придерживаться предопределенных вариантов нелинейных решателей. Они приведены ниже.
-
NLNewton(; κ=1//100, max_iter=10, fast_convergence_cutoff=1//5, new_W_dt_cutoff=1//5)
: квазиньютоновский метод. Используется по умолчанию. -
NLAnderson(; κ=1//100, max_iter=10, max_history::Int=5, aa_start::Int=1, droptol=nothing, fast_convergence_cutoff=1//5)
: ускорение Андерсона. Будучи более устойчивым, чем функциональная итерация, этот метод менее устойчив, чем метод Ньютона, но не требует использования якобиана. -
NLFunctional(; κ=1//100, max_iter=10, fast_convergence_cutoff=1//5)
: этот метод менее устойчив, чем метод Ньютона, но не требует использования якобиана. Его следует использовать только для нежестких уравнений ODE.