ode113

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

Описание

пример

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

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

пример

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

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

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

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

Примеры

свернуть все

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

Решение ОДУ

y=2t.

Используйте временной интервал [0,5] и начальное условие y0 = 0.

tspan = [0 5];
y0 = 0;
[t,y] = ode113(@(t,y) 2*t, tspan, y0);

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

plot(t,y,'-o')

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

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

$$y''_1 - \mu \left( 1 - y_1^2\right) y'_1+y_1=0,$$

где$\mu > 0$ является скалярным параметром. Перепишите это уравнение как систему ОДУ первого порядка путем замены. $y'_1 = y_2$Получившаяся система ОДУ первого порядка

$$
\begin{array}{cl}
y'_1 &= y_2\\
y'_2 &= \mu (1-y_1^2) y_2 - y_1.\end{array}
$$

Файл функции vdp1.m представляет уравнение Ван дер Поля, используя. $\mu = 1$Переменные$y_1$ и $y_2$являются записями y(1) и y(2) двухэлементного вектора, dydt.

function dydt = vdp1(t,y)
%VDP1  Evaluate the van der Pol ODEs for mu = 1
%
%   See also ODE113, ODE23, ODE45.

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

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

Решить ОДУ используя ode113 функция на временном интервале [0 20] с начальными значениями [2 0]. Получившийся выход является вектором-столбцом временных точек t и массив решений y. Каждая строка в y соответствует времени, возвращаемому в соответствующую строку t. Первый столбец y соответствует, $y_1$а второй столбец -.$y_2$

[t,y] = ode113(@vdp1,[0 20],[2; 0]);

Постройте график решений для$y_1$ и$y_2$ против t.

plot(t,y(:,1),'-o',t,y(:,2),'-o')
title('Solution of van der Pol Equation (\mu = 1) with ODE113');
xlabel('Time t');
ylabel('Solution y');
legend('y_1','y_2')

ode113 работает только с функциями, которые используют два входных параметров, 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);

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

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

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

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

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

Задача двух тел рассматривает две взаимодействующие массы m1 и m2 вращение по орбите в общей плоскости. В этом примере одна из масс значительно больше другой. С тяжелым телом в источник, уравнения движения

$$\begin{array}{cl} x'' &= -x/r^3\\ y'' &= -y/r^3,\end{array}$$

где

$$r = \sqrt{x^2+y^2}.$$

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

$$\begin{array}{cl} y_1 &= x\\ y_2 &= x'\\ y_3 &= y\\ y_4 &=
y'.\end{array}$$

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

$$\begin{array}{cl} y'_1 &= y_2\\ y'_2 &= -y_1/r^3\\ y'_3 &= y_4 \\ y'_4
&= -y_3/r^3.\end{array}$$

Функция twobodyode кодирует систему уравнений для задачи с двумя телами.

function dy = twobodyode(t,y)
% Two body problem with one mass much larger than the other.
r = sqrt(y(1)^2 + y(3)^2);
dy = [y(2); 
    -y(1)/r^3;
    y(4);
    -y(3)/r^3];

Сохраните twobodyode.m в рабочей директории, затем решить ОДУ используя ode113. Используйте строгие ошибки допусков 1e-13 для RelTol и 1e-14 для AbsTol.

opts = odeset('Reltol',1e-13,'AbsTol',1e-14,'Stats','on');
tspan = [0 10*pi];
y0 = [2 0 0 0.5];

[t,y] = ode113(@twobodyode, tspan, y0, opts);
plot(t,y)
legend('x','x''','y','y''','Location','SouthEast')
title('Position and Velocity Components')
924 successful steps
4 failed attempts
1853 function evaluations

figure
plot(y(:,1),y(:,3),'-o',0,0,'ro')
axis equal
title('Orbit of Smaller Mass')

По сравнению с ode45, а ode113 решатель способен получить решение быстрее и с меньшим количеством вычислений функции.

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

свернуть все

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

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

Для примера, чтобы решить y'=5y3, используйте функцию:

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]. The 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 опция. Значения указывают, какое событие обнаружил решатель.

Алгоритмы

ode113 является решателем PECE Adams-Bashforth-Moulton переменного порядка (VSVO) порядков 1-13. Самый высокий используемый порядок, по-видимому, равен 12, однако формула порядка 13 используется для формирования оценки ошибки, и функция делает локальную экстраполяцию, чтобы ускорить интегрирование в порядке 13.

ode113 может быть более эффективным, чем ode45 при строгих допусках или если функция ОДУ является особенно дорогостоящей для оценки. ode113 является многоступенчатым решателем - ему обычно нужны решения в несколько предыдущих моментов времени, чтобы вычислить текущее решение [1], [2].

Ссылки

[1] Шемпин, Л. Ф. и М. К. Гордон, компьютерное решение обыкновенных дифференциальных уравнений: задача начального значения, У. Х. Фриман, Сан-Франциско , 1975.

[2] шемпин, L. F. and M. W. Reichelt, «The MATLAB ODE Suite», SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1-22.

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