odeset

Создайте или измените структуру опций для решателей ODE и PDE

Описание

пример

options = odeset(Name,Value,...) создает структуру опций, которую можно передать в качестве аргумента решателям ODE и PDE. В структуре optionsименованные опции имеют заданные значения. Все неопределенные опции имеют значения по умолчанию. Для примера, options = odeset('RelTol',1e-3) возвращает структуру опций с RelTol установлено на 1e-3.

пример

options = odeset(oldopts,Name,Value,...) изменяет существующую структуру опций, oldopts, с использованием вновь заданных пар "имя-значение". Это перезаписывает все старые значения заданных опций и добавляет значения для новых опций в структуру.

пример

options = odeset(oldopts,newopts) изменяет существующую структуру опций, oldopts, путем объединения его с новой структурой опций, newopts. Любые новые опции, не равные [] перезаписать соответствующие опции в oldopts.

odeset без входных параметров отображаются все возможные имена опций и их возможные значения. Значения по умолчанию обозначаются {}, где применимо.

Примеры

свернуть все

Создайте структуру опций, которая содержит значения для RelTol и AbsTol.

options = odeset('RelTol',1e-8,'AbsTol',1e-10);

Обновление значения AbsTol в существующей структуре опций.

options = odeset(options,'AbsTol',1e-9)
options = struct with fields:
              AbsTol: 1.0000e-09
                 BDF: []
              Events: []
         InitialStep: []
            Jacobian: []
           JConstant: []
            JPattern: []
                Mass: []
        MassSingular: []
            MaxOrder: []
             MaxStep: []
         NonNegative: []
         NormControl: []
           OutputFcn: []
           OutputSel: []
              Refine: []
              RelTol: 1.0000e-08
               Stats: []
          Vectorized: []
    MStateDependence: []
           MvPattern: []
        InitialSlope: []

Создайте две структуры опций.

opts_1 = odeset('RelTol',1e-8,'AbsTol',1e-9,'OutputFcn',@odeplot,'Stats','on');
opts_2 = odeset('Mass',@(t) [t 0; 0 -t],'MStateDependence','none',...
    'MassSingular','no','OutputFcn',@odephas2);

Объедините структуры опций, отдавая выбор opts_2. Поскольку обе структуры содержат различные значения для OutputFcn, значение в opts_2 переопределяет объект в opts_1.

opts = odeset(opts_1,opts_2)
opts = struct with fields:
              AbsTol: 1.0000e-09
                 BDF: []
              Events: []
         InitialStep: []
            Jacobian: []
           JConstant: []
            JPattern: []
                Mass: @(t)[t,0;0,-t]
        MassSingular: 'no'
            MaxOrder: []
             MaxStep: []
         NonNegative: []
         NormControl: []
           OutputFcn: @odephas2
           OutputSel: []
              Refine: []
              RelTol: 1.0000e-08
               Stats: 'on'
          Vectorized: []
    MStateDependence: 'none'
           MvPattern: []
        InitialSlope: []

Входные параметры

свернуть все

Старая структура опций, заданная как структура, ранее созданная с использованием odeset.

Типы данных: struct

Новая структура опций, заданная как структура, ранее созданная с использованием odeset.

Типы данных: struct

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: options = odeset('AbsTol',1e-3,'Reltol',1e-2,'Jacobian',@J,'Mass',M) задает пороги для абсолютного и относительная погрешность допусков, функцию, которая возвращает якобиан и большая матрица.
Управление ошибками

свернуть все

Относительная погрешность, заданный как разделенная разделенными запятой парами, состоящая из 'RelTol' и положительная скалярная величина. Этот допуск измеряет ошибку относительно величины каждого компонента решения. Грубо говоря, он управляет количеством правильных цифр во всех компонентах решения, кроме тех, которые меньше, чем абсолютная погрешность AbsTol.

На каждом шаге решатель ОДУ оценивает локальную ошибку e в iпервый компонент решения. Чтобы быть успешным, шаг должен иметь приемлемую ошибку, определяемую как относительными так и абсолютными допусками ошибки:

|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))

Пример: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

Типы данных: single | double

Абсолютный допуск ошибки, заданный как разделенная разделенными запятой парами, состоящая из 'AbsTol' и положительная скалярная величина или вектор. Этот допуск является порогом, ниже которого значение решения становится неважным. Если решение |y| меньше AbsTol, тогда решателю не нужно получать какие-либо правильные цифры в |y|. По этой причине значение AbsTol следует учитывать шкалу компонентов решения.

Если AbsTol является вектором, тогда это должна быть та же длина, что и решение. Если AbsTol является скаляром, тогда значение применяется ко всем компонентам решения.

На каждом шаге решатель ОДУ оценивает локальную ошибку e в iпервый компонент решения. Чтобы быть успешным, шаг должен иметь приемлемую ошибку, определяемую как относительными так и абсолютными допусками ошибки:

|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))

Пример: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

Типы данных: single | double

Ошибка управления относительно нормы решения, заданная как разделенная разделенными запятой парами, состоящая из 'NormControl' и 'on' или 'off'. Когда NormControl является 'on'решатели управляют ошибкой e на каждом шаге используя норму решения, а не ее абсолютное значение:

norm(e(i)) <= max(RelTol*norm(y(i)),AbsTol(i))

Пример: opts = odeset('NormControl','on')

Типы данных: char | string

Выход решателя

свернуть все

Неотрицательные компоненты решения, заданные как разделенная разделенными запятой парами, состоящая из 'NonNegative' и скаляром или вектором. Скаляр или вектор выбирает, какие компоненты решения должны быть неотрицательными.

Примечание

NonNegative не доступен для ode23s или ode15i. Кроме того, для ode15s, ode23t, и ode23tb он недоступен для задач, где существует большая матрица.

Пример: opts = odeset('NonNegative',1) указывает, что первый компонент решения должен быть неотрицательным.

Типы данных: single | double

Выходная функция, заданная как разделенная разделенными запятой парами, состоящая из 'OutputFcn' и указатель на функцию. Решатель ОДУ вызывает выходную функцию после каждого успешного временного шага. Если вы вызываете решатель ОДУ без выходы, то выходная функция по умолчанию равна @odeplot, который строит графики всех компонентов решения по мере их вычисления. В противном случае значение по умолчанию является [].

Это встроенные выходные функции, которые можно использовать с OutputFcn:

Имя функцииОписание
odeplotПостройте график всех компонентов решения в зависимости от времени
odephas22-D график фазовой плоскости первых двух компонентов решения
odephas33-D график фазовой плоскости первых трех компонентов решения
odeprintРешение печати и временной шаг

Если вы пишете пользовательскую выходную функцию, то она должна иметь вид

status = myOutputFcn(t,y,flag)

Кроме того, выходная функция должна соответствующим образом реагировать на эти флаги:

ФлагОписание
'init'

Решатель вызывает myOutputFcn([tspan(1) tspan(end)],y0,'init') перед началом интегрирования, чтобы позволить выходной функции инициализировать. tspan и y0 являются входные параметры к ОДУ решателю.

[]

Решатель вызывает status = myOutputFcn(t,y,[]) после каждого шага интегрирования, для которого запрашиваются выходы. t содержит точки, где вывод был сгенерирован во время шага, и y - численное решение в точках в t. Если t является вектором, затем i1-й столбец y соответствует iпервый элемент t.

  • Если   length(tspan) > 2, затем выход получается в каждой точке tspan.

  • Если length(tspan) = 2, затем выход производится согласно Refine опция.

myOutputFcn необходимо вернуть статус  0 или 1. Если   status = 1, затем решатель останавливает интегрирование. Можно использовать этот механизм, например, для реализации  кнопки Stop.

'done'

Решатель вызывает myOutputFcn([],[],'done') после завершения интегрирования позволяет выходной функции выполнять задачи очистки.

Типы данных: function_handle

Выбор компонента для выходной функции, заданный как разделенная разделенными запятой парами, состоящая из 'OutputSel' и вектор индексов. Вектор определяет, какие компоненты решения будут переданы в выходную функцию.

Пример: opts = odeset('OutputFcn',@myFcn,'OutputSel',[1 3]) передает первые и третьи компоненты решения в выходную функцию.

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

  • Если коэффициент уточнения 1затем решатель возвращает решения только в конце каждого шага.

  • Если коэффициент уточнения n>1затем решатель подразделяет каждый шаг на n меньшие интервалы и возвращает решения в каждой точке.

Значение по умолчанию для большинства решателей 1, но ode45 использует значение по умолчанию 4 для компенсации больших размеров шага.

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

Примечание

Refine не применяется, когда length(tspan) > 2, или когда решатель ОДУ возвращает решение как структуру.

Пример: opts = odeset('Refine',5) увеличивает количество выходных точек в пять раз.

Статистика решателя, заданная как разделенная разделенными запятой парами, состоящая из 'Stats' и 'on' или 'off'. Когда 'on', решатель отображает информацию после выполнения решения:

  • Количество успешных шагов

  • Количество неудачных попыток

  • Количество вызовов функции ODE для оценки f(t,y)

Неявные решатели отображают дополнительную информацию о решении:

  • Количество раз, когда матрица частных производных f/y был сформирован

  • Количество LU-разложений

  • Количество решений линейных систем

Пример: opts = odeset('Stats','on')

Типы данных: char | string

Размер шага

свернуть все

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

Если вы не задаете начальный размер шага, то решатель основывает начальный размер шага на наклоне решения в начальной точке времени, tspan(1). Если наклон всех компонентов решения равен нулю, решатель может попробовать слишком большой размер шага. Если вы знаете, что это происходит, или хотите быть уверенными, что решатель разрешает важное поведение в начале интегрирования, используйте InitialStep для обеспечения подходящего начального размера шага.

Пример: opts = odeset('InitialStep',1e-3) устанавливает верхнюю границу 1e-3 о размере начального шага.

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

  • Не используйте MaxStep просто получить больше выходных точек, так как это может значительно замедлить интегрирование. Вместо этого используйте Refine опция вычисления дополнительных точек при низкой вычислительной стоимости.

  • Не используйте MaxStep для повышения точности решения. Если решение недостаточно точно, уменьшите значение RelTol и используйте решение, чтобы определить подходящее значение для AbsTol.

  • Избегайте использования MaxStep чтобы убедиться, что решатель не переходит через некоторое поведение, которое происходит только один раз в интервале интегрирования. Если вы знаете время, в которое происходит поведение, то разбейте интервал на две части и дважды вызовите решатель. Если вы не знаете времени, в которое происходит изменение, попробуйте уменьшить RelTol и AbsTol. Использование MaxStep только в крайнем случае.

Пример: opts = odeset('MaxStep',1e-2)

Расположение события

свернуть все

Функция события, заданная как разделенная разделенными запятой парами, состоящая из 'Events' и указатель на функцию, такой как @myEventsFcn.

Сигнатура функции

Для ОДУ: Функция события, заданная указателем на функцию, должна иметь общую форму

[value,isterminal,direction] = myEventsFcn(t,y)

Для PDE: Функция события, заданная указателем на функцию, должна иметь общую форму

[value,isterminal,direction] = myEventsFcn(m,t,xmesh,umesh)

В обоих случаях value, isterminal, и direction являются векторами, чьи ith-й элемент соответствует iпервая функция события:

  • value(i) - значение iпервая функция события.

  • isterminal(i) = 1 если интегрирование должна завершиться в нуле этой функции события. В противном случае это 0.

  • direction(i) = 0 если все нули должны быть расположены (значение по умолчанию). Значение +1 находит только нули, где функция события увеличивается, и -1 находит только нули, где функция события уменьшается.

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

Выход событий

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

[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)

Три дополнительных выхода, возвращенных решателем, соответствуют обнаруженным событиям:

  • te - это вектор-столбец времени, в которое произошли события.

  • ye - значение решения, соответствующее времени события в te.

  • ie являются индексами в вектор, возвращаемый функцией событий. Значения указывают, какое событие обнаружил решатель.

Также можно вызвать решатель с одним выходом как

sol = odeXY(odefun,tspan,y0,options)

В этом случае информация о событии хранится в структуре следующим образом sol.te, sol.ye, и sol.ie.

Диагностика

Механизм корневого нахождения, используемый решателем ODE/PDE в сочетании с функцией события, имеет эти ограничения:

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

  • Если во время первого шага происходит более одного терминального события, то регистрируется только первое событие, и решатель продолжает интеграцию.

  • Нули определяются пересечениями знаков между шагами. Поэтому можно пропустить нули с четным количеством переходов между шагами.

Если решатель шагает мимо событий, попробуйте уменьшить RelTol и AbsTol для повышения точности. Кроме того, установите MaxStep для размещения верхней границы размера шага. Настройка tspan не изменяет шаги, предпринятые решателем.

Примеры

Типы данных: function_handle

Якобийская матрица

свернуть все

Матрица Якобия, заданная как разделенная разделенными запятой парами, состоящая из 'Jacobian' и матрицу или функцию, которая оценивает якобиан. Якобиан является матрицей частных производных функции, которая задает дифференциальные уравнения.

J=fy=[f1y1f1y2f2y1f2y2]

Для жестких решателей ОДУ (ode15s, ode23s, ode23t, ode23tb, и ode15i), предоставление информации о якобианской матрице очень важно для надежности и эффективности. Если вы не предоставляете якобиан, то решатель ОДУ аппроксимирует его численно, используя конечные различия.

Для ode15i Только для Jacobian опция должна задавать матрицы для обеих fy и fy'. Можно предоставить эти матрицы как массив ячеек из двух постоянных матриц {fy,fy'}, или как функция, которая вычисляет матрицы и имеет общий вид

[dfdy, dfdp] = Fjac(t,y,yp)

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

Пример: opts = odeset('Jacobian',@J) задает функцию J который вычисляет матрицу Якобия.

Пример: opts = odeset('Jacobian',[0 1; -2 1]) задает постоянную матрицу якобиана.

Пример: opts = odeset('Jacobian',{A,Ap}) задает две постоянные матрицы Якобяна для использования с ode15i.

Типы данных: single | double | cell | function_handle

Якобианский шаблон разреженности, заданный как разделенная разделенными запятой парами, состоящая из 'JPattern' и разреженную матрицу. Разреженная матрица содержит 1s, где могут быть ненулевые записи в якобиане. Решатель ОДУ использует шаблон разреженности, чтобы сгенерировать разреженную якобийскую матрицу численно. Используйте эту опцию, чтобы улучшить время выполнения, когда система ODE является большой, и вы не можете предоставить аналитический якобиан.

Для ode15i Только: Установите JPattern опция с использованием массива ячеек, содержащего две разреженные матрицы {dfdyPattern, dfdypPattern}, которые являются шаблонами разреженности для fy и fy'.

Примечание

Если вы задаете матрицу Якобия используя Jacobian, затем решатель игнорирует любую настройку для JPattern.

Пример: opts = odeset('JPattern',S) задает шаблон разреженности якобиана с помощью разреженной матрицы S.

Пример: opts = odeset('JPattern',{dFdy, dFdyp}) задает два постоянных шаблона разреженности якобиана для использования с ode15i.

Типы данных: double | cell

Векторизованная функция переключения, заданная как разделенная разделенными запятой парами, состоящая из 'Vectorized' и любой из них 'off' или 'on'. Используйте эту опцию, чтобы сообщить решателю ОДУ, что функция закодирована так, что она принимает и возвращает векторы для второго аргумента. То есть f(t,[y1 y2 y3...]) возвращает [f(t,y1) f(t,y2) f(t,y3) ...]. По сравнению с оценкой значений по одному, эта векторизация позволяет решателю уменьшить количество вычислений функции, необходимых для вычисления всех столбцов матрицы Якобиана, и может значительно сократить время решения. Смотрите Массив и Матричные операции для описания поэлементных операторов, которые поддержка векторизацию.

Для ode15i Только: Установите Vectorized опция с использованием двухэлементного массива ячеек. Установите первый элемент равным 'on' если f(t,[y1,y2,...],yp) возвращает [f(t,y1,yp), f(t,y2,yp), ...]. Установите второй элемент равным 'on' если f(t,y,[yp1,yp2,...]) возвращает [f(t,y,yp1), f(t,y,yp2), ...]. Значение по умолчанию Vectorized в этом случае является {'off','off'}.

Примечание

Если вы задаете матрицу Якобия используя Jacobian, затем решатель игнорирует настройку 'on' для Vectorized.

Пример: opts = odeset('JPattern',S,'Vectorized','on') задает, что функция векторизирована, и устанавливает шаблон разреженности якобиана.

Пример: opts = odeset('JPattern',{dy,dyp},'Vectorized',{'on','on'}) задает, что функция векторизирована относительно y и yp, а также устанавливает якобианский шаблон разреженности для использования с ode15i.

Типы данных: char | cell | string

Большая матрица и ДАУ (не применяются к ode15i)

свернуть все

Большая матрица, заданная как разделенная разделенными запятой парами, состоящая из 'Mass' и матрицу или указатель на функцию. Решатели ОДУ могут решить задачи, содержащие большую матрицу вида M(t,y)y'=f(t,y), где M(t,y) - большая матрица, которая может быть полной или разреженной ( ode23s решатель может решить только уравнения с постоянными большими матрицами).

  • Когда большая матрица несингулярна, уравнение упрощается y'=M1f(t,y) и ОДУ имеет решение для любого начального значения. Однако часто удобнее и естественнее выражать модель с точки зрения большой матрицы непосредственно используя M(t,y)y'=f(t,y)и избегание расчета обратной матрицы сокращает время хранения и выполнения, необходимое для решения задачи.

  • Когда M(t,y) является сингулярной матрицей, тогда задачей является система дифференциальных алгебраических уравнений (ДАУ). ДАУ имеет решение только при y0 является последовательным; то есть существует начальный уклон yp0 таким образом M(t0,y0)yp0 = f(t0,y0), где yp0 задается с помощью InitialSlope опция. ДАУ характеризуются дифференциальным индексом или количеством производных, необходимых для упрощения системы к эквивалентной системе ОДУ. Для ДАУ с индексом 1 решение задачи начального значения с допустимыми начальными условиями во многом похоже на решение ОДУ. ode15s и ode23t решатели могут решить ДАУ с индексом 1. При решении ДАУ выгодно сформулировать задачу так, чтобы большая матрица была диагональной матрицей (полупрозрачная ДАУ).

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

  • Для задач формы M(t)y'=f(t,y), установите MStateDependence опция для 'none'. Это гарантирует, что решатель вызывает функцию большой матрицы с одного входного параметра для t.

  • Если большая матрица зависит от y, затем установите MStateDependence к любому из 'weak' (по умолчанию) или 'strong'. В обоих случаях решатель вызывает функцию большой матрицы с двумя входами (t,y), но 'weak' опция приводит к неявным решателям, использующим приближения при решении алгебраических уравнений.

  • Если система содержит много уравнений с сильно зависящей от состояния большой матрицей M(t,y), затем установите MvPattern в разреженную матрицу S для задания шаблона разреженности.

Пример: Файлы примера fem2ode и batonode проиллюстрировать различные использования большой матрицы.

Типы данных: single | double | function_handle

Зависимость состояний большой матрицы, заданная как разделенная разделенными запятой парами, состоящая из 'MStateDependence и 'weak', 'strong', или 'none'.

  • Для задач формы M(t)y'=f(t,y), установите MStateDependence опция для 'none'. Это гарантирует, что решатель вызывает функцию большой матрицы с одного входного параметра для t.

  • Если большая матрица зависит от y, затем установите MStateDependence к любому из 'weak' (по умолчанию) или 'strong'. В обоих случаях решатель вызывает функцию большой матрицы с двумя входами (t,y), но 'weak' опция приводит к неявным решателям, использующим приближения при решении алгебраических уравнений.

Пример: opts = odeset('Mass',@M,'MStateDependence','none') задает, что большая матрица M зависит только от t.

Типы данных: char | string

Шаблон разреженности большой матрицы, заданный как разделенная разделенными запятой парами, состоящая из 'MvPattern' и разреженную матрицу. Используйте эту опцию, чтобы задать шаблон разреженности матрицы y[M(t,y)v]. Разреженная матрица S имеет S(i,j) = 1 если для любого k, а (i,k) компонент M(t,y) зависит от компонента j от y.

Примечание

MvPattern предназначено для использования ode15s, ode23t, и ode23tb когда MStateDependence является 'strong'.

Пример: opts = odeset('MStateDependence','strong','MvPattern',S)

Переключение большой матрицы, заданное как разделенная разделенными запятой парами, состоящая из 'MassSingular' и 'maybe', 'yes', или 'no'. Значение по умолчанию 'maybe' заставляет решатель проверить, является ли задача ДАУ, путем проверки, является ли большая матрица сингулярной. Избегайте этой проверки, задавая 'yes' если вы знаете, что система является ДАУ, или 'no' если нет.

Типы данных: char | string

Последовательный начальный наклон, заданный как разделенная разделенными запятой парами, состоящая из 'InitialSlope' и вектор. Используйте эту опцию с ode15s и ode23t решатели при решении ДАУ. Заданный вектор является начальным наклоном y'0 таким, что M(t0,y0)y'0=f(t0,y0). Если заданные начальные условия не согласованы, то решатель рассматривает их как догадки, пытается вычислить допустимые значения, которые близки к догадкам, и продолжает решать задачу.

Типы данных: single | double

Только для ode15s и ode15i

свернуть все

Максимальный порядок формулы, заданный как разделенная разделенными запятой парами, состоящая из 'MaxOrder' и целое число между 1 и 5. Используйте эту опцию, чтобы задать максимальный порядок, используемый в формулах численного дифференцирования (NDFs) или формулах дифференцирования назад (BDFs), которые используются решателями переменного порядка ode15s и ode15i.

Переключение, чтобы использовать формулы дифференцирования назад (BDF) с ode15s, заданная как разделенная разделенными запятой парами, состоящая из 'BDF' и любой из них 'off' или 'on'. Формулы числовой дифференциации по умолчанию (NDF) обычно более эффективны, чем средства разработки бизнес-модели, но эти два тесно связаны.

Пример: opts = odeset('BDF','on','MaxOrder',4) позволяет использовать средства разработки бизнес-модели путем ode15s с максимальным порядком 4.

Типы данных: char | string

Выходные аргументы

свернуть все

Структура опций. options может использоваться в качестве четвертого входного параметра для ode45, ode23, ode113, ode15s, ode23s, ode23t, ode23tb, или ode15i.

Совет

Расширенные возможности

.
Представлено до R2006a