Spec-Zone.ru › Octave 5

24.1.1 Matlab-совместимые решатели

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

  • odeset
  • odeget

В настоящее время реализованы следующие решатели:

  • Методы Рунге-Кутты
    • ode23 интегрирует систему нежестких обыкновенных дифференциальных уравнений (ОДУ) или дифференциально-алгебраических уравнений (ДАУ) индекса 1. Он использует метод Богацки-Шампина третьего порядка и адаптирует локальный шаг, чтобы удовлетворить заданной пользователем толерантности. Решатель требует трёх вычислений функции на каждом шаге интегрирования.
    • ode45 интегрирует систему нежестких ОДУ (или ДАУ индекса 1) с помощью метода Дорманда-Принса переменного шага и высокого порядка. Он требует шести вычислений функции на каждом шаге интегрирования, но может делать большие шаги при гладких задачах, чем ode23: потенциально обеспечивая улучшенную эффективность при меньших толерантности.
  • Многошаговые методы
    • ode15s интегрирует систему жёстких ОДУ (или ДАУ индекса 1) с помощью метода переменного шага и переменного порядка, основанного на формулах обратного различия (BDF).
    • ode15i интегрирует систему полностью неявных ОДУ (или ДАУ индекса 1) с использованием того же метода переменного шага и переменного порядка, что и ode15s. Функция decic может использоваться для вычисления согласованных начальных условий.
[t, y] = ode45 (fun, trange, init)
[t, y] = ode45 (fun, trange, init, ode_opt)
[t, y, te, ye, ie] = ode45 (…)
solution = ode45 (…)
ode45 (…)

Решает систему нежестких обыкновенных дифференциальных уравнений (нежестких ОДУ) с помощью известного явного метода Дорманда-Принса порядка 4.

fun — это указатель на функцию, встроенная функция или строка, содержащая имя функции, которая определяет ОДУ: y' = f(t,y). Функция должна принимать два входных значения, где первое — время t, а второе — столбец неизвестных y.

trange определяет временной интервал, на котором будет вычисляться ОДУ. Обычно это вектор из двух элементов, определяющий начальное и конечное время ([tinit, tfinal]). Если элементов больше двух, решение также будет вычислено в этих промежуточных моментах времени.

По умолчанию, ode45 использует адаптивный шаг времени с алгоритмом integrate_adaptive. Допуск для вычисления шага времени может быть изменён с помощью параметров "RelTol" и "AbsTol".

init содержит начальное значение для неизвестных. Если это строка, то решение y будет матрицей, в которой каждый столбец является решением для соответствующего начального значения в init.

Необязательный четвёртый аргумент ode_opt задаёт параметры решателя ОДУ, отличные от стандартных. Это структура, созданная с помощью odeset.

Функция обычно возвращает два результата. Переменная t — это столбец, содержащий моменты времени, где было найдено решение. Выход y — это матрица, в которой каждый столбец относится к разным неизвестным задачи, а каждая строка соответствует времени в t.

Результат также может быть возвращён как структура solution, которая имеет поле x содержащее строку времени, где было вычислено решение и поле y содержащее матрицу решения, таким образом, каждый столбец соответствует времени в x. Используйте fieldnames (solution) для просмотра других полей и дополнительной информации, возвращаемой функцией.

Если не запрошены аргументы вывода, и не задан OutputFcn в ode_opt, то OutputFcn устанавливается на odeplot, и результаты решателя отображаются сразу.

Если используется параметр "Events", то могут быть возвращены три дополнительных результата. te содержит время, когда функция Event вернула ноль. ye содержит значение решения в момент времени te. ie содержит индекс, указывающий, какая функция Event была активирована в случае нескольких функций Event.

Пример: Решение уравнения Ван дер Поля

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
[t,y] = ode45 (fvdp, [0, 20], [2, 0]);

См. также: odeset, odeget, ode23, ode15s.

[t, y] = ode23 (fun, trange, init)
[t, y] = ode23 (fun, trange, init, ode_opt)
[t, y, te, ye, ie] = ode23 (…)
solution = ode23 (…)
ode23 (…)

Решает систему нежестких обыкновенных дифференциальных уравнений (нежестких ОДУ) с помощью известного явного метода Богацки-Шампина третьего порядка.

fun — это указатель на функцию, встроенная функция или строка, содержащая имя функции, которая определяет ОДУ: y' = f(t,y). Функция должна принимать два входных значения, где первое — время t, а второе — столбец неизвестных y.

trange определяет временной интервал, на котором будет вычисляться ОДУ. Обычно это вектор из двух элементов, определяющий начальное и конечное время ([tinit, tfinal]). Если элементов больше двух, решение также будет вычислено в этих промежуточных моментах времени.

По умолчанию, ode23 использует адаптивный шаг времени с алгоритмом integrate_adaptive. Допуск для вычисления шага времени может быть изменён с помощью параметров "RelTol" и "AbsTol".

init содержит начальное значение для неизвестных. Если это строка, то решение y будет матрицей, в которой каждый столбец является решением для соответствующего начального значения в init.

Необязательный четвёртый аргумент ode_opt задаёт параметры решателя ОДУ, отличные от стандартных. Это структура, созданная с помощью odeset.

Функция обычно возвращает два результата. Переменная t — это столбец, содержащий моменты времени, где было найдено решение. Выход y — это матрица, в которой каждый столбец относится к разным неизвестным задачи, а каждая строка соответствует времени в t.

Результат также может быть возвращён как структура solution, которая имеет поле x содержащее строку времени, где было вычислено решение и поле y содержащее матрицу решения, таким образом, каждый столбец соответствует времени в x. Используйте fieldnames (solution) для просмотра других полей и дополнительной информации, возвращаемой функцией.

Если не запрошены аргументы вывода, и не задан OutputFcn в ode_opt, то OutputFcn устанавливается на odeplot, и результаты решателя отображаются сразу.

Если используется параметр "Events", то могут быть возвращены три дополнительных результата. te содержит время, когда функция Event вернула ноль. ye содержит значение решения в момент времени te. ie содержит индекс, указывающий, какая функция Event была активирована в случае нескольких функций Event.

Пример: Решение уравнения Ван дер Поля

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
[t,y] = ode23 (fvdp, [0, 20], [2, 0]);

Ссылка: Для определения этого метода см. https://en.wikipedia.org/wiki/List_of_Runge%E2%80%93Kutta_methods.

См. также: odeset, odeget, ode45, ode15s.

[t, y] = ode15s (fun, trange, y0)
[t, y] = ode15s (fun, trange, y0, ode_opt)
[t, y, te, ye, ie] = ode15s (…)
solution = ode15s (…)
ode15s (…)

Решает систему жёстких обыкновенных дифференциальных уравнений (ОДУ) или жёстких полуявных ДАУ индекса 1.

ode15s использует метод BDF (формулы обратного различия) переменного шага и порядка, который варьируется от 1 до 5.

fun — это указатель на функцию, встроенная функция или строка, содержащая имя функции, которая определяет ОДУ: y' = f(t,y). Функция должна принимать два входных значения, где первое — время t, а второе — столбец неизвестных y.

trange определяет временной интервал, на котором будет вычисляться ОДУ. Обычно это вектор из двух элементов, определяющий начальное и конечное время ([tinit, tfinal]). Если элементов больше двух, решение также будет вычислено в этих промежуточных моментах времени.

init содержит начальное значение для неизвестных. Если это строка, то решение y будет матрицей, в которой каждый столбец является решением для соответствующего начального значения в init.

Необязательный четвёртый аргумент ode_opt задаёт параметры решателя ОДУ, отличные от стандартных. Это структура, созданная с помощью odeset.

Функция обычно возвращает два результата. Переменная t — это столбец, содержащий моменты времени, где было найдено решение. Выход y — это матрица, в которой каждый столбец относится к разным неизвестным задачи, а каждая строка соответствует времени в t.

Результат также может быть возвращён как структура solution, которая имеет поле x содержащее строку времени, где было вычислено решение и поле y содержащее матрицу решения, таким образом, каждый столбец соответствует времени в x. Используйте fieldnames (solution) для просмотра других полей и дополнительной информации, возвращаемой функцией.

Если не запрошены аргументы вывода, и не задан OutputFcn в ode_opt, то OutputFcn устанавливается на odeplot, и результаты решателя отображаются сразу.

Если используется параметр "Events", то могут быть возвращены три дополнительных результата. te содержит время, когда функция Event вернула ноль. ye содержит значение решения в момент времени te. ie содержит индекс, указывающий, какая функция Event была активирована в случае нескольких функций Event.

Пример: Решение уравнений Робертсона:

function r = robertson_dae (t, y)
  r = [ -0.04*y(1) + 1e4*y(2)*y(3)
         0.04*y(1) - 1e4*y(2)*y(3) - 3e7*y(2)^2
y(1) + y(2) + y(3) - 1 ];
endfunction
opt = odeset ("Mass", [1 0 0; 0 1 0; 0 0 0], "MStateDependence", "none");
[t,y] = ode15s (@robertson_dae, [0, 1e3], [1; 0; 0], opt);

См. также: decic, odeset, odeget, ode23, ode45.

[t, y] = ode15i (fun, trange, y0, yp0)
[t, y] = ode15i (fun, trange, y0, yp0, ode_opt)
[t, y, te, ye, ie] = ode15i (…)
solution = ode15i (…)
ode15i (…)

Решить систему полностью неявных обыкновенных дифференциальных уравнений (ОДУ) или дифференциальных алгебраических уравнений (ДАУ) первого порядка.

ode15i использует метод переменного шага и переменного порядка BDF (обратная формула конечных разностей), который изменяется от порядка 1 до 5.

Функция fun — это дескриптор функции, встроенная функция или строка, содержащая имя функции, определяющей ОДУ: 0 = f(t,y,yp). Функция должна принимать три входных значения, где первое — время t, второе — значение функции y (вектор-столбец), а третье — значение производной yp (вектор-столбец).

trange задаёт временной интервал, на котором будет вычисляться ОДУ. Обычно это вектор из двух элементов, определяющих начальное и конечное время ([tinit, tfinal]). Если элементов больше двух, то решение также будет вычисляться в эти промежуточные временные моменты.

y0 и yp0 содержат начальные значения для неизвестных y и yp. Если они являются векторами-строками, то решение y будет матрицей, в которой каждый столбец является решением для соответствующего начального значения в y0 и yp0.

y0 и yp0 должны быть согласованными начальными условиями, что означает, что f(t,y0,yp0) = 0 выполняется. Функция decic может использоваться для вычисления согласованных начальных условий, исходя из начальных приближений.

Необязательный пятый аргумент ode_opt задаёт нестандартные параметры решателя ОДУ. Он представляет собой структуру, сгенерированную с помощью odeset.

Функция обычно возвращает два результата. Переменная t — это вектор-столбец, содержащий моменты времени, где было найдено решение. Результат y — это матрица, в которой каждый столбец относится к разным неизвестным задачи, а каждая строка соответствует времени в t.

Результат также может быть возвращен как структура solution, которая имеет поле x, содержащее вектор-строку моментов времени, где было вычислено решение, и поле y, содержащее матрицу решения, при этом каждый столбец соответствует времени в x. Используйте fieldnames (solution) для просмотра других полей и дополнительной информации, возвращаемой функцией.

Если аргументы вывода не запрашиваются, и OutputFcn не указано в ode_opt, то OutputFcn устанавливается в odeplot, и результаты решателя отображаются немедленно.

Если используется параметр "Events", то могут быть возвращены три дополнительных результата. te содержит время, когда функция события вернула ноль. ye содержит значение решения в момент времени te. ie содержит индекс, указывающий на то, какая функция события была сработана в случае нескольких функций событий.

Пример: Решить уравнения Робертсона:

function r = robertson_dae (t, y, yp)
  r = [ -(yp(1) + 0.04*y(1) - 1e4*y(2)*y(3))
        -(yp(2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2)
y(1) + y(2) + y(3) - 1 ];
endfunction
[t,y] = ode15i (@robertson_dae, [0, 1e3], [1; 0; 0], [-1e-4; 1e-4; 0]);

См. также: decic, odeset, odeget.

[y0_new, yp0_new] = decic (fun, t0, y0, fixed_y0, yp0, fixed_yp0)
[y0_new, yp0_new] = decic (fun, t0, y0, fixed_y0, yp0, fixed_yp0, options)
[y0_new, yp0_new, resnorm] = decic (…)

Вычислить согласованные начальные условия неявного ОДУ y0_new и yp0_new исходя из начальных приближений y0 и yp0.

Максимум length (y0) компонент между fixed_y0 и fixed_yp0 может быть выбран в качестве фиксированных значений.

fun — это дескриптор функции. Функция должна принимать три входных значения: первое — время t, второе — вектор-столбец неизвестных y, третье — вектор-столбец неизвестных yp.

t0 — начальное время такое, что fun(t0, y0_new, yp0_new) = 0, заданное как скаляр.

y0 — вектор, используемый в качестве начального приближения для y.

fixed_y0 — вектор, который определяет компоненты y0 для фиксации. Выберите максимум length (y0) компонент между fixed_y0 и fixed_yp0 в качестве фиксированных значений. Установите компонент fixed_y0(i) в 1, если хотите зафиксировать значение y0(i). Установите компонент fixed_y0(i) в 0, если хотите разрешить изменение значения y0(i).

yp0 — вектор, используемый в качестве начального приближения для yp.

fixed_yp0 — вектор, который определяет компоненты yp0 для фиксации. Выберите максимум length (yp0) компонент между fixed_y0 и fixed_yp0 в качестве фиксированных значений. Установите компонент fixed_yp0(i) в 1, если хотите зафиксировать значение yp0(i). Установите компонент fixed_yp0(i) в 0, если хотите разрешить изменение значения yp0(i).

Необязательный седьмой аргумент options представляет собой массив структур. Используйте odeset для генерации этой структуры. Релевантными параметрами являются RelTol и AbsTol, которые определяют пороги погрешности, используемые для вычисления начальных условий.

Функция обычно возвращает два результата. Переменная y0_new — это вектор-столбец, содержащий согласованное начальное значение y. Результат yp0_new — это вектор-столбец, содержащий согласованное начальное значение yp.

Необязательный третий результат resnorm — это норма вектора остатков. Если resnorm мало, то decic успешно вычислил начальные условия. Если значение resnorm велико, используйте RelTol и AbsTol, чтобы скорректировать его.

Пример: Вычислить начальные условия для уравнений Робертсона:

function r = robertson_dae (t, y, yp)
  r = [ -(yp(1) + 0.04*y(1) - 1e4*y(2)*y(3))
        -(yp(2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2)
y(1) + y(2) + y(3) - 1 ];
endfunction
[y0_new,yp0_new] = decic (@robertson_dae, 0, [1; 0; 0], [1; 1; 0],
[-1e-4; 1; 0], [0; 0; 0]);

См. также: ode15i, odeset.

odestruct = odeset ()
odestruct = odeset ("field1", value1, "field2", value2, …)
odestruct = odeset (oldstruct, "field1", value1, "field2", value2, …)
odestruct = odeset (oldstruct, newstruct)
odeset ()

Создание или изменение структуры опций ODE.

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

При вызове с парами входных аргументов «имя-значение» "field1", "value1", "field2", "value2", … возвращает новую структуру опций ODE со всеми наиболее распространенными полями опций, инициализированными, и устанавливает значения полей "field1", "field2", … в значения value1, value2, ….

При вызове со структурой ввода oldstruct перезаписывает значения опций "field1", "field2", … новыми значениями value1, value2, … и возвращает измененную структуру.

При вызове с двумя входными структурами опций ODE oldstruct и newstruct перезаписывает все значения из структуры oldstruct новыми значениями из структуры newstruct. Пустые значения в newstruct не будут перезаписывать значения в oldstruct.

Наиболее часто используемые опции ODE, которым всегда присваивается значение odeset, следующие:

AbsTol: положительное скалярное | векторное значение, по умолчанию 1e-6

Допустимая абсолютная погрешность.

BDF: {"off"} | "on"

Использовать формулы BDF в неявных методах многошаговой итерации. Примечание: эта опция пока не реализована.

Events: function_handle

Функция события. Функция события должна иметь вид [value, isterminal, direction] = my_events_f (t, y)

InitialSlope: вектор

Согласованный начальный вектор наклона для решателей DAE.

InitialStep: положительное скалярное значение

Начальный размер шага по времени.

Jacobian: матрица | function_handle

Матрица Якоби, заданная как постоянная матрица или как функция времени и состояния.

JConstant: {"off"} | "on"

Указывает, является ли матрица Якоби постоянной матрицей или зависит от состояния.

JPattern: разреженная матрица

Если матрица Якоби разреженная и не постоянная, но сохраняет постоянную структуру разреженности, укажите структуру разреженности.

Mass: матрица | function_handle

Матрица масс, заданная как постоянная матрица или как функция времени и состояния.

MassSingular: {"maybe"} | "yes" | "on"

Укажите, является ли матрица масс вырожденной.

MaxOrder: {5} | 4 | 3 | 2 | 1

Максимальный порядок формулы.

MaxStep: положительное скалярное значение

Максимальное значение шага по времени.

MStateDependence: {"weak"} | "none" | "strong"

Укажите, зависит ли матрица масс от состояния или только от времени.

MvPattern: разреженная матрица

Если матрица масс разреженная и не постоянная, но сохраняет постоянную структуру разреженности, укажите структуру разреженности. Примечание: эта опция пока не реализована.

NonNegative: скаляр | вектор

Укажите элементы вектора состояния, которые ожидается сохранить неотрицательными во время моделирования.

NormControl: {"off"} | "on"

Управление относительной погрешностью по отношению к 2-норме решения, а не к ее абсолютному значению.

OutputFcn: function_handle

Функция мониторинга состояния во время моделирования. Для формы функции см. odeplot.

OutputSel: скаляр | вектор

Индексы элементов вектора состояния, которые необходимо передать в функцию мониторинга вывода.

Refine: положительное скалярное значение

Укажите, должен ли вывод возвращаться только в конце каждого шага по времени или также в промежуточные моменты времени. Значение должно быть скаляром, указывающим количество равномерно распределенных временных точек внутри каждого шага по времени, в которых необходимо возвращать вывод. Примечание: эта опция пока не реализована.

RelTol: положительное скалярное значение

Относительная допустимая погрешность.

Stats: {"off"} | "on"

Печать статистики решателя после моделирования.

Vectorized: {"off"} | "on"

Укажите, может ли odefun принимать несколько значений состояния одновременно.

Имена полей, которые не указаны в списке выше, также принимаются и добавляются в результирующую структуру.

См. также: odeget.

val = odeget (ode_opt, field)
val = odeget (ode_opt, field, default)

Получение значения свойства field в структуре опций ODE ode_opt.

Если вызывается с двумя входными аргументами и первый входной аргумент ode_opt является структурой опций ODE, а второй входной аргумент field — строка, определяющая имя опции, то возвращается значение опции val, соответствующее field из ode_opt.

Если вызывается с необязательным третьим входным аргументом, и field не задано в структуре ode_opt, то возвращается значение по умолчанию default вместо него.

См. также: odeset.

stop_solve = odeplot (t, y, flag)

Открывает новое окно фигуры и строит решение задачи ode на каждом шаге по времени во время интегрирования.

Типы и значения входных параметров t и y зависят от входного значения flag, которое является строкой. Допустимые значения flag:

"init"

Входной t должен быть столбцом длиной 2 с начальным и конечным шагом по времени ([tfirst tlast]. Входной y содержит начальные условия для задачи ode (y0).

""

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

"done"

Входы должны быть пустыми, но игнорируются, если присутствуют.

odeplot всегда возвращает false, т.е. не останавливает решатель ode.

Пример: решение анонимной реализации уравнения "Van der Pol" и отображение результатов во время решения.

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];

opt = odeset ("OutputFcn", @odeplot, "RelTol", 1e-6);
sol = ode45 (fvdp, [0 20], [2 0], opt);

Справочная информация: Эта функция вызывается функцией решателя ode, если она была указана в свойстве "OutputFcn" структуры опций, созданной с помощью odeset. Решатель ode сначала вызовет функцию с синтаксисом odeplot ([tfirst, tlast], y0, "init"). Функция инициализирует внутренние переменные, создаёт новое окно фигуры и устанавливает пределы оси x графика. Затем, на каждом шаге по времени во время интегрирования, решатель ode вызывает odeplot (t, y, []). В конце решения решатель ode вызывает odeplot ([], [], "done"), чтобы odeplot мог выполнить необходимые действия по очистке.

См. также: odeset, odeget, ode23, ode45.

© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/Matlab_002dcompatible-solvers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API