exponenta event banner

ode45

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

Описание

пример

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

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 + 2 cos (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-by-1 f оценивается в моменты времени ft. Функция g(t) определяется вектором m-by-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 для получения значения зависящих от времени терминов в указанное время. Сохраните функцию в текущей папке, чтобы выполнить остальную часть примера.

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.

Решите уравнение van der Pol с λ = 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 '= 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 вариант. Значения указывают, какое событие обнаружил решатель.

Алгоритмы

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

Ссылки

[1] Дорманд, Дж. Р. и П. Дж. Принс, «Семейство встроенных формул Рунге-Кутты», J. Comp. Appl. Math., Vol. 6, 1980, pp. 19-26.

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

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

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