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

Sundials.jl

Это пакет-оболочка для импорта решателей из Sundials в интерфейс SciML. Обратите внимание, что эти решатели не поставляются по умолчанию, поэтому перед их использованием необходимо установить пакет:

using Pkg
Pkg.add("Sundials")
using Sundials

Эти методы могут использоваться независимо от остальной части DifferentialEquations.jl.

API решателей ODE

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 со сведениями о дополнительных параметрах.

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 со сведениями о дополнительных параметрах.

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

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.