exponenta event banner

ode15s

Решение жестких дифференциальных уравнений и дисковых полок - метод переменного порядка

Описание

пример

[t,y] = ode15s(odefun,tspan,y0), где tspan = [t0 tf], интегрирует систему дифференциальных уравнений y '= f (t, y) изt0 кому tf с начальными условиями y0. Каждая строка в массиве решений y соответствует значению, возвращенному в векторе столбца t.

Все решатели ODE MATLAB ® могут решать системы уравнений вида y '= f (t, y) или задачи, которые включают массовую матрицу M (t, y) y' = f (t, y). Все решатели используют сходные синтаксисы. ode23s решатель может решить проблемы с массовой матрицей, только если массовая матрица постоянна. ode15s и ode23t может решать задачи с массовой матрицей, которая является сингулярной, известной как дифференциально-алгебраические уравнения (DAE). Задайте массовую матрицу с помощью Mass вариант odeset.

пример

[t,y] = ode15s(odefun,tspan,y0,options) также использует настройки интеграции, определенные options, который является аргументом, созданным с помощью odeset функция. Например, используйте AbsTol и RelTol для задания абсолютных и относительных допусков ошибок или Mass для предоставления матрицы массы.

[t,y,te,ye,ie] = ode15s(odefun,tspan,y0,options) дополнительно находит, где функции (t, y), называемые функциями события, равны нулю. В выходных данных ,te - время события, ye является решением во время события, и ie - индекс инициируемого события.

Для каждой функции события укажите, должна ли интеграция завершаться нулем и имеет ли значение направление пересечения нуля. Для этого установите 'Events' свойство функции, например myEventFcn или @myEventFcnи создание соответствующей функции: [value,isterminal,direction] = myEventFcn(t,y). Дополнительные сведения см. в разделе Расположение события ОДУ.

пример

sol = ode15s(___) возвращает структуру, которую можно использовать с deval для оценки решения в любой точке интервала [t0 tf]. В предыдущих синтаксисах можно использовать любую комбинацию входных аргументов.

Примеры

свернуть все

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

Решить ОДУ

y′=-10t.

Использовать интервал времени [0,2] и исходное условие y0 = 1.

tspan = [0 2];
y0 = 1;
[t,y] = ode15s(@(t,y) -10*t, tspan, y0);

Постройте график решения.

plot(t,y,'-o')

Figure contains an axes. The axes contains an object of type line.

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

Система уравнений:

$$\begin{array}{cl} y_1' &= y_2\\y_2' &= 1000(1-y_1^2)y_2-y_1\end{array}$$

Начальными условиями являются$y_1(0)=2$ и. $y_2(0)=0$Функция vdp1000 поставляется с MATLAB ® и кодирует уравнения.

function dydt = vdp1000(t,y)
%VDP1000  Evaluate the van der Pol ODEs for mu = 1000.
%
%   See also ODE15S, ODE23S, ODE23T, ODE23TB.

%   Jacek Kierzenka and Lawrence F. Shampine
%   Copyright 1984-2014 The MathWorks, Inc.

dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)];

Решение этой системы с помощью ode45 с допусками относительных и абсолютных ошибок по умолчанию (1e-3 и 1e-6, соответственно) является чрезвычайно медленным, требующим нескольких минут для решения и построения графика решения. ode45 требует миллионов временных шагов, чтобы завершить интеграцию, из-за областей жесткости, где она пытается выполнить допуски.

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

Решить жесткую систему с помощью ode15s решатель, а затем постройте график первого столбца решения y по моментам времени t. ode15s решатель проходит через жесткие области с гораздо меньшим количеством шагов, чем ode45.

[t,y] = ode15s(@vdp1000,[0 3000],[2 0]);
plot(t,y(:,1),'-o')

ode15s работает только с функциями, использующими два входных аргумента, t и y. Однако можно передать дополнительные параметры, определив их вне функции и передав при указании дескриптора функции.

Решить ОДУ

$$y'' = \frac{A}{B} t y.$$

Переписывание уравнения как системы первого порядка дает

$$\begin{array}{cl} y'_1 &= y_2\\ y'_2 &= \frac{A}{B} t y_1.
\end{array}$$

odefcn.m представляет эту систему уравнений как функцию, которая принимает четыре входных аргумента: t, y, A, и B.

function dydt = odefcn(t,y,A,B)
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = (A/B)*t.*y(1);

Решение ОДУ с помощью ode15s. Укажите дескриптор функции таким образом, чтобы он передавал предопределенные значения для A и B кому odefcn.

A = 1;
B = 2;
tspan = [0 5];
y0 = [0 0.01];
[t,y] = ode15s(@(t,y) odefcn(t,y,A,B), tspan, y0);

Постройте график результатов.

plot(t,y(:,1),'-o',t,y(:,2),'-.')

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

Рассмотрим уравнение теста

y′=-λy.

Уравнение становится все более жестким по мере увеличения величины λ. Используйте λ = 1 × 109 и исходное условие y (0) = 1 в течение интервала времени[0 0.5]. С этими значениями проблема достаточно жесткая, что ode45 и ode23 бороться за интеграцию уравнения. Кроме того, используйте odeset для передачи постоянного J=∂f∂y=-λ Якобиана и включения отображения статистики решателя.

lambda = 1e9;
y0 = 1;
tspan = [0 0.5];
opts = odeset('Jacobian',-lambda,'Stats','on');

Решите уравнение с помощью ode15s, ode23s, ode23t, и ode23tb. Создайте вложенные графики для сравнения.

subplot(2,2,1)
tic, ode15s(@(t,y) -lambda*y, tspan, y0, opts), toc
104 successful steps
1 failed attempts
212 function evaluations
0 partial derivatives
21 LU decompositions
210 solutions of linear systems
Elapsed time is 1.338321 seconds.
title('ode15s')
subplot(2,2,2)
tic, ode23s(@(t,y) -lambda*y, tspan, y0, opts), toc
63 successful steps
0 failed attempts
191 function evaluations
0 partial derivatives
63 LU decompositions
189 solutions of linear systems
Elapsed time is 0.258983 seconds.
title('ode23s')
subplot(2,2,3)
tic, ode23t(@(t,y) -lambda*y, tspan, y0, opts), toc
95 successful steps
0 failed attempts
125 function evaluations
0 partial derivatives
28 LU decompositions
123 solutions of linear systems
Elapsed time is 0.406110 seconds.
title('ode23t')
subplot(2,2,4)
tic, ode23tb(@(t,y) -lambda*y, tspan, y0, opts), toc
71 successful steps
0 failed attempts
167 function evaluations
0 partial derivatives
23 LU decompositions
236 solutions of linear systems
Elapsed time is 0.355101 seconds.
title('ode23tb')

Figure contains 4 axes. Axes 1 with title ode15s contains 2 objects of type line. Axes 2 with title ode23s contains 2 objects of type line. Axes 3 with title ode23t contains 2 objects of type line. Axes 4 with title ode23tb contains 2 objects of type line.

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

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

Уравнение ван дер Пол является ОДУ второго порядка

y1 -λ (1-y12) y1′+y1=0.

Решите уравнение van der Pol с λ = 1000 с помощьюode15s. Функция vdp1000.m поставляется с MATLAB ® и кодирует уравнения. Укажите один вывод, чтобы вернуть структуру, содержащую информацию о решении, такую как решатель и точки вычисления.

tspan = [0 3000];
y0 = [2 0];
sol = ode15s(@vdp1000,tspan,y0)
sol = struct with fields:
     solver: 'ode15s'
    extdata: [1x1 struct]
          x: [1x592 double]
          y: [2x592 double]
      stats: [1x1 struct]
      idata: [1x1 struct]

Использовать linspace для генерации 2500 точек в интервале [0 3000]. Вычислите первый компонент решения в этих точках с помощью deval.

x = linspace(0,3000,2500);
y = deval(sol,x,1);

Постройте график решения.

plot(x,y)

Figure contains an axes. The axes contains an object of type line.

Расширить решение до tf = 4000 с помощьюodextend и добавьте результат к исходному графику.

tf = 4000;
sol_new = odextend(sol,@vdp1000,tf);
x = linspace(3000,tf,350);
y = deval(sol_new,x,1);
hold on
plot(x,y,'r')

Figure contains an axes. The axes contains 2 objects of type line.

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

$$\begin{array}{cl} y'_1 &= -0.04y_1 + 10^4 y_2y_3\\ y'_2 &= 0.04y_1 -
10^4 y_2y_3- (3 \times 10^7)y_2^2\\ y'_3 &= (3 \times
10^7)y_2^2.\end{array}$$

hb1ode решает эту систему ОДУ до установившегося состояния с начальными условиями,$y_1 = 1$, $y_2 = 0$и. $y_3 = 0$Но уравнения также удовлетворяют линейному закону сохранения,

$$y'_1 + y'_2 + y'_3 = 0.$$

С точки зрения решения и исходных условий закон о сохранении является

$$y_1 + y_2 + y_3 = 1.$$

Система уравнений может быть переписана как система DAE, используя закон сохранения для определения состояния. $y_3$При этом проблема преобразуется в систему дисковой полки.

$$\begin{array}{cl} y'_1 &= -0.04y_1 + 10^4 y_2y_3\\ y'_2 &= 0.04y_1 -
10^4 y_2y_3-(3 \times 10^7)y_2^2\\ 0 &= y_1 + y_2 + y_3 - 1.\end{array}$$

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

Функция robertsdae кодирует эту систему дисковых полок. Сохранить robertsdae.m в текущей папке для выполнения примера.

function out = robertsdae(t,y)
out = [-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 ];

Полный код примера для этой формулировки проблемы Робертсона доступен в hb1dae.m.

Решение системы дисковых полок с помощью ode15s. Согласованные начальные условия для y0 очевидны на основе закона о сохранении. Использовать odeset для установки параметров:

  • Используйте матрицу постоянной массы для представления левой части системы уравнений.

$$\left( \begin{array}{c} y'_1\\ y'_2\\ 0 \end{array} \right) = M y'
\rightarrow M = \left( \begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 &
0 \end{array} \right)$$

  • Установите относительный допуск ошибки равным 1e-4.

  • Использовать абсолютный допуск 1e-10 для второго компонента решения, поскольку масштаб резко отличается от других компонентов.

  • Оставить 'MassSingular' опция при ее значении по умолчанию 'maybe' для тестирования автоматического обнаружения дисковой полки.

y0 = [1; 0; 0];
tspan = [0 4*logspace(-6,6)];
M = [1 0 0; 0 1 0; 0 0 0];
options = odeset('Mass',M,'RelTol',1e-4,'AbsTol',[1e-6 1e-10 1e-6]);
[t,y] = ode15s(@robertsdae,tspan,y0,options);

Постройте график решения.

y(:,2) = 1e4*y(:,2);
semilogx(t,y);
ylabel('1e4 * y(:,2)');
title('Robertson DAE problem with a Conservation Law, solved by ODE15S');

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

свернуть все

Функции для решения, определяемые как дескриптор функции, определяющий функции, подлежащие интеграции.

Функция dydt = odefun(t,y), для скаляра t и вектор-столбец y, должен возвращать вектор столбца dydt типа данных single или double что соответствует f (t, y ).odefun должен принимать оба входных аргумента, t и y, даже если один из аргументов не используется в функции.

Например, для решения y '= 5y − 3 используйте функцию:

function dydt = odefun(t,y)
dydt = 5*y-3;

Для системы уравнений выход odefun является вектором. Каждый элемент вектора является решением одного уравнения. Например, для решения

y '1 = y1 + 2y2y' 2 = 3y1 + 2y2

используйте функцию:

function dydt = odefun(t,y)
dydt = zeros(2,1);
dydt(1) = y(1)+2*y(2);
dydt(2) = 3*y(1)+2*y(2);

Для получения информации о предоставлении дополнительных параметров функции odefun, см. раздел Параметризация функций.

Пример: @myFcn

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

Интервал интегрирования, заданный как вектор. Как минимум, tspan должен быть двухэлементным вектором [t0 tf] задание начального и конечного времени. Получение решений в определенное время между t0 и tf, используйте более длинный вектор формы [t0,t1,t2,...,tf]. Элементы в tspan должно быть все увеличивается или все уменьшается.

Решатель накладывает начальные условия, заданные y0 в начальный момент времени tspan(1), затем интегрируется из tspan(1) кому tspan(end):

  • Если tspan имеет два элемента, [t0 tf]затем решатель возвращает решение, оцененное на каждом шаге внутренней интеграции в пределах интервала.

  • Если tspan имеет более двух элементов [t0,t1,t2,...,tf]затем решатель возвращает решение, вычисленное в заданных точках. Однако решатель не выполняет точного шага к каждой точке, указанной в tspan. Вместо этого решатель использует собственные внутренние шаги для вычисления решения, затем оценивает решение в запрошенных точках в tspan. Решения, полученные в указанных точках, имеют тот же порядок точности, что и решения, вычисленные на каждом внутреннем этапе.

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

Значения tspan используются решателем для вычисления подходящих значений для InitialStep и MaxStep:

  • Если tspan содержит несколько промежуточных точек [t0,t1,t2,...,tf], то указанные баллы дают указание на шкалу для задачи, которая может повлиять на значение InitialStep используется решателем. Следовательно, решение, полученное решателем, может быть различным в зависимости от указания tspan как двухэлементный вектор или как вектор с промежуточными точками.

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

Пример: [1 10]

Пример: [1 3 5 7 9 10]

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

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

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

Структура опций, заданная как массив структуры. Используйте odeset для создания или изменения структуры опций. Список опций, совместимых с каждым решателем, см. в разделе Сводка опций ОДУ.

Пример: options = odeset('RelTol',1e-5,'Stats','on','OutputFcn',@odeplot) указывает относительный допуск ошибки 1e-5, включает отображение статистики решателя и задает функцию вывода @odeplot для построения графика решения по мере его вычисления.

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

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

свернуть все

Вычислительные точки, возвращаемые в виде вектора столбца.

  • Если tspan содержит два элемента, [t0 tf], то t содержит внутренние точки оценки, используемые для выполнения интеграции.

  • Если tspan содержит более двух элементов, затем t является таким же, как tspan.

Решения, возвращенные в виде массива. Каждая строка в y соответствует решению при значении, возвращенном в соответствующей строке t.

Время событий, возвращаемое в виде вектора столбца. Время события в te соответствуют решениям, возвращенным в ye, и ie указывает, какое событие произошло.

Решение во время событий, возвращаемое в виде массива. Время события в te соответствуют решениям, возвращенным в ye, и ie указывает, какое событие произошло.

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

Структура для анализа, возвращаемая в виде массива структуры. Используйте эту структуру с deval функция для оценки решения в любой точке интервала [t0 tf]. sol структурный массив всегда включает следующие поля:

Поле структурыОписание

sol.x

Вектор строки шагов, выбранных решателем.

sol.y

Решения. Каждый столбец sol.y(:,i) содержит решение в момент времени sol.x(i).

sol.solver

Имя решателя.

Кроме того, если указать Events параметр и события обнаружены, затем sol также включает следующие поля:

Поле структурыОписание

sol.xe

Указывает, когда произошли события. sol.xe(end) содержит точную точку события терминала, если она имеется.

sol.ye

Решения, соответствующие событиям в sol.xe.

sol.ie

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

Алгоритмы

ode15s - решатель переменного порядка (VSVO), основанный на числовых формулах дифференциации (NDF) порядков от 1 до 5. Опционально он может использовать формулы обратного дифференцирования (BDF, также известные как метод Gear), которые обычно менее эффективны. Как ode113, ode15s является многоступенчатым решателем. Использовать ode15s если ode45 неудачно или очень неэффективно, и вы подозреваете, что задача жесткая, или при решении дифференциально-алгебраического уравнения (DAE) [1], [2].

Ссылки

[1] Шампин, Л. Ф. и М. У. Райхельт, «The MATLAB ODE Suite», SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1-22.

[2] Шампин, Л. Ф., М. У. Райхельт и Я. А. Кьерзенка, «Решение Index-1 DAE в MATLAB и Simulink», SIAM Review, том 41, 1999, стр. 538-552.

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