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

Общие параметры решателей (именованные аргументы функции Solve)

# CommonSolve.solveMethod

solve(prob::DEProblem, alg::Union{DEAlgorithm,Nothing}; kwargs...)

Аргументы

Единственным позиционным аргументом является alg. Он необязателен. По умолчанию alg = nothing. Если alg = nothing, функция solve автоматически производит диспетчеризацию в метод автоматического выбора алгоритма DifferentialEquations.jl (если использовалась инструкция using DifferentialEquations; в противном случае происходит ошибка MethodError).

Именованные аргументы

В экосистеме DifferentialEquations.jl имеется множество общих аргументов для функции solve. Эти аргументы применимы к функции solve для любого вида задачи; ограничения на их использование могут налагаться лишь конкретными реализациями.

Многие значения по умолчанию зависят от алгоритма или пакета, от которого алгоритм унаследован. Не каждый алгоритм предоставляет весь интерфейс. Дополнительные сведения о значениях по умолчанию и параметрах, доступных для определенных алгоритмов или пакетов, см. на страницах руководства по решателям конкретных задач. Чтобы узнать, совместим ли определенный пакет с тем или иным параметром, см. таблицу совместимости решателей.

Подсказка в выборе алгоритма по умолчанию

Для более точного выбора алгоритма по умолчанию можно передать именованный аргумент alg_hints в функцию solve. alg_hints — это вектор Vector{Symbol}, описывающий задачу в общем виде для решателя. Возможные значения:

  • :auto, :nonstiff или :stiff — указывает, является ли уравнение жестким. Значение :auto позволяет алгоритму обработки по умолчанию выбирать алгоритмы определения жесткости. По умолчанию используется :auto.

Значения, которые не используются в настоящее время:

  • :interpolant — означает, что требуется интерполяция высокой точности.

  • :memorybound — означает, что решатель будет привязан к памяти.

Эта функциональная возможность основана на тестах в SciMLBenchmarks.jl.

Подсказки алгоритмов для СДУ

  • :additive — означает, что базовое СДУ имеет аддитивный шум.

  • :stratonovich — означает, что решение должно следовать интерпретации Стратоновича.

Управление выходными данными

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

С управлением выходными данными связаны следующие параметры. Примеры использования см. в разделе «Примеры» в конце этой страницы.

  • dense: указывает, следует ли сохранять дополнительные части, необходимые для плотных (непрерывных) выходных данных. По умолчанию для алгоритмов, которые могут выдавать плотные выходные данные, используются параметры save_everystep && isempty(saveat), поэтому данный параметр имеет значение true, если только пользователь не отключил сохранение результата на каждом шаге или не выбрал значение saveat. Если dense=false, решение по-прежнему действует как функция, а sol(t) является линейной интерполяцией между сохраненными временными точками.

  • saveat: указывает определенные моменты времени, в которые должен сохраняться результат, в течение этапа решения. Решатель будет сохранять результат в каждой временной точке, содержащейся в этом массиве, наиболее эффективным возможным способом. Если задан только параметр saveat, то аргументы save_everystep и dense по умолчанию имеют значение false. Если значением saveat является число, происходит автоматическое развертывание в tspan[1]:saveat:tspan[2]. Для методов, не предполагающих интерполяции, параметр saveat может быть эквивалентен tstops. Значение по умолчанию — [].

  • save_idxs: указывает индексы компонентов уравнения, которые необходимо сохранить. По умолчанию сохраняются все индексы. Например, если вы решаете трехмерное ОДУ и указываете save_idxs = [1, 3], будут выведены только первый и третий компоненты решения. Конечно же, в этом случае выводимое решение будет двухмерным.

  • tstops: указывает дополнительные моменты времени, в которые алгоритм дискретизации по времени должен производить заход. Это должно помочь решателю обрабатывать точки разрыва и особые точки, так как выполнение шагов в точках разрыва повышает точность. Если метод не допускает изменения временных шагов (многошаговый метод с фиксированными временными шагами), то tstops будет использовать интерполяцию, что соответствует поведению saveat. Если метод не допускает изменения временных шагов и интерполяции, значение tstops должно быть кратно dt, иначе произойдет ошибка. Значение по умолчанию — [].

  • d_discontinuities: указывает места точек разрыва в производных низкого порядка. При этом алгоритмы FSAL, которые предполагают непрерывность производной, будут принудительно перерассчитывать производные в точке разрыва. Значение по умолчанию — [].

  • save_everystep: сохраняет результат в каждом шаге. Значение по умолчанию — true, если isempty(saveat).

  • save_on: указывает, сохраняются ли промежуточные решения. Переопределяет параметры dense, saveat и save_everystep и используется некоторыми приложениями для временного отключения сохранения вручную. При повседневном использовании решателей этот параметр не должен меняться. Значение по умолчанию — true.

  • save_start: указывает, должно ли начальное условие включаться в тип решения в качестве первой временной точки. Значение по умолчанию — true.

  • save_end: указывает, должна ли принудительно сохраняться конечная временная точка независимо от других настроек сохранения. Значение по умолчанию — true.

  • initialize_save: указывает, необходимо ли выполнять сохранение после этапа инициализации обратного вызова (когда u_modified=true). Значение по умолчанию — true.

Обратите внимание, что для параметра dense требуются save_everystep=true и saveat=false. Если требуется сохранять дополнительные результаты при плотных выходных данных, см. SavingCallback в библиотеке обратных вызовов.

Управление размером шага

Эти аргументы управляют подпрограммами дискретизации по времени.

Базовое управление размером шага

Ниже перечислены стандартные параметры для управления дискретизацией. Для оценки погрешности производится сравнение

Масштабная погрешность всегда будет <1 для данной локальной расчетной погрешности (обратите внимание: расчетные погрешности являются локальными, если метод не предполагает иного). Параметр abstol определяет погрешность без масштабирования и поэтому может рассматриваться как погрешность в окрестности нуля. reltol масштабируется с размером зависимых переменных, поэтому при reltol=1e-3 результат можно интерпретировать как примерно верный (локально) до трех знаков. Обратите внимание, что погрешности можно задать поэлементно, передав вектор того же размера, что и u0.

  • adaptive: включает адаптивную дискретизацию по времени для соответствующих методов. Значение по умолчанию — true.

  • abstol: абсолютная погрешность при адаптивной дискретизации по времени. Это погрешность при локальной оценке, которая не обязательно является глобальной (хотя эти величины связаны). Значение по умолчанию — 1e-6 для детерминированных уравнений (ОДУ, ДРУ, ДАУ) и 1e-2 для стохастических уравнений (СДУ, СОДУ).

  • reltol: относительная погрешность при адаптивной дискретизации по времени. Это погрешность при локальной оценке, которая не обязательно является глобальной (хотя эти величины связаны). Значение по умолчанию — 1e-3 для детерминированных уравнений (ОДУ, ДРУ, ДАУ) и 1e-2 для стохастических уравнений (СДУ, СОДУ).

  • dt: задает начальный размер шага. Служит также размером шага для методов с фиксированным временным шагом. Если метод адаптивный, по умолчанию размер выбирается автоматически.

  • dtmax: максимальное значение dt для адаптивной дискретизации по времени. Значения по умолчанию зависят от пакета.

  • dtmin: минимальное значение dt для адаптивной дискретизации по времени. Значения по умолчанию зависят от пакета.

  • force_dtmin: указывает, следует ли продолжать выполнение с принудительным использованием минимального значения dt. Значение по умолчанию — false. При нем решатель выдает предупреждение и досрочно завершает выполнение, если достигается минимальное значение dt. Если задано значение true, решатель будет продолжать выполнение так, что dt всегда будет больше dtmin (погрешности при этом игнорируются). Обратите внимание, что значение true несовместимо с большинством пакетов взаимодействия.

Использование фиксированного размера шага

Обратите внимание, что если метод не обладает адаптивностью, действуют следующие правила.

  • Если задан параметр dt, на каждой итерации алгоритм будет производить шаг с размером dt.

  • Если заданы параметры tstops и dt, алгоритм будет производить шаг либо с размером dt, либо с меньшим размером для попадания в точку tstops.

  • Если задан параметр tstops, но не dt, алгоритм будет производить заходы непосредственно в каждое значение в tstops.

  • Если параметры dt и tstops не заданы, решатель выдаст ошибку.

Эти аргументы управляют более сложными внутренними механизмами адаптивной дискретизации по времени и применяются в первую очередь для повышения их эффективности при решении определенных задач. Подробное объяснение алгоритмов дискретизации по времени см. на этой странице.

  • internalnorm: функция нормы internalnorm(u,t), с помощью которой вычисляются расчетные погрешности. Требуются два метода диспетчеризации: один для переменной состояния, а другой для ее элементов (скалярная норма). Значения по умолчанию зависят от пакета.

  • controller: примерами являются IController, PIController, PIDController, PredictiveController. Значение по умолчанию зависит от алгоритма.

  • gamma: показатель риска γ в уравнении q для адаптивной дискретизации по времени использующих ее контроллеров. Значение по умолчанию зависит от алгоритма.

  • beta1: параметр α стабилизации Лунда. Значение по умолчанию зависит от алгоритма.

  • beta2: параметр β стабилизации Лунда. Значение по умолчанию зависит от алгоритма.

  • qmax: определяет максимальное возможное значение для адаптивного уравнения q. Значение по умолчанию зависит от алгоритма.

  • qmin: определяет минимальное возможное значение для адаптивного уравнения q. Значение по умолчанию зависит от алгоритма.

  • qsteady_min: определяет минимальный диапазон в окрестности 1, в котором временной шаг остается постоянным. Значение по умолчанию зависит от алгоритма.

  • qsteady_max: определяет максимальный диапазон в окрестности 1, в котором временной шаг остается постоянным. Значение по умолчанию зависит от алгоритма.

  • qoldinit: начальное значение qold при стабилизационной дискретизации. Значение по умолчанию зависит от алгоритма.

  • failfactor: величина, на которую следует уменьшить временной шаг, если не удается выполнить итерации по методу Ньютона в рамках неявного метода. Значение по умолчанию — 2.

Оптимизация памяти

  • calck: включает или отключает внутреннюю возможность выполнения промежуточных интерполяций (также называется внутренней плотностью). Отличается от параметра dense, который отвечает за интерполяцию после решения. Значение по умолчанию — dense || !isempty(saveat) || "no custom callback is given". Позволяет отключать интерполяции (с целью экономии памяти), если они не применяются при использовании настраиваемого обратного вызова. Еще один вариант применения — включение использования интерполяций в интерфейсе интегратора, даже если они больше нигде не используются. Обратите внимание, что делать это требуется только в том случае, если алгоритм не предусматривает свободной или отложенной интерполяции (DP8()). Если calck = false, параметр saveat использовать нельзя. Для обработки событий может быть полезен нечасто используемый именованный аргумент calck.

  • alias_u0: позволяет решателю смешивать массив начальных условий, содержащийся в структуре задачи. Значение по умолчанию — false.

Прочее

  • maxiters: максимальное число итераций перед остановкой. Значение по умолчанию — 1e5.

  • callback: задает обратный вызов. По умолчанию используется функция обратного вызова, которая выполняет подпрограмму сохранения. Дополнительные сведения см. на странице руководства, посвященной обработке событий и функциям обратного вызова.

  • isoutofdomain: задает функцию isoutofdomain(u,p,t), которая при возврате значения true отклоняет временной шаг. По умолчанию отключено.

  • unstable_check: задает функцию unstable_check(dt,u,p,t), при возврате значения true которой решатель завершает работу и выдает предупреждение. Значение по умолчанию — any(isnan,u), то есть на равенство NaN проверяется любое значение.

  • verbose: определяет, выдаются ли предупреждения при досрочном завершении работы решателя. Значение по умолчанию — true.

  • merge_callbacks: определяет, следует ли объединять prob.callback с именованным аргументом callback функции solve. Значение по умолчанию — true.

  • wrap: определяет, следует ли заключать решение в оболочку, если у prob.problem_type есть предпочтительная альтернативная тип-оболочка для решения. Этот параметр полезен, когда важна скорость получения, а не форма решения. Значение по умолчанию — Val(true). Val(false) отменяет заключение решения в оболочку.

Мониторинг хода выполнения

Эти аргументы определяют то, как используется индикатор хода выполнения в IDE Juno.

  • progress: включает или отключает индикатор хода выполнения Juno. Значение по умолчанию — false.

  • progress_steps: количество шагов между обновлениями индикатора хода выполнения. Значение по умолчанию — 1000.

  • progress_name: определяет имя индикатора хода выполнения. Значение по умолчанию — название вида задачи.

  • progress_message: определяет сообщение в индикаторе хода выполнения. По умолчанию отображаются значения dt, t и максимальное значение u.

Расчет погрешностей

Если вы используете тестовые задачи (например, ODETestProblem), то следующие параметры определяют вычисляемые погрешности.

  • timeseries_errors: включает или отключает вычисление погрешностей на выполненных шагах, например погрешность l2. Значение по умолчанию — true.

  • dense_errors: включает или отключает вычисление погрешностей на шагах, которые требуют плотных выходных данных и предполагают вычисление погрешности в 100 равномерно распределенных точках в пределах tspan. Примером является погрешность L2. Значение по умолчанию — false.

Алгоритмы чувствительности (sensealg)

sensealg служит для выбора способа автоматического дифференцирования. Дополнительные сведения см. в документации по SciMLSensitivity: https://docs.sciml.ai/SciMLSensitivity/stable/

Примеры

Ниже представлены примеры использования конфигурации solve(). В этих примерах предполагается трехмерная задача ОДУ, однако они легко переносятся и на другие виды задач.

  1. solve(prob, AlgorithmName()): настройка «по умолчанию» с заданным пользователем

алгоритмом (указанным с помощью AlgorithmName()). Все параметры принимают значения по умолчанию. Это означает, что решение сохраняется на шагах, на которых останавливается алгоритм, и включены плотные выходные данные, если выбранный алгоритм допускает их.

Остальные параметры интегрирования (например, размер шага) выбираются автоматически.

  1. solve(prob, saveat = 0.01, abstol = 1e-9, reltol = 1e-9): стандартная настройка

для получения точных выходных данных через заданные (одинаковые) интервалы времени; применяется, например, для преобразования Фурье. Решение выдается каждую 0,01 единицы времени начиная с tspan[1]. Используется решатель Tsit5(), поэтому именованный аргумент alg_hits не указывается.

  1. solve(prob, maxiters = 1e7, progress = true, save_idxs = [1]): Использование большего

максимального числа итераций решателя может быть полезно, когда указанный интервал tspan очень длительный. В этом примере сохраняется только первая из переменных системы либо потому, что нужно сохранить размер, либо потому, что остальные пользователя не интересуют. Наконец, с помощью progress = true включается индикатор хода выполнения.