Задачи с неавтономными линейными ODE или лиевыми группами
Математическая спецификация неавтономного линейного ODE
Эти алгоритмы требуют неавтономного линейного ODE следующего вида:
Здесь — это AbstractDiffEqOperator, умножаемый на . Многие алгоритмы специализируют форму , например, может быть константой либо может быть только зависимой от времени функцией ( ).
Построение
Неавтономное линейное ODE создается так же, как ODEProblem
, за тем исключением, что функция f
представлена объектом AbstractDiffEqOperator
(обратите внимание: это означает, что к задачам, записанным в таком виде, можно также применить любой стандартный решатель ODE). Пример:
function update_func(A, u, p, t)
A[1, 1] = cos(t)
A[2, 1] = sin(t)
A[1, 2] = -sin(t)
A[2, 2] = cos(t)
end
A = DiffEqArrayOperator(ones(2, 2), update_func = update_func)
prob = ODEProblem(A, ones(2), (10, 50.0))
определяет квазилинейное ODE , где компоненты — это заданные функции. Исходя из такой формулировки, получается, что общая форма имеет вид , например:
function update_func(A, u, p, t)
A[1, 1] = 0
A[2, 1] = 1
A[1, 2] = -2 * (1 - cos(u[2]) - u[2] * sin(u[2]))
A[2, 2] = 0
end
имеет зависимый от состояния линейный оператор. Обратите внимание, что можно использовать и множество других AbstractDiffEqOperator
; DiffEqArrayOperator
— это лишь один из вариантов, представляющий A
в виде матрицы (другие варианты не предусматривают матриц).
Имейте в виду, что если — константа, достаточно предоставить напрямую без update_func
.
Примечание об афинных уравнениях
Обратите внимание, что аффинное уравнение
можно записать в линейном виде, увеличив размер системы на единицу, чтобы получить свободный член, равный 1. Для этого в A
добавляется новая строка, содержащая одни нули, и этому новому состоянию присваивается начальное значение 1. Затем в A
добавляется новый столбец, содержащий значения g(u,p,t)
. Таким образом, уравнения подобных типов можно обрабатывать с помощью данных специализированных интеграторов.