Выбор решателя ОДУ

Обыкновенные дифференциальные уравнения

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

Для примера это ОДУ второго порядка:

y''=9y

В задаче начального значения ОДУ решается, начиная с начального состояния. Используя начальное условие, y0, а также период времени, в течение которого должен быть получен ответ, (t0,tf), решения получают итеративно. На каждом шаге решатель применяет конкретный алгоритм к результатам предыдущих шагов. На первом этапе начальное условие предоставляет необходимую информацию, которая позволяет продолжить интегрирование. Конечным результатом является то, что решатель ОДУ возвращает вектор времени t=[t0,t1,t2,...,tf] а также соответствующее решение на каждом шаге y=[y0,y1,y2,...,yf].

Типы ОДУ

Решатели ОДУ в MATLAB® решить эти типы ОДУ первого порядка:

  • Явные ОДУ формы y'=f(t,y).

  • Линейно неявные ОДУ вида M(t,y)y'=f(t,y), где M(t,y) является несингулярной большой матрицей. Большая матрица может быть зависящим от времени или состояния, или это может быть постоянная матрица. Линейно неявные ОДУ включают линейные комбинации первой производной y, которые кодируются в большой матрице.

    Линейно неявные ОДУ всегда могут быть преобразованы в явную форму, y'=M1(t,y)f(t,y). Однако установка большой матрицы непосредственно решателю ОДУ избегает этого преобразования, которое неудобно и может быть вычислительно дорогим.

  • Если некоторые компоненты y' отсутствуют, тогда уравнения называются дифференциальными алгебраическими уравнениями, или ДАУ, и система ДАУ содержит некоторые алгебраические переменные. Алгебраические переменные являются зависимыми переменными, производные которых не появляются в уравнениях. Система ДАУ может быть переписана как эквивалентная система ОДУ первого порядка путем взятия производных уравнений, чтобы исключить алгебраические переменные. Количество производных, необходимых для переписывания ДАУ в качестве ОДУ, называется дифференциальным индексом. ode15s и ode23t решатели могут решить индекс -1 ДАУ.

  • Полностью неявные ОДУ формы f(t,y,y')=0. Полностью неявные ОДУ не могут быть переписаны в явной форме, а также могут содержать некоторые алгебраические переменные. ode15i решатель предназначен для полностью неявных задач, включая индекс -1 ДАУ.

Вы можете предоставить дополнительную информацию решателю для некоторых типов задач при помощи odeset функция для создания структуры опций.

Системы ОДУ

Можно задать любое количество связанных уравнений ОДУ, чтобы решить, и в принципе количество уравнений ограничено только доступной памятью компьютера. Если система уравнений имеет n уравнения,

(y'1y'2y'n)=(f1(t,y1,y2,...,yn)f2(t,y1,y2,...,yn)fn(t,y1,y2,...,yn)),

затем функция, которая кодирует уравнения, возвращает вектор с n элементами, соответствующими значениям для y'1,y'2,,y'n. Для примера рассмотрим систему двух уравнений

{y'1=y2y'2=y1y22.

Функция, которая кодирует эти уравнения,

function dy = myODE(t,y)
dy(1) = y(2);
dy(2) = y(1)*y(2)-2;

ОДУ более высокого порядка

Решатели MATLAB ODE решают только уравнения первого порядка. Необходимо переписать ОДУ более высокого порядка как эквивалентную систему уравнений первого порядка с помощью обобщенных замен

y1=yy2=y'y3=y''yn=y(n1).

Результатом этих замен является система n уравнений первого порядка

{y'1=y2y'2=y3y'n=f(t,y1,y2,...,yn).

Для примера рассмотрим ОДУ третьего порядка

y'''y''y+1=0.

Использование замен

y1=yy2=y'y3=y''

результаты в эквивалентной системе первого порядка

{y'1=y2y'2=y3y'3=y1y31.

Код для этой системы уравнений тогда

function dydt = f(t,y)
dydt(1) = y(2);
dydt(2) = y(3);
dydt(3) = y(1)*y(3)-1;

Комплексные ОДУ

Рассмотрим комплексное уравнение ОДУ

y'=f(t,y),

где y=y1+iy2. Чтобы решить его, разделите действительную и мнимую части на различные компоненты решения, затем рекомбинируйте результаты в конце. Концептуально это выглядит как

yv=[Real(y)Imag(y)]fv=[Real(f(t,y))Imag(f(t,y))].

Для примера, если ОДУ y'=yt+2i, тогда можно представлять уравнение с помощью файла функции.

function f = complexf(t,y)
% Define function that takes and returns complex values
f = y.*t + 2*i;

Затем код, чтобы разделить реальную и мнимую части,

function fv = imaginaryODE(t,yv)
% Construct y from the real and imaginary components
y = yv(1) + i*yv(2);            

% Evaluate the function
yp = complexf(t,y);             

% Return real and imaginary in separate components
fv = [real(yp); imag(yp)];      

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

y0 = 1+i;
yv0 = [real(y0); imag(y0)];
tspan = [0 2];
[t,yv] = ode45(@imaginaryODE, tspan, yv0);

Как только вы получите решение, объедините действительные и мнимые компоненты вместе, чтобы получить конечный результат.

y = yv(:,1) + i*yv(:,2);

Основной выбор решателя

ode45 хорошо работает с большинством задач ОДУ и обычно должен быть вашим первым выбором решателя. Однако, ode23 и ode113 может быть более эффективным, чем ode45 для проблем с более свободными или более жесткими требованиями точности.

Некоторые проблемы ОДУ показывают жесткость или трудности в оценке. Жесткость - это термин, который не поддается точному определению, но в целом жесткость возникает, когда существует различие в масштабировании где-то в задаче. Для примера, если ОДУ имеет два компонента решения, которые варьируются на резко разных временных шкалах, то уравнение может быть жестким. Можно идентифицировать задачу как жесткую, если нежесткие решатели (такие как ode45) не могут решить проблему или чрезвычайно медленно. Если вы наблюдаете, что нежесткий решатель очень медлен, попробуйте использовать жесткий решатель, такой как ode15s вместо этого. При использовании жесткого решателя можно улучшить надежность и эффективность, задав матрицу Якобия или её разреженность шаблона.

В этой таблице приведены общие инструкции по использованию каждого из других решателей.

РешательТип задачиТочностьКогда использовать
ode45НежесткийСреда

Большую часть времени. ode45 должен быть первым решателем, который вы пытаетесь.

ode23Низко

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

ode113От низкого до высокого

ode113 может быть более эффективным, чем ode45 при проблемах со строгими допусками ошибок или когда функция ODE является дорогостоящей для оценки.

ode15sЖесткийОт низкого до среднего

Попробуйте ode15s когда ode45 отказывает или неэффективен, и вы подозреваете, что задача жесткая. Также используйте ode15s при решении дифференциальных алгебраических уравнений (ДАУ).

ode23sНизко

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

ode23s вычисляет якобиан в каждом шаге, поэтому выгодно предоставить якобиан по odeset для максимизации эффективности и точности.

Если существует большая матрица, она должна быть постоянной.

ode23tНизко

Использовать ode23t если задача является только умеренно жесткой, и вам нужно решение без численного демпфирования. 

ode23t может решить дифференциальные алгебраические уравнения (ДАУ).

ode23tbНизко

Как ode23s, ode23tb решатель может быть более эффективным, чем ode15s при проблемах с допусками сырой нефти.

ode15iПолностью неявныйНизко

Использовать ode15i для полностью неявных задач f(t,y,y’) = 0 и для дифференциальных алгебраических уравнений (ДАУ) индекса 1.

Для получения дополнительной информации и дополнительных рекомендаций о том, когда использовать каждый решатель, смотрите [5].

Сводных данных примеров и файлов ОДУ

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

odeexamples

Чтобы открыть отдельный файл примера для редактирования, введите

edit exampleFileName.m

Чтобы запустить пример, введите

exampleFileName

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

Пример файлаИспользуемый решательЗаданные опцииОписаниеСсылка на документацию
amp1daeode23t
  • 'Mass'

Жесткая ДАУ - электрическая схема с постоянными, сингулярными большими матрицами

Решение жесткого дифференциального алгебраического уравнения транзистора
ballodeode23
  • 'Events'

  • 'OutputFcn'

  • 'OutputSel'

  • 'Refine'

  • 'InitialStep'

  • 'MaxStep'

Простое место события - прыгающий мяч

Место проведения мероприятия ОДУ
batonodeode45
  • 'Mass'

ОДУ с зависящей от времени и состояния большой матрицей - движение дубинки

Решите уравнения движения для Батона, брошенного в воздух
brussodeode15s
  • 'JPattern'

  • 'Vectorized'

Жесткая большая задача - диффузия в химической реакции (Брюсселатор)

Решение жестких ОДУ
burgersodeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'JPattern'

  • 'MvPattern'

  • 'RelTol'

  • 'AbsTol'

ОДУ с сильно зависящей от состояния большой матрицей - уравнение Бургерса, решенное с помощью метода движущейся сетки

Решение ОДУ с сильно зависящими от состояния Большими матрицами
fem1odeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'Jacobian'

Жесткая задача с зависящей от времени большой матрицей - метод конечного элемента

fem2odeode23s
  • 'Mass'

Жесткая задача с постоянным методом большой матрицы - конечного элемента

hb1odeode15s

Жесткая задача ОДУ, решенная на очень длительном интервале - химическая реакция Робертсона

hb1daeode15s
  • 'Mass'

  • 'RelTol'

  • 'AbsTol'

  • 'Vectorized'

Жесткая, линейно неявная ДАУ из закона сохранения - химическая реакция Робертсона

Решите задачу Робертсона как полу-явные дифференциальные алгебраические уравнения (ДАУ)
ihb1daeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

Жесткая, полностью неявная ДАУ - химическая реакция Робертсона

Решите задачу Робертсона как неявные дифференциальные алгебраические уравнения (ДАУ)
iburgersodeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

  • 'JPattern'

Неявная система ОДУ - уравнение Бургеров

kneeodeode15s
  • 'NonNegative'

«Проблема колена» с ограничениями неотрицательности

Решение неотрицательной ОДУ
orbitodeode45
  • 'RelTol'

  • 'AbsTol'

  • 'Events'

  • 'OutputFcn'

Расширенное местоположение события - ограничено задачами трех тел

Место проведения мероприятия ОДУ
rigidodeode45

Нежесткая задача - уравнения Эйлера твердого тела без внешних сил

Решение нежестких ОДУ
vdpodeode15s
  • 'Jacobian'

Параметризуемое уравнение Ван дер Поля (жесткое для больших μ)

Решение жестких ОДУ

Ссылки

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

[2] Forsythe, G., M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice Hall, New Jersey, 1977.

[3] Kahaner, D., C. Moler, and S. Nash, Numerical Methods and Software, Prentice Hall, New Jersey, 1989.

[4] шемпин, L. F., Numerical Solution of Обыкновенные Дифференциальные Уравнения, Chapman & Hall, New York, 1994.

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

[6] шемпин, L. F., Gladwell, I. and S. Thompson, Solving ODEs with MATLAB, Cambridge University Press, Cambridge UK, 2003.

См. также

|

Похожие темы

Внешние веб-сайты