9.5 Функції для вирішення диференціальних рівнянь
Найбільш часто використовуваними в Octave функціями для вирішення диференціальних рівнянь є:
Функції вирішують систему диференціальних рівнянь автоматично підбираючи крок для досягнення необхідної точності. Вхідними параметрами цих функцій є:
Для визначення параметрів управління ходом рішення диференціальних рівнянь використовується функція odeset наступної структури:
тут
При вирішенні диференціальних рівнянь необхідно визначити наступні параметри:
Всі функції повертають:
Вирішимо задачу 9.1 з використанням функцій . Текст програми з коментарями представлений в лістингу 9.8 .
% Точне рішення системи. function q = fi (x) q = 119/296-exp (6 * x) + 1/24 * (52 * x. ^ 3 + 114 * x. ^ 2-30 * x + 39) -6 * sin ( x) / 37-cos (x) / 37; end% Права частина диференціального рівняння. function y = g (t, x) y = 6 * x-13 * t ^ 3-22 * t ^ 2 + 17 * t-11 + sin (t); end% Визначення параметрів управління ходом рішення рівняння. % RelTol - відносна точність рішення 1E-5,% AbsTol - абсолютна точність рішення 1E-5,% InitialStep - початкове значення кроку зміни змінної 0.025,% MaxStep - максимальне значення кроку зміни змінної 0.1. par = odeset ( "RelTol", 1e-5, "AbsTol", 1e-5, 'InitialStep', 0.025, 'MaxStep', 0.1); % Рішення диференціального рівняння методом Рунге-Кутта 2-3 порядки. [X23, Y23] = ode23 (@g, [0 0.25], 2, par); % Визначення параметрів управління ходом рішення рівняння. % RelTol - відносна точність рішення 1E-4,% AbsTol - абсолютна точність рішення 1E-4,% InitialStep - початкове значення кроку зміни змінної 0.005,% MaxStep - максимальне значення кроку зміни змінної 0.2. par = odeset ( "RelTol", 1e-4, "AbsTol", 1e-4, 'InitialStep', 0.05, 'MaxStep', 0.2); % Рішення диференціального рівняння методом Рунге-Кутта 4-5 порядку. [X45, Y45] = ode45 (@g, [0 0.25], 2, par); % Точне рішення x1 = 0: 0.05: 0.25; y1 = fi (x1); % Графік рішення функцією ode23 і точного рішення. plot (x1, y1, '-g; exact solution;', X23, Y23, '* b; ode23;'); grid on; figure (); % Графік рішення функцією ode45 і точного рішення. plot (x1, y1, '-g; exact solution;', X45, Y45, '* b; ode45;'); grid on; Лістинг 9.8. Рішення завдання 9.1 за допомогою ode23, ode45.
на Мал. 9.5 представлено рішення, знайдене за допомогою функції з точністю 1E-5 і точне рішення. на Мал. 9.6 представлено рішення, знайдене за допомогою функції з точністю 1E-4 і точне рішення.
функції і дозволяють знайти рішення із заданою точністю, проте, як і слід було очікувати, при використанні методу Рунге-Кутта більш високої точності крок зміни змінної набагато менше.
Розглянемо приклад вирішення жорсткої системи диференціальних рівнянь. Нагадаємо читачеві визначення жорсткої системи диференціальних рівнянь. Система диференціальних рівнянь -го порядку
називається жорсткої [ 2 ], Якщо виконані наступні умови:
Приклад 9.2. Вирішити задачу Коші для жорсткої системи диференціальних рівнянь:
Рішення завдання з коментарями представлено в лістингу 9.9 , на Мал. 9.7 можна побачити графік вирішення.
% Функція правої частини жорсткої системи диференціальних рівнянь. function dx = syst1 (t, x) B = [119.46 185.38 126.88 121.03; -10.395 -10.136 -3.636 8.577; -53.302 -85.932 -63.182 -54.211; -115.58 -181.75 -112.8 -199]; dx = Bx; end% Визначення параметрів управління ходом рішення жорсткої% системи диференціальних рівнянь. % RelTol - відносна точність рішення 1E-8,% AbsTol - абсолютна точність рішення 1E-8,% InitialStep - початкове значення кроку зміни змінної 0.02,% MaxStep - максимальне значення кроку зміни змінної 0.1. par = odeset ( "RelTol", 1e-8, "AbsTol", 1e-8, 'InitialStep', 0.02, 'MaxStep', 0.1); % Рішення жорсткої системи диференціальних рівнянь. [A, B] = ode2r (@ syst1, [0 5], [1; 1; 1; 1], par); % Побудова графіка рішення. plot (A, B, '-k'); grid on; Лістинг 9.9. Рішення задачі Коші для жорсткої системи диференціальних рівнянь (приклад 9.2)
Цим прикладом ми закінчуємо короткий опис можливостей Octave для вирішення диференціальних рівнянь. Однак, слід пам'ятати про наступне: рішення реального диференціального рівняння (а тим більше системи) - досить складна математична задача. Для її вирішення недостатньо знання синтаксису функцій Octave, необхідно досить глибоко знати математичні методи вирішення подібних завдань. При вирішенні диференціальних рівнянь необхідно визначити метод вирішення і тільки потім намагатися використовувати вбудовані функції або писати свої. Автори не випадково досить докладно нагадали читачеві основні чисельні методи рішення диференціальних рівнянь і систем. На наш погляд без знання чисельних і аналітичних методів рішення диференціальних рівнянь, досить проблематично вирішити реальну задачу.
Крім того, слід пам'ятати, що функціями можливості пакета не обмежуються. Octave надає достатню кількість функцій для вирішення диференціальних рівнянь різного виду. Вони докладно описані в довідці консольної версії пріложенія2.
Безліч функцій для вирішення диференціальних рівнянь знаходиться в пакеті розширень odepkg. Короткий опис функцій цього пакету англійською мовою з деякими прикладами наведено на сторінці http://octave.sourceforge.net/odepkg/overview.html .