Потім
(коректор) по формулі (2.16). Схема має перший порядок погрішності.– Схема Рунге-Кутта 4-го порядку
Використовуючи в (2.5) формулу Симпсона, одержимо:
(2.18)Найбільше часто розраховують неявне по
рівняння за наступною схемою:Спочатку розраховують предиктор виду:
(2.19)потім коректор по формулі:
(2.20)Оскільки формула Симпсона має п'ятий порядок погрішності, то точність? (h) – четвертого порядку.
Багатокрокові схеми
Багатокрокові методи рішення задачі Коші характеризуються тим, що рішення в поточному вузлі залежить від даних не в одному попередньому або наступному вузлі сітки, як це має місце в одно крокових методах, а залежить від даних у декількох сусідніх вузлах.
Ідея методів Адамса полягає в тім, щоб для підвищення точності використовувати обчислені вже на попередніх кроках значення
Якщо замінимо в (2.5) вираження інтерполяційним багаточленом Ньютона, побудованого по вузлах
, то після інтегрування на інтервалі одержимо явну схему Адамса. Якщо замінимо в (2.5) вираження на багаточлен Ньютона, побудованого по вузлах , то одержимо неявну інтерполяційну схему Адамса.– Явна екстраполяційна схема Адамса 2-го порядки
(2.21)Схема двох крокова, тому необхідно для розрахунків знайти за схемою Рунге-Кутта 2-го порядку
, після чого , , … обчислюють по формулі (2.21)– Явна екстраполяційна схема Адамса 3-го порядки
(2.22)Схема двох крокова, тому необхідно спершу знайти
й за схемою предиктор-коректор 4-го порядку, після чого , , … обчислюють по формулі (2.22).3. Опис використовуваного методу
Для рішення системи диференціальних рівнянь обрана неявна схема Адамса 3-го порядки, як одна з найбільш точних схем для рішення задачі Коші. Щоб прийти до неявної схеми Адамса, замінимо вираження в рівнянні:
(3.1)інтерполяційним багаточленом Ньютона 2-го порядки, виду:
(3.2)Після інтегрування отриманого вираження на інтервалі
, приходимо до рівняння неявної схеми Адамса 3-го порядки: . (3.3)Дана схема не дозволена явно відносно
, тому спочатку необхідно обчислити будь-яким підходящим методом, наприклад методом Рунге-Кутта четвертого порядку. Потім для знаходження потрібно використовувати метод простої ітерації: , (3.4)де s=1,2,3,… – номер ітерації. Умова виходу із циклу ітераційної процедури:
де? – задана погрішність.
Початкове наближення задається формулою для явної схеми Адамса 2-го порядки:
. (3.6)Схема стійка, сходиться швидко. Найчастіше досить однієї ітерації. Порядок погрішності? (h) неявної схеми Адамса третього порядку дорівнює чотирьом.
4. Опис блок-схеми алгоритму
При розробці програми були побудовані блок-схеми алгоритму програми, що спрощують процес проектування й полегшують розуміння вихідного коду готової програми (див. Додаток 1).
Блок-схема алгоритму умовно розбита на 11 блоків.
Головна функція програми відповідає за обробку події створення форми, взаємодія зі стандартним компонентом Tсhart, а також за реалізацію рішення системи диференціальних рівнянь неявною схемою Адамса 3-го порядки. Блок-схема алгоритму рішення задачі Коші розбитий умовно на 35 блоків:
1-й блок відповідає за ручне уведення інтервалу [a, b], на якому шукається рішення системи; кількості кроків сітки nx; крок висновку результатів на екран np; рядків u1 і v1, що відповідають рівнянням системи; значення шуканих функцій на початку заданого інтервалу; припустима погрішність e.
У другому блоці відбувається обчислення кроку h і установка поточного вузла на x=a. Блок 3 – функція перетворення вихідних записів рівнянь системи в рівносильні їм рядка з формою записом математичних операцій (див. далі «алгоритм зворотного польського запису»). Як аргументи функції виступають уведені раніше рядка u1 і v1.
Блоки 4–15 – розрахунок перших 2-х крапок заданої сітки методом Рунге-Кутта 4-го порядку. У даних блоках і далі використовується користувальницька функція FPR, що розраховує значення рівнянь, що вводяться користувачем, у вузлах заданої сітки. Як аргументи функції виступають: уже перетворені у зворотний польський запис рядка, що задають рівняння системи; поточне значення x; значення шуканих функцій на попередньому кроці (умовно позначаємо
).У блоках 16–34 у циклі (16) розраховуються значення шуканих рішень у вузлах 2-nx заданої сітки неявною схемою Адамса 3-го порядки. Цикл 21–29 здійснює ітераційну процедуру неявної схеми. Умова виходу із цього циклу – виконання нерівності de<e, де de – найбільший з модулів
, e – задана точність. Оскільки на екран виводяться значення шуканих функцій не у всіх вузлах, а тільки у вузлах з номером, кратним кроку висновку nx, що вводиться із клавіатури, то блоки 33–34 здійснюють вибір цих вузлів.Перетворення у зворотний польський запис відбувається за наступними правилами:
Розглядаємо по черзі кожний символ:
1. Якщо цей символ – число (або змінна), то просто поміщаємо його у вихідний рядок.
2. Якщо символ – знак операції (+, -, *, /,^), то перевіряємо пріоритет даної операції. Операція піднесення в ступінь має найвищий пріоритет (дорівнює 4). Операції додавання й вирахування мають менший пріоритет (дорівнює 2). Найменший пріоритет (дорівнює 1) має відкриваюча дужка.
Одержавши один із цих символів, ми повинні перевірити стек:
а) Якщо стік усе ще порожній, або символи, що перебувають у ньому (а перебуває в ньому можуть тільки знаки операцій і відкриваюча дужка) мають менший пріоритет, чим пріоритет поточного символу, те поміщаємо поточний символ у стек.
б) Якщо символ, що перебуває на вершині стека має пріоритет, більший або дорівнює пріоритету поточного символу, те витягаємо символи зі стека у вихідний рядок доти, поки виконується ця умова; потім переходимо до пункту а).
3. Якщо поточний символ – відкриваюча дужка, то поміщаємо її в стек.
4. Якщо поточний символ – закриваюча дужка, то витягаємо символи зі стека у вихідний рядок доти, поки не зустрінемо в стеці відкриваючу дужку (тобто символ із пріоритетом, рівним 1), яку варто просто знищити. Закриваюча дужка також знищується.
Якщо весь вхідний рядок розібраний, а в стеці ще залишаються знаки операцій, витягаємо їх зі стека у вихідний рядок.
Згідно із цими правилами створений модуль «Unit3.cpp», що містить функцію перетворення рядка у зворотний польський запис OPZ (блок 3 у блок-схемі алгоритму), алгоритм якої наведений у додатку. У даному модулі використані також допоміжні функції PUSH, PRIOR, DEL. Функція PUSH записує в стек, на вершину якого вказує HEAD, символ a. Повертає покажчик на нову вершину стека. Функція PRIOR обчислює пріоритет поточного символу, природно, лише в тому випадку, якщо поточний символ – математична операція. Функція DEL видаляє символ.
Для роботи з отриманим зворотним польським записом створена функція (блок 4), організована у вигляді модуля, що підключається, «Unit5.cpp». Блок-схема даної функції наведена в додатку. На початковому етапі (блоки 1–13) у циклі аналізується рядок, що містить зворотний польський запис. Якщо символ раніше задекларований ('x', 'u', 'v', 'e', '1'..'9'), те його значення заноситься в поточний елемент масиву th. На наступному етапі (блоки 14–29) здійснюється «зворотний хід» польської нотації: аналізується кожний символ рядка, і якщо цей символ раніше задекларований, те його значення міститься в стек (блоки 15–17). У випадку, якщо поточний символ – знак математичної операції, то зі стека витягають останні два елементи й з ними проводиться зазначена операція. Результат заноситься на вершину стека. Стік у функції реалізований у вигляді односпрямованого масиву типу double. Функція повертає перший елемент стека.