Sundials.jl
Это пакет-оболочка для импорта решателей из Sundials в интерфейс SciML. Обратите внимание, что эти решатели не поставляются по умолчанию, поэтому перед их использованием необходимо установить пакет:
using Pkg
Pkg.add("Sundials")
using Sundials
Эти методы могут использоваться независимо от остальной части DifferentialEquations.jl.
API решателей ODE
#
Sundials.CVODE_Adams
— Type
CVODE_Adams(;method=:Functional,linear_solver=:None,
jac_upper=0,jac_lower=0,
stored_upper = jac_upper + jac_lower,
krylov_dim=0,
stability_limit_detect=false,
max_hnil_warns = 10,
max_order = 12,
max_error_test_failures = 7,
max_nonlinear_iters = 3,
max_convergence_failures = 10,
prec = nothing, psetup = nothing, prec_side = 0)
CVODE_Adams: решатель Адамса-Мултона для CVode.
Варианты методов
-
method — это метод решения неявного уравнения. Для BDF используется заданный по умолчанию :Newton, а для Адамса — :Functional. Эти варианты соответствуют рекомендуемым парам в руководстве по Sundials.jl. Однако следует учитывать, что использование метода :Newton может занять меньше итераций, но требует больше памяти, чем подход с итерациями :Function.
-
linear_solver — это линейный решатель, используемый в методе :Newton.
Варианты линейных решателей
В качестве линейного решателя можно выбрать следующие.
-
:Dense — плотный линейный решатель.
-
:Band — решатель, специализированный для ленточных якобианов. Если используется, необходимо задать положение верхней и нижней ненулевых диагоналей с помощью jacupper и jaclower.
-
:LapackDense — версия плотного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Dense в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:LapackBand — версия ленточного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Band в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:Diagonal — это специализированный метод для диагональных якобианов.
-
:GMRES — метод GMRES. Рекомендуемый первый вариант метода Крылова.
-
:BCG — метод бисопряженных градиентов.
-
:PCG — метод сопряженных градиентов с предобусловливанием. Только для симметричных линейных систем.
-
:TFQMR — метод TFQMR.
-
:KLU — метод разреженной факторизации. Требуется, чтобы пользователь указал якобиан. Якобиан должен быть задан как разреженная матрица в типе ODEProblem.
Пример:
CVODE_Adams() # Метод Адамса с использованием решателя Newton + Dense
CVODE_Adams(method=:Functional) # Метод Адамса с использованием итераций Functional
CVODE_Adams(linear_solver=:Band,jac_upper=3,jac_lower=3) # Ленточный решатель с ненулевыми диагоналями: 3 верхних и 3 нижних
CVODE_Adams(linear_solver=:BCG) # Метод бисопряженных градиентов
Предобусловливатели
Обратите внимание, что здесь prec
— это функция предобусловливателя prec(z,r,p,t,y,fy,gamma,delta,lr)
, где:
-
z
: вычисленный выходной вектор -
r
: вектор правой части линейной системы -
p
: параметры -
t
: текущая независимая переменная -
du
: текущее значениеf(u,p,t)
-
gamma
:gamma
дляW = M - gamma*J
-
delta
: допуск итерационного метода -
lr
: флаг, указывающий на наличие предобусловливания слеваlr=1
или справаlr=2
psetup
— функция настройки предобусловливателя для предварительного вычисления информации о якобиане psetup(p, t, u, du, jok, jcurPtr, gamma)
. Где:
-
p
: параметры -
t
: текущая независимая переменная -
u
: текущее состояние -
du
: текущая функцияf(u,p,t)
-
jok
: логическое значение, указывающее, нужно ли обновлять якобиан -
jcurPtr
: ссылка на Int, указывающая, был ли обновлен якобиан.jcurPtr[]=true
должно быть задано, если якобиан был обновлен, аjcurPtr[]=false
должно быть задано, если якобиан не был обновлен. -
gamma
:gamma
дляW = M - gamma*J
psetup
является необязательным, если задан prec
.
Дополнительные параметры
См. руководство по CVODE со сведениями о дополнительных параметрах.
#
Sundials.CVODE_BDF
— Type
CVODE_BDF(;method=:Newton,linear_solver=:Dense,
jac_upper=0,jac_lower=0,
stored_upper = jac_upper + jac_lower,
non_zero=0,krylov_dim=0,
stability_limit_detect=false,
max_hnil_warns = 10,
max_order = 5,
max_error_test_failures = 7,
max_nonlinear_iters = 3,
max_convergence_failures = 10,
prec = nothing, prec_side = 0)
CVODE_BDF: решатель формулы обратного дифференцирования (BDF) для CVode.
Варианты методов
-
method — это метод решения неявного уравнения. Для BDF используется заданный по умолчанию :Newton, а для Адамса — :Functional. Эти варианты соответствуют рекомендуемым парам в руководстве по Sundials.jl. Однако следует учитывать, что использование метода :Newton может занять меньше итераций, но требует больше памяти, чем подход с итерациями :Function.
-
linear_solver — это линейный решатель, используемый в методе :Newton.
Варианты линейных решателей
В качестве линейного решателя можно выбрать следующие.
-
:Dense — плотный линейный решатель.
-
:Band — решатель, специализированный для ленточных якобианов. Если используется, необходимо задать положение верхней и нижней ненулевых диагоналей с помощью jacupper и jaclower.
-
:LapackDense — версия плотного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Dense в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:LapackBand — версия ленточного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Band в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:Diagonal — это специализированный метод для диагональных якобианов.
-
:GMRES — метод GMRES. Рекомендуемый первый вариант метода Крылова.
-
:BCG — метод бисопряженных градиентов.
-
:PCG — метод сопряженных градиентов с предобусловливанием. Только для симметричных линейных систем.
-
:TFQMR — метод TFQMR.
-
:KLU — метод разреженной факторизации. Требуется, чтобы пользователь указал якобиан. Якобиан должен быть задан как разреженная матрица в типе ODEProblem.
Пример:
CVODE_BDF() # Метод BDF с использованием решателя Newton + Dense
CVODE_BDF(method=:Functional) # Метод BDF с использованием итераций Functional
CVODE_BDF(linear_solver=:Band,jac_upper=3,jac_lower=3) # Ленточный решатель с ненулевыми диагоналями: 3 верхних и 3 нижних
CVODE_BDF(linear_solver=:BCG) # Метод бисопряженных градиентов
Предобусловливатели
Обратите внимание, что здесь prec
— это функция предобусловливателя prec(z,r,p,t,y,fy,gamma,delta,lr)
, где:
-
z
: вычисленный выходной вектор -
r
: вектор правой части линейной системы -
p
: параметры -
t
: текущая независимая переменная -
du
: текущее значениеf(u,p,t)
-
gamma
:gamma
дляW = M - gamma*J
-
delta
: допуск итерационного метода -
lr
: флаг, указывающий на наличие предобусловливания слеваlr=1
или справаlr=2
psetup
— функция настройки предобусловливателя для предварительного вычисления информации о якобиане psetup(p, t, u, du, jok, jcurPtr, gamma)
. Где:
-
p
: параметры -
t
: текущая независимая переменная -
u
: текущее состояние -
du
: текущая функцияf(u,p,t)
-
jok
: логическое значение, указывающее, нужно ли обновлять якобиан -
jcurPtr
: ссылка на Int, указывающая, был ли обновлен якобиан.jcurPtr[]=true
должно быть задано, если якобиан был обновлен, аjcurPtr[]=false
должно быть задано, если якобиан не был обновлен. -
gamma
:gamma
дляW = M - gamma*J
psetup
является необязательным, если задан prec
.
Дополнительные параметры
См. руководство по CVODE со сведениями о дополнительных параметрах.
#
Sundials.ARKODE
— Type
ARKODE(stiffness=Sundials.Implicit();
method=:Newton,linear_solver=:Dense,
jac_upper=0,jac_lower=0,stored_upper = jac_upper+jac_lower,
non_zero=0,krylov_dim=0,
max_hnil_warns = 10,
max_error_test_failures = 7,
max_nonlinear_iters = 3,
max_convergence_failures = 10,
predictor_method = 0,
nonlinear_convergence_coefficient = 0.1,
dense_order = 3,
order = 4,
set_optimal_params = false,
crdown = 0.3,
dgmax = 0.2,
rdiv = 2.3,
msbp = 20,
adaptivity_method = 0,
prec = nothing, psetup = nothing, prec_side = 0
)
ARKODE: явные и ESDIRK-методы Рунге-Кутты порядков 2—8 в зависимости от выбора параметров.
Варианты таблиц
Основными вариантами для ARKODE являются выбор между явным и неявным методом и порядок метода, задаваемый с помощью следующего.
ARKODE(Sundials.Explicit()) # Решение с помощью явного табличного метода 4-го порядка по умолчанию ARKODE(Sundials.Implicit(),order = 3) # Решение с помощью явного табличного метода 3-го порядка
Варианты порядка для явных методов — от 2 до 8, для неявных — от 3 до 5. Специфические методы также могут быть заданы с помощью параметров etable и itable для явных и неявных таблиц, соответственно. Доступны следующие таблицы.
etable:
-
HEUNEULER212: метод Гойна 2-го порядка
-
BOGACKISHAMPINE423:
-
ARK324L2SAERK423: явная часть метода Кеннеди и Карпентера 3-го порядка
-
ZONNEVELD53_4: явный метод 4-го порядка
-
ARK436L2SAERK634: явная часть метода Кеннеди и Карпентера 4-го порядка
-
SAYFYABURUB634: явный метод 4-го порядка
-
CASHKARP645: явный метод 5-го порядка
-
FEHLBERG64_5: классический метод Фельберга 5-го порядка
-
DORMANDPRINCE745: классический метод Дорманда-Принса 5-го порядка
-
ARK548L2SAERK845: явная часть метода Кеннеди и Карпентера 5-го порядка
-
VERNER85_6: классический метод Вернера 5-го порядка
-
FEHLBERG137_8: метод Фельберга 8-го порядка
itable:
-
SDIRK21_2: A-B-устойчивый метод SDIRK 2-го порядка
-
BILLINGTON33_2: метод 2-го с менее устойчивым прогнозом ошибки 3-го порядка
-
TRBDF233_2: классический метод TR-BDF2
-
KVAERNO42_3: L-устойчивый метод ESDIRK 3-го порядка
-
ARK324L2SADIRK423: неявная часть метода Кеннеди и Карпентера 3-го порядка
-
CASH52_4: L-устойчивый метод SDIRK Кэша 4-го порядка
-
CASH53_4: L-устойчивый метод SDIRK Кэша 2-го и 4-го порядка
-
SDIRK53_4: метод SDIRK Хайрера 4-го порядка
-
KVAERNO53_4: метод SDIRK Кваерно 4-го порядка
-
ARK436L2SADIRK634: явная часть метода Кеннеди и Карпентера 4-го порядка
-
KVAERNO74_5: метод ESDIRK Кваерно 5-го порядка
-
ARK548L2SADIRK845: явная часть метода Кеннеди и Карпентера 5-го порядка
Их можно задать, к примеру, следующим образом.
ARKODE(Sundials.Explicit(),etable = Sundials.DORMAND_PRINCE_7_4_5)
ARKODE(Sundials.Implicit(),itable = Sundials.KVAERNO_4_2_3)
Варианты методов
-
method — это метод решения неявного уравнения. Для BDF используется заданный по умолчанию :Newton, а для Адамса — :Functional. Эти варианты соответствуют рекомендуемым парам в руководстве по Sundials.jl. Однако следует учитывать, что использование метода :Newton может занять меньше итераций, но требует больше памяти, чем подход с итерациями :Function.
-
linear_solver — это линейный решатель, используемый в методе :Newton.
Варианты линейных решателей
В качестве линейного решателя можно выбрать следующие.
-
:Dense — плотный линейный решатель.
-
:Band — решатель, специализированный для ленточных якобианов. Если используется, необходимо задать положение верхней и нижней ненулевых диагоналей с помощью jacupper и jaclower.
-
:LapackDense — версия плотного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Dense в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:LapackBand — версия ленточного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Band в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:Diagonal — это специализированный метод для диагональных якобианов.
-
:GMRES — метод GMRES. Рекомендуемый первый вариант метода Крылова.
-
:BCG — метод бисопряженных градиентов.
-
:PCG — метод сопряженных градиентов с предобусловливанием. Только для симметричных линейных систем.
-
:TFQMR — метод TFQMR.
-
:KLU — метод разреженной факторизации. Требуется, чтобы пользователь указал якобиан. Якобиан должен быть задан как разреженная матрица в типе ODEProblem.
Предобусловливатели
Обратите внимание, что здесь prec
— это функция предобусловливателя prec(z,r,p,t,y,fy,gamma,delta,lr)
, где:
-
z
: вычисленный выходной вектор -
r
: вектор правой части линейной системы -
p
: параметры -
t
: текущая независимая переменная -
du
: текущее значениеf(u,p,t)
-
gamma
:gamma
дляW = M - gamma*J
-
delta
: допуск итерационного метода -
lr
: флаг, указывающий на наличие предобусловливания слеваlr=1
или справаlr=2
psetup
— функция настройки предобусловливателя для предварительного вычисления информации о якобиане psetup(p, t, u, du, jok, jcurPtr, gamma)
. Где:
-
p
: параметры -
t
: текущая независимая переменная -
u
: текущее состояние -
du
: текущая функцияf(u,p,t)
-
jok
: логическое значение, указывающее, нужно ли обновлять якобиан -
jcurPtr
: ссылка на Int, указывающая, был ли обновлен якобиан.jcurPtr[]=true
должно быть задано, если якобиан был обновлен, аjcurPtr[]=false
должно быть задано, если якобиан не был обновлен. -
gamma
:gamma
дляW = M - gamma*J
psetup
является необязательным, если задан prec
.
Дополнительные параметры
См. руководство по ARKODE со сведениями о дополнительных параметрах.
API решателей DAE
#
Sundials.IDA
— Type
IDA(;linear_solver=:Dense,jac_upper=0,jac_lower=0,krylov_dim=0,
max_order = 5,
max_error_test_failures = 7,
max_nonlinear_iters = 3,
nonlinear_convergence_coefficient = 0.33,
nonlinear_convergence_coefficient_ic = 0.0033,
max_num_steps_ic = 5,
max_num_jacs_ic = 4,
max_num_iters_ic = 10,
max_num_backs_ic = 100,
use_linesearch_ic = true,
max_convergence_failures = 10,
init_all = false,
prec = nothing, psetup = nothing)
IDA: метод IDA из пакета Sundials.
Линейные решатели
Обратите внимание, что конструкторы алгоритмов Sundials принимают главный аргумент: linearsolver — это линейный решатель, используемый в итерациях Ньютона. Доступны следующие варианты.
-
:Dense — плотный линейный решатель.
-
:Band — решатель, специализированный для ленточных якобианов. Если используется, необходимо задать положение верхней и нижней ненулевых диагоналей с помощью jacupper и jaclower.
-
:LapackDense — версия плотного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Dense в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:LapackBand — версия ленточного линейного решателя, использующая для многопоточных операций библиотеку LAPACK, доступную в Julia, на основе OpenBLAS. Он будет быстрее, чем :Band в больших системах, но связан с заметными издержками в малых (<100 ODE) системах.
-
:GMRES — метод GMRES. Рекомендуемый первый вариант метода Крылова.
-
:BCG — метод бисопряженных градиентов.
-
:PCG — метод сопряженных градиентов с предобусловливанием. Только для симметричных линейных систем.
-
:TFQMR — метод TFQMR.
-
:KLU — метод разреженной факторизации. Требуется, чтобы пользователь указал якобиан. Якобиан должен быть задан как разреженная матрица в типе ODEProblem.
Обратите внимание, что предобусловливатель для итерационных линейных решателей (если предоставлены) должен быть левым предобусловливателем.
Пример:
IDA() # Решатель Newton + Dense
IDA(linear_solver=:Band,jac_upper=3,jac_lower=3) # Ленточный решатель с ненулевыми диагоналями: 3 верхних и 3 нижних
IDA(linear_solver=:BCG) # Метод бисопряженных градиентов
Предобусловливатели
Обратите внимание, что здесь prec
— это функция (левого) предобусловливателя prec(z,r,p,t,y,fy,gamma,delta)
, где:
-
z
: вычисленный выходной вектор -
r
: вектор правой части линейной системы -
p
: параметры -
t
: текущая независимая переменная -
du
: текущее значениеf(u,p,t)
-
gamma
:gamma
дляW = M - gamma*J
-
delta
: допуск итерационного метода
psetup
— функция настройки предобусловливателя для предварительного вычисления информации о якобиане. Где:
-
p
: параметры -
t
: текущая независимая переменная -
resid
: текущая невязка -
u
: текущее состояние -
du
: текущая производная состояния -
gamma
:gamma
дляW = M - gamma*J
psetup
является необязательным, если задан prec
.
Дополнительные параметры
См. руководство по Sundials со сведениями о дополнительных параметрах. Параметр init_all
управляет процедурой согласования начальных условий. Если начальные условия не согласованы (т. е. они не удовлетворяют неявному уравнению), init_all=false
означает, что алгебраические переменные и производные будут изменены так, чтобы удовлетворять DAE. Если init_all=true
, все начальные условия будут изменены так, чтобы удовлетворять DAE.