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 универсальный решатель ОДУ и первый решатель, который необходимо попробовать за большинство проблем. Однако, если проблема жестка или требует высокой точности, то существуют другие решатели ОДУ, которые могут лучше подходить для проблемы. Смотрите Выбирают ODE Solver для получения дополнительной информации.

пример

[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, и создание соответствующей функции: Значение, isterminal, direction] = myEventFcnTY). Для получения дополнительной информации смотрите Местоположение События ОДУ.

пример

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 object. The axes object contains an object of type line.

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

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

где μ>0 скалярный параметр. Перепишите это уравнение как систему ОДУ первого порядка путем создания замены y1=y2. Получившаяся система ОДУ первого порядка

y1=y2y2=μ(1-y12)y2-y1.

Файл функции vdp1.m представляет использование уравнения Ван дер Поля μ=1. Переменные y1 и y2 записи 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 соответствует y1, и второй столбец соответствует y2.

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

Постройте решения для y1 и y2 против 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')

Figure contains an axes object. The axes object with title S o l u t i o n blank o f blank v a n blank d e r blank P o l blank E q u a t i o n blank ( mu blank = blank 1 ) blank w i t h blank O D E 4 5 contains 2 objects of type line. These objects represent y_1, y_2.

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

Решите ОДУ

y=ABty.

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

y1=y2y2=ABty1.

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

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

Решить ОДУ используя решатель 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),'-.')

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

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

Для простых систем ОДУ одним уравнением можно задать 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 object. The axes object 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-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.

Решите уравнение Ван дер Поля с μ=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: [0 1.0048e-04 6.0285e-04 0.0031 0.0157 0.0785 0.2844 0.5407 ... ]
          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 object. The axes object 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 object. The axes object 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;
end

Для системы уравнений, выхода 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);
end

Для получения информации о том, как предоставить дополнительные параметры функции 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 структура. См. Сводные данные Опций ОДУ для списка опций, совместимых с каждым решателем.

Пример: 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 опция odeset и события обнаруживаются, затем 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. и М. В. Рейчелт, “Пакет ODE MATLAB”, SIAM Journal на Научных вычислениях, Издании 18, 1997, стр 1–22.

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

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