Схема не разрешена в явном виде, поэтому требуется итерационная процедура:
где s=1,2,… – номер итерации. Обычно схема сходится за 3-4 итерации.
Так как формула трапеций имеет третий порядок точности, то погрешность апроксимации – второй.
Схемы с дробным шагом
– Схема предиктор-корректор (Рунге-Кутта) 2-го порядка
Используя в (2.5) формулу средних, получим:
,(2.16)где
– решение системы на середине интервала [xk, xk+1] . Уравнение явно разрешено относительно , однако в правой части присутствует неизвестное значение . Поэтому сначала расчитывают (предиктор): . (2.17)Затем расчитывают
(корректор) по формуле (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,… – номер итерации. Условие выхода из цикла итерационной процедуры:
, (3.5)где ε – заданная погрешность.
Начальное приближение задаётся формулой для явной экстраполяционной схемы Адамса 2-го порядка:
. (3.6)Схема устойчива, сходится быстро. Чаще всего достаточно одной итерации. Порядок погрешности ε(h) неявной схемы Адамса третьего порядка равен четырём.
4. Описание блок-схемы алгоритма
При разработке программы были построены блок-схемы алгоритма программы, упрощающие процесс проектирования и облегчающие понимание исходного кода готовой программы (см. Приложение 1).
Блок-схема алгоритма условно разбита на 11 блоков.
Главная функция программы (блоки 1,2,5) отвечает за обработку события создания формы, взаимодействие со стандартным компонентом 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), которую следует просто уничтожить. Закрывающая скобка также уничтожается.