Решение дифференциальных уравнений методом рунге кутта матлаб

Решение дифференциальных уравнений методом рунге кутта матлаб

Дифференциальные уравнения и системы уравнений

Для решения дифференциальных уравнений и систем в MATLAB предусмотрены следующие функции ode45(f, interval, X0 [, options]), ode23(f, interval, X0 [, options]), ode113(f, interval, X0 [, options]), odel5s(f, interval, X0 [, options]), ode23s(f, interval, X0 [, options]), ode23t (f, interval, X0 [,options]) и ode23tb(f, interval, X0 [, options]).

Входными параметрами этих функций являются:

  • f — вектор-функция для вычисления правой части уравнения системы уравнений
  • interval — массив из двух чисел, определяющий интервал интегрирования дифференциального уравнения или системы;
  • Х0 — вектор начальных условий системы дифференциальных систем
  • options — параметры управления ходом решения дифференциального уравнения или системы.

Все функции возвращают:

  • массив Т — координаты узлов сетки, в которых ищется решение;
  • матрицу X, i-й столбец которой является значением вектор-функции решения в узле Тi

В функции ode45 реализован метод Рунге-Кутта 4-5 порядка точности, в функции ode23 также реализован метод Рунге-Кутта, но 2-3 порядка, а функция ode113 реализует метод Адамса.

В М-файле с именем pr 7. m пишем:

Потом в командном окне вызываем функцию ode113:

ode113(@pr7,[0 20],0) %Метод Адамса: @ pr 7 – ссылка на М-функцию, [0 20]- интервалы интегрирования,0 — условие: y(0)=0

Результатом будет график:

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

В М-файле с именем pr 8. m пишем:

Потом в командном окне вызываем функцию ode 45:

Решение дифференциальных уравнений методом рунге кутта матлаб

Для решения систем ОДУ в MatLAB реализованы различные методы. Их реализации названы решателями ОДУ. Решатели реализуют следующие методы решения систем дифференциальных уравнений:

  • ode45 – одношаговые явные методы Рунге-Кутта 4-го и 5-го порядка. Это классический метод, рекомендуемый для начальной пробы решения. Во многих случаях он дает хорошие результаты;
  • ode23 – одношаговые явные методы Рунге-Кутта 2-го и 4-го порядка. При умеренной жесткости системы ОДУ и низких требованиях к точности этот метод может дать выигрыш в скорости решения;
  • ode133 – многошаговый метод Адамса-Башворта-Мултона переменного порядка. Это адаптивный метод, который может обеспечить высокую точность решения;
  • ode15s – многошаговый метод переменного порядка (от 1-го до 5-го, по умолчанию 5), использующий формулы численного дифференцирования. Это адаптивный метод, его стоит применять, если решатель ode45 не обеспечивает решения;
  • ode23s – одношаговый метод, использующий модифицированную формулу Розенброка 2-го порядка. Может обеспечить высокую скорость вычислений при низкой точности;
  • ode23t – метод трапеций с интерполяцией. Этот метод дает хорошие результаты при решении задач, описывающих осцилляторы с почти гармоническим выходным сигналом;
  • ode23tb – неявный метод Рунге-Кутта в начале решения и метод, использующий формулы обратного дифференцирования 2-го порядка в последующем. При низкой точности этот метод может оказаться более эффективным, чем ode15s.
  • Все решатели могут решать системы уравнений явного вида

    y’ = F(t, y). Решатели ode15s, ode23s, ode23t, ode23tb могут решать уравнения неявного вида My’ = F(t, y).

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

    • F – название ODE-файла, то есть функции от t и y, которая возвращает вектор-столбец;
    • tspan – вектор, определяющий интервал интегрирования [to tfinal]. Для получения решений в конкретные моменты времени to, t1, …, tfinal (расположенные в порядке уменьшения или увеличения), нужно использовать tspan = [t0 t1 … tfinal];
    • y0 –вектор начальных условий;
    • options – аргумент, создаваемый функцией odeset;
    • p1, p2, … — произвольные параметры, передаваемые в функцию F;
    • T, Y – матрица решений Y, где каждая строка соответствует времени, возвращенном в векторе-столбце T.

    Перейдем к описанию функций для решения систем дифференциальных уравнений (будем обозначать понятием solver один из возможных численных методов решения ОДУ: ode45, ode23, ode113, ode15s, ode23s, ode23t, ode23tb):

    • [T, Y] = solver(‘F’, tspan, y0) интегрирует систему дифференциальных уравнений вида y’ = F(t, y) на интервале tspan с начальными условиями y0. ‘F’ – строка, содержащая имя ODE-файла. Функция F(t, y) должна возвращать вектор-столбец. Каждая строка в массиве решений Y соответствует времени, возвращаемом в векторе-столбце T.
    • [T, Y] = solver(‘F’, tspan, y0, options) дает решение, подобное описанному выше, но с параметрами, определяемыми значениями аргумента options, созданного функцией odeset. Обычно используемые параметры включают допустимое значение относительной погрешности RelTol (по умолчанию 1е-3) и вектор допустимых значений абсолютной погрешности AbsTol (все компоненты по умолчанию равны 1е-6);
    • [T, Y] = solver(‘F’, tspan, y0, options, p1, p2, …) дает решение, подобное описанному выше, передавая дополнительные параметры р1, р2, … в m-файл F всякий раз, когда он вызывается. Используйте options = [], если никакие опции не задаются;
    • [T, Y, TE, YE, IE] = solver(‘F’, tspan, y0, options) в дополнение к описанному решению содержит свойства Events, установленные в структуре options в положение ‘on’. ODE-файл должен быть создан так, чтобы вызов F(t, y, ‘events’) возвращал соответствующую информацию. Выходной аргумент ТЕ – вектор-столбец времен, в которые происходят события, строки YE являются соответствующими решениями, а индексы в векторе IE определяют, какое событие произошло.
    • [T, X, Y] = solver(‘model’, tspan, y0, options, ut, p1, p2, …) использует модель Simulink, вызывая соответствующий решатель из нее: [T, X, Y] = sim(solver, ‘model’, …).

    Решатель систем ОДУ дает возможность получать решения систем из n уравнений. Система ОДУ может быть как однородной, так и неоднородной. Решение сводится к следующему:

      Создание m-файла. Независимо от вида системы он имеет вид:
  • Получение решения и сопровождающий его график:
  • Решение ОДУ в Matlab

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

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

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

    • Задача Коши
    • Краевая задача
    • Задача на собственные значения

    Кратко расскажу о их сути:

    Задача Коши предполагает дополнительные условия в виде значения функции в определённой точке.
    Краевая задача подразумевает поиск решения на заданном отрезке с краевыми (граничными) условиями в концах интервала или на границе области.
    Задача на собственные значения — помимо искомых функций и их производных, в уравнение входят дополнительное несколько неизвестных параметров, которые являются собственными значениями.

    Методы решения дифференциальных уравнений

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

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

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

    Метод Рунге-Кутта первого порядка

    Методы Рунге-Кутта представляют собой разложения в ряд Тейлора и от количества использованных элементов ряда зависит порядок этого метода. Следовательно, помимо Рунге-Кутта первого порядка, вы сможете увидеть методы других порядков. Иногда их называют другими именами.

    Например, Метод Рунге-Кутта первого порядка, также известен как Метод Эйлера или Метод ломаных. Информацию о его математическом и графическом представлении советую поискать в гугл. Мы же поговорим о том, как Метод Рунге-Кутта первого порядка реализуется в Matlab для решения ОДУ. Например:

    Решить и привести график ошибки уравнения y’ = y*x методом Рунге-Кутта первого порядка (Методом Эйлера, Методом ломаных).

    Погрешность Метода Рунге-Кутта 1 порядка

    » data-medium-file=»https://i2.wp.com/codetown.ru/wp-content/uploads/2017/02/Рунге-1-погрешность.png?fit=300%2C236&ssl=1″ data-large-file=»https://i2.wp.com/codetown.ru/wp-content/uploads/2017/02/Рунге-1-погрешность.png?fit=622%2C489&ssl=1″ loading=»lazy» src=»https://i2.wp.com/codetown.ru/wp-content/uploads/2017/02/%D0%A0%D1%83%D0%BD%D0%B3%D0%B5-1-%D0%BF%D0%BE%D0%B3%D1%80%D0%B5%D1%88%D0%BD%D0%BE%D1%81%D1%82%D1%8C.png?resize=622%2C489″ alt=»Погрешность метода 1 порядка» width=»622″ height=»489″ srcset=»https://i2.wp.com/codetown.ru/wp-content/uploads/2017/02/Рунге-1-погрешность.png?w=629&ssl=1 629w, https://i2.wp.com/codetown.ru/wp-content/uploads/2017/02/Рунге-1-погрешность.png?resize=300%2C236&ssl=1 300w» sizes=»(max-width: 622px) 100vw, 622px» data-recalc-dims=»1″ />
    На данном графике показана зависимость величины ошибки от шага.

    Метод Рунге-Кутта второго порядка

    Также известен как Метод Эйлера-Коши. Как видите, во второй части уравнения происходит обращения к следующему шагу. Но как тогда быть, если нам ещё не известен следующий шаг? Всё просто. Метод Рунге-Кутта второго порядка — это всё тот же метод первого порядка, однако, на половине шага происходит нахождение «первичного» решения, а затем происходит его уточнение. Это позволяет поднять порядок скорости сходимости до двух.

    Решить и привести график ошибки уравнения u’ = u*x методом Рунге-Кутта второго порядка.


    По сравнению с Рунге-Куттом первого порядка изначальная ошибка уже гораздо меньше.

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

    Метод Рунге-Кутта четвёртого порядка

    Метод Рунге-Кутта четвёртого порядка считается самым распространённым. Тем не менее, работает он аналогично второму и третьему порядку.

    Решить и привести график ошибки уравнения u’ = u*x методом Рунге-Кутта четвёртого порядка.


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

    Решение ОДУ в Matlab стандартными средствами

    Стоит отметить, что мы с вами разобрали только один самый известный метод решения ОДУ с разными порядками. Однако, методов очень много.

    Для решения дифференциальных уравнений и систем в MATLAB предусмотрены следующие функции:

    ode45 (f, interval, X0, [options])
    ode23 (f, interval, X0, [options])
    ode113 (f, interval, X0, [options])
    ode15s (f, interval, X0, [options])
    ode23s (f, interval, X0, [options])
    ode23t (f, interval, X0, [options])
    ode23tb (f, interval, X0, [options])

    Входными параметрами этих функций являются:

    • f — вектор-функция для вычисления правой части уравнения системы уравнений;
    • interval — массив из двух чисел, определяющий интервал интегрирования дифференциального уравнения или системы;
    • Х0 — вектор начальных условий системы дифференциальных уравнений;
    • options — параметры управления ходом решения дифференциального уравнения или системы.

    Все функции возвращают:

    • массив Т — координаты узлов сетки, в которых ищется решение;
    • матрицу X, i-й столбец которой является значением вектор-функции решения в узле Тi.

    В функции ode45 реализован метод Рунге-Кутта 4-5 порядка точности, в функции ode23 также реализован метод Рунге-Кутта, но 2-3 порядка, а функция ode113 реализует метод Адамса.

    Для решения жёстких систем предназначены функция ode15s, в которой реализован метод Гира, и функция ode23s, реализующая метод Розенброка. Для получения более точного решения жёсткой системы лучше использовать функцию ode15s. Для решения системы с небольшим числом жёсткости можно использовать функцию ode23t, а для грубой оценки подобных систем служит функция ode23tb.

    Символьное решение обыкновенных дифференциальных уравнений произвольного порядка осуществляет функция dsolve r = dsolve(‘eq1,eq2,…’, ‘cond1,cond2,…‘, ‘v’)
    Пример использования:

    На этом мы закончим. Если остались вопросы, задавайте их в комментариях. Также вы можете скачать исходники чтобы лучше понять тему: «Решение ОДУ в Matlab».


    источники:

    http://old.exponenta.ru/soft/matlab/stud7/1_4.asp

    http://codetown.ru/matlab/reshenie-odu/