Документация Engee

Задание (не)линейных решателей и предобусловливателей

Одной из ключевых особенностей пакета DifferentialEquations.jl является его гибкость. В соответствии с этой тенденцией многие из собственных решателей Julia, предоставляемых в DifferentialEquations.jl, позволяют выбирать метод для линейного и нелинейного решения. Здесь подробно описывается, как сделать такой выбор.

Настоятельно рекомендуется изучить руководство Решение больших жестких уравнений, в котором эти варианты рассматриваются на реальном примере.

Они неприменимы к решателям дифференциальных уравнений Sundials (CVODE_BDF, CVODE_Adams, ARKODE и IDA). Полное описание аналогичной функциональности для Sundials приведено в документации по решателям ODE Sundials и документации по решателям DAE 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.