Задание (не)линейных решателей и предобусловливателей
Одной из ключевых особенностей пакета 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.