ode45

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

Описание

пример

[t,y] = ode45(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.

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

пример

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

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

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

пример

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

Примеры

свернуть все

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

Решение ОДУ

y=2t.

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

tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(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)];

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

[t,y] = ode45(@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 ODE45');
xlabel('Time t');
ylabel('Solution y');
legend('y_1','y_2')

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

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

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

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

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

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

Создайте анонимную функцию, чтобы представлять уравнение f(t,y)=-2y+2cos(t)sin(2t). Функция должна принимать два входов для t и y.

yprime = @(t,y) -2*y + 2*cos(t).*sin(2*t);

Создайте вектор различных начальных условий в области значений [-5,5].

y0 = -5:5; 

Решить уравнение для каждого начального условия за временной интервал [0,3] использование ode45.

tspan = [0 3];
[t,y] = ode45(yprime,tspan,y0);

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

plot(t,y)
grid on
xlabel('t')
ylabel('y')
title('Solutions of y'' = -2y + 2 cos(t) sin(2t), y(0) = -5,-4,...,4,5','interpreter','latex')

Figure contains an axes. The axes with title Solutions of y' = -2y + 2 cos(t) sin(2t), y(0) = -5,-4,...,4,5 contains 11 objects of type line.

Этот метод полезен для решения простых ОДУ с несколькими начальными условиями. Однако метод также имеет некоторые компромиссы:

  • Вы не можете решить системы уравнений с несколькими начальными условиями. Метод работает только при решении одного уравнения с несколькими начальными условиями.

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

Рассмотрите следующую ОДУ с зависящими от времени параметрами

$$y'(t) + f(t)y(t) = g(t).$$

Начальное условие является. $y_0 = 1$Функция f(t) определяется вектором n на 1 f оценивается в разы ft. Функция g(t) задается вектором m-на-1 g оценивается в разы gt.

Создайте векторы f и g.

ft = linspace(0,5,25);
f = ft.^2 - ft - 3;

gt = linspace(1,6,25);
g = 3*sin(gt-0.25);

Написание функции с именем myode который интерполирует f и g для получения значения зависящих от времени членов в указанное время. Сохраните функцию в текущей папке, чтобы запустить остальную часть примера.

The myode функция принимает дополнительные входные параметры для оценки ОДУ на каждом временном шаге, но ode45 использует только первые два входных параметров t и y.

function dydt = myode(t,y,ft,f,gt,g)
f = interp1(ft,f,t); % Interpolate the data set (ft,f) at time t
g = interp1(gt,g,t); % Interpolate the data set (gt,g) at time t
dydt = -f.*y + g; % Evaluate ODE at time t

Решить уравнение за временной интервал [1 5] использование ode45. Задайте функцию с помощью указателя на функцию, чтобы ode45 использует только первые два входных параметров myode. Также ослабьте пороги ошибок, используя odeset.

tspan = [1 5];
ic = 1;
opts = odeset('RelTol',1e-2,'AbsTol',1e-4);
[t,y] = ode45(@(t,y) myode(t,y,ft,f,gt,g), tspan, ic, opts);

Постройте график решения, y, как функция от временных точек, t.

plot(t,y)

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

y1-μ(1-y12)y1+y1=0.

Решите уравнение Ван дер Поля с μ=1 использование ode45. Функция vdp1.m поставляется с MATLAB ® и кодирует уравнения. Задайте один выход, чтобы вернуть структуру, содержащую информацию о решении, таком как решатель и точки оценки .

tspan = [0 20];
y0 = [2 0];
sol = ode45(@vdp1,tspan,y0)
sol = struct with fields:
     solver: 'ode45'
    extdata: [1x1 struct]
          x: [1x60 double]
          y: [2x60 double]
      stats: [1x1 struct]
      idata: [1x1 struct]

Использование linspace чтобы сгенерировать 250 точек в интервале [0 20]. Оцените решение в этих точках, используя deval.

x = linspace(0,20,250);
y = deval(sol,x);

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

plot(x,y(1,:))

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

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

sol_new = odextend(sol,@vdp1,35);
x = linspace(20,35,350);
y = deval(sol_new,x);
hold on
plot(x,y(1,:),'r')

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

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

свернуть все

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

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

Алгоритмы

ode45 основан на явной формуле Рунге-Кутта (4,5), модификации Дорманда-Принца. Это одношаговый решатель - в вычислениях y(tn), ему нужно только решение в непосредственно предшествующий момент времени, y(tn-1) [1], [2].

Ссылки

[1] Dormand, J. R. and P. J. Prince, «A family of embedded Runge-Kutta formulae», J. Comp. Appl. Math., Vol. 6, 1980, pp. 19-26.

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

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

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