Задания по численным методам
Теоретическая часть
Программа предназначена для численного решения системы
обыкновенных дифференциальных уравнений вида:
Y'=F(X,Y), с начальными условиями Y(X0)=Yo на отрезке
(X,X) методом Хемминга с постоянным шагом интегрирования. В
каждой i+1 точке находим начальное приближение Р к решению Y
по предсказывающей формуле:
Pi+1=Yi-3+4*h*(2*Y'i-Y'i-1+2*Y'i-2)/3, где
Yi-3 решение в i-3 точке,
Y'i,Y'i-1,Y'i-2 - значения производных в точках i, i-1,
i-2 соответственно.
Для улучшения решения используется корректирующая формула
Ci+1=(9*Yi-Yi-2+3*h*(M'i+1+2*Y'i-Y'i-1))/8, где
Mi+1=Pi+1-112*(P-Ci)/121; M'i+1=F(Xi+1,Mi+1).
Решение системы в i+1 точке находится по формуле
G=Wj*|Pi+1,j-Ci+1|, где
Wj=1
j- номер компоненты вектора.
На участке "разгона" значения Yi-k и Y'i-k (k=0, 1, 2)
вычисляются методом Рунге-Кутта по формуле
Yi=Ui(2)-(Ui(i)-Ui(2))/15, где i- номер точки, в которой
ищется решение, Ui- решение системы в i-ой точке, полученное с
шагом h/l;
U(l)i-m+1/l=A(l)i-m+(K(l)1+2*K(l)2+2*K(l)3+K(l)4)i--m+1/l/6,
где
j=1, 2, ..., n,
K(l)1=h*F(Xi-m,A(l)i-m)/l;
K(l)2=h*F(Xi-m+h/2*l,A(l)i-m+K(l)1/2)/l;
K(l)3=h*F(Xi-m+h/2*l,A(l)i-m+K(l)2/2)/l;
K(l)4=h*F(Xi-m+h/l,A(l)i-m+K(l)3)/l.
A, U ,K - векторы n-го порядка; l=1, 2; m=1 при l=1; m=1,
1/2 при l=2;
A(l)i-1=Y(l)i-1; A(2)i-1/2=U(2)i-1/2.
Характеристика программы.
Программа состоит из стандартной информативы, реализующей
описанный метод, рабочей информативы, задающей правые части
уравнений системы и директивы.
Длина стандартной информативы 1600 символов. Объем исход-
ных данных : 7 чисел, 2 массива, n функций. В результате рабо-
ты программы на печать выводится на участке "разгона" X, зна-
чения функций и производных, далее X, G и Y(n) на всем отрезке
интегрирования через Ю шагов и в конце отрезка.
Программа рекомендуется для решения систем обыкновенных
дифференциальных уравнений на больших отрезках, так как счита-
ет быстрее одноточечных методов. Для контроля постоянно выво-
дится погрешность вычислений G, которая позволяет следить за
точностью решения.
"Разгон" (нахождение значений функций и производных в
точках X0, X0+Q, X0+2*Q , X0+3*Q, где Q - шаг интегрирования )
осуществляется методом Рунге-Кутта с увеличенной разрядностью.
В программе предусмотрена возможность при получении боль-
шой погрешности вычисления в точка "разгона" уменьшить шаг ин-
тегрирования в этих точках (см. способ задания J), а при быст-
ром возрастании погрешности вычислений G уменьшить шаг интег-
рирования методом Хемминга или увеличить разрядность вычисле-
ний.
Программа позволяет производить интегрирование как с по-
ложительным, так и с отрицательным шагом (соответственно меня-
ются X0, Xк и Q).
Порядок решения задачи.
Для решения задачи вводятся стандартная и рабочая инфор-
мативы и директива.
В рабочей информативе после метки Ц программа вычисления
правых частей системы. Здесь Z(1)=...; Z(2)=...; ...;
Z(n)=...; - правые части исходной системы обыкновенных диффе-
ренциальных уравнений как функции от X1 и Y(1), Y(2), ...,
Y(n), X1 - соответствует аргументу, Y(I) - соответствует функ-
циям. I=1, 2, ..., N. Операторная часть рабочей информативы
заканчивается оператором перехода "НА" Ф.
В описательной части рабочей информативы задаются X0, XK
- соответственно начало и конец отрезка интегрирования, Q -
шаг интегрирования методом Хемминга, J - число, определяющее,
во сколько раз следует уменьшить шаг интегрирования методом
Рунге-Кутта на участке "разгона" для получения решения того же
порядка точности, что и в методе Хемминга,
N=n - порядок системы;
Y(n) - вектор начальных условий,
W(n) - вектор коэффициентов для вычисления невязки
W(I)=1, и описаны
A(n), B(n), C(n) - массивы значений функций в точках i-3,
i-2, i-1 соответственно,
Я(n), Б(n), Г(n), D(n) - массивы значений производных в
точках i-3, i-2, i-1, i соответственно,
Z(n) - массив правых частей,
П(n), P(n) - рабочие массивы.
В директиве задаются : R - разрядность вычислений по ме-
тоду Хемминга ("разгон" происходит с увеличенной разряд-
ностью), Ю - число, определяющее период печати (количество ша-
гов). Директива должна оканчиваться оператором "НА" HMG.
Описание работы программы
Данная расчетно-графическая работа (далее РГР) составлена
на языке PC MathLab ( PC-MATLAB (c) Copyright The MathWorks,
Inc. 1984-1989 Version 3.5f 17-July-89 Serial Number 22961) и
выполнена в виде двух модулей (третий - контрольный пример),
распечатка которых приведена в приложении.
1. Hemming.m
"Стандартный" головной модуль.
Входные данные: отсутствуют.
Выходные данные: отсутствуют.
Язык реализации: PC MathLab.
Операционная система: MS-DOS 3.30 or higher
Пояснения к тексту модуля:
Структура данного модуля элементарна. Вначале очищается
экран, задаются исходные данные для второго модуля, как X0,XK
- начальное и конечное значение, Q - шаг, J - число, определя-
ющее во сколько раз нужно уменьшать шаг интегрирования методом
Рунге-Кутта (далее Р-К) на участке "разгона" для получения то-
го же порядка точности, что и в методе Хемминга, N - порядок
системы, Y - вектор начальных значений, W - вектор коэффициен-
тов для вычисления невязки и т.д. Затем вызывается модуль ре-
шения системы в формате:
(x,y,dg)=hem('ours',x0,xk,q,j,n,y,w,ur), где
x,y - точки решения
dg - ошибка остальные параметры описаны выше.
Необходимо отметить, что несмотря на отсутствие входных и
выходных данных, внутри данного модуля задаются начальные зна-
чения и выводятся результаты вычислений в числовом виде и гра-
фиков, а также оценка по быстродействию (TIME) и количеству
выполненных операций (FLOPS), однако эти данные нельзя охарак-
теризовать как входные и выходные.
2. Hem.m
Модуль, которые непосредственно и решает систему ОДУ ме-
тодом Хемминга.
Входные данные:
FunFcn - имя функции, вычисляющей левые части
X0,XK - начальное и конечное значение для счета
Q - шаг интегрирования
J - число, определяющее во сколько раз нужно уменьшать
шаг интегрирования методом Рунге-Кутта (далее Р-К) на участке
"разгона" для получения того же порядка точности, что и в ме-
тоде Хемминга
N - порядок системы
Y - вектор начальных значений
W - вектор коэффициентов для вычисления невязки
UR - число, определяющее период печати
Выходные данные:
x - матрица точек, для которых вычислено решение
y - матрица решений
dg - ошибка интегрирования
Язык реализации: PC MathLab.
Операционная система: MS-DOS 3.30 or higher
Пояснения к тексту модуля:
Данный модуль содержит в своем теле всего одну функцию,
входные и выходные данные которой являются входными и выходны-
ми данными текущего модуля. Они описаны выше. Мы же займемся
описанием данной функции:
После описания функции HEM устанавливается формат выход-
ных данных LONG E, а также происходит инициализация рабочих
массивов, как массивы значений функции в точках i-3, i-2, i-1;
массивы значений производных в этих же точках, массивы правых
частей и т.д. Всвязи с отсутствием в языке MathLab конструкции
безусловного перехода, используется конструкции While 1 (бес-
конечный цикл), Break (переход к началу While) и IF (Если).
Из-за таких немного "странных" конструкций вся дальнейшая
часть программы может быть весьма условно представлена такой
схемой:
While (не конец расчетов)
While 1
...
IF
...
...
END
...
...
IF
...
...
...
END
...
end
end
В целом, в данных циклах вычисляется номер шага, и если
он меньше 5, то вычисления сводятся к вычислению методом Р-К,
а если больше 5, то производятся вычисления по методу Хемминга
со всеми своими дополнительными действиями, как вычисление по
корректирующей формуле и т.д. В обоих случаях происходит об-
новление рабочих и других промежуточных массивов и вывод ин-
формации на экран. В случае решения в точках "разгона" вычис-
ляются также коэффициенты K1, K2, K3, K4, используемые в мето-
де Р-К. Также функция сама проверяет точность вычислений и в
случае необходимости корректирует шаг. Если шаг "сделан", то
программа выводит результаты на экран и заносит их в массив,
который представлен в виде нескольких столбцов. Также в необ-
ходимых для функции случаях она обращается к подпрограмме
FunFcn, которая занимается вычислением левых частей, вызов и
возврат значений которой должен быть следующим:
Z=feval(FunFcn,x,y), где
Z - вектор вычисленных левых частей,
X,Y - векторы точек, для которых производится вычисление.
Для удобства отладки и описания, программа разбита на
части, обозначенные русскими заглавными буквами (Ш,Щ,Л и
т.д.), которые соответствуют блокам, обозначенным в примере
программы, приведенной в задании. Несмотря на то, что приве-
денная программа написана на условном языке, прокомментировать
текст нашей программы на языке MathLab довольно удобно с ис-
пользованием данных обозначений (Конечно, часть блоков опуще-
на, в связи с отсутствием принципиальной значимости. Кроме то-
го изменен порядок появления блоков в программе):
"Э" - начальное вычисление левых частей.
"Ф" - общий цикл, в котором и происходят собственно все
вычисления. Он начинается с конструкций:
While (xk-x1)>0
While 1,
то есть пока не будет достигнут конец, все вычисления
происходят внутри этого цикла.
Также внутри блока "Ф" происходят вычисления корректирую-
щей формулы IAR(i) а также оценка погрешности вычислений G,
если они еще не были рассчитаны на предыдущем шаге.
"Ц" - вычисление левых частей.
"Щ" - на этом этапе происходит перемещение данных в рабо-
чих массивах и X=X+H, то есть происходит переход к следующему
шагу. Также на этом этапе происходит вывод на экран и формиро-
вание выходных массивов Yout, Xout, DGout.
"Л" - в этом блоке происходит расчет самой предсказываю-
щей формулы метода Хемминга - P(i) и Y(i) и происходит расчет
левых частей, т.е. снова в программе появляется блок "Ц".
Затем опять продолжается блок "Ф". Идет проверка на каком
шаге мы находимся и, если он (шаг) меньше 5, то идет подготов-
ка к расчету методом Р-К, то есть идет участок "разгона". Со-
ответственно идет расчет коэффициентов K1, K2, K3 и K4, необ-
ходимых для метода Р-К. Также внутри данного блока еще раз
встречается блок "Ц", в котором происходит расчет левых час-
тей, необходимых для метода Р-К.
Далее происходит проверка шага и уменьшение или увеличе-
ние его в соответствии с заданной точностью. Для возможности
"отката" в случае большого или маленького шага используется
переменная Х1. Также еще раз встречается блок "Ц". Затем, в
случае если все коэффициенты К1-К4 вычислены и шаг удовлетво-
ряет требованиям точности, то происходит расчет методом Р-К,
а также, естественно происходит формирование выходных массивов
Yout, Xout и DGout, а также происходит переход к следующему
шагу (то есть X=X+H) и переход к блоку "Э".
На этом кончается блок "Ф" и вся функция. В начале блока
"Ф" происходит проверка на конец вычислений и если расчеты за-
кончились, то есть мы достигли Xk то происходит возврат в го-
ловную программу. Все выходные данные формируются внутри блока
"Ф", поэтому никаких дополнительных действий не производится.
Сравнительный анализ и оценка быстродействия
Для сравнения полученных результатов с другими методами
используется метод Адамса, разработанный другой бригадой.
Число операций в методе Хемминга: порядка 2200.
Быстродействие: порядка 0,8 секунды.
Число операций в методе Адамса: порядка 560.
Быстродействие: порядка 0,55 секунды.
(Вычисления проводились на компьютере i486DX4-100)
Как видно из вышеприведенных данных, метод Хемминга проигрывает
по временным показателям и по затратам машинного времени методу Адам-
са, однако стоит заглянуть в приложение, где приведены распечатки гра-
фиков решений и ошибок обоих методов и сразу видно, что метод Адамса
не справляется с контрольным примером для нашей системы, так как ошиб-
ка у него к концу вычислений (Xk=1) возрастает, а в "нашем" методе -
стремится к 0.
Выводы
Данная РГР по предмету "Численные методы в экономике" ре-
ализует метод Хемминга, который предназначен для решения зада-
чи Коши для обыкновенных дифференциальных уравнений. Програм-
ма, написанная на языке MathLab, хотя и не является оптималь-
ной, но решает поставленную задачу и решает ОДУ довольно боль-
ших степеней сложности, с которыми не справляются другие мето-
ды (например метод Адамса). Это связано с тем, что метод Хем-
минга является многоточечным, а в связи с этим и повышается
точность вычислений, а также устойчивость метода. Однако дан-
ный метод требует больших вычислительных затрат, что связано с
довольно громоздкими формулами а также с большим объемом вы-
числений и поэтому для относительно простых систем целесооб-
разно использовать более простые методы решения.
Список литературы
1. Д.Мак-Кракен, У.Дорн. "Численные методы и программиро-
вание на Фортране", Издательство "Мир", М. 1977г.
2. О.М.Сарычева. "Численные методы в экономике. Конспект
лекций", Новосибирский государственный технический универси-
тет, Новосибирск 1995г.
3. Н.С.Бахвалов. "Численные методы", Издательство "Нау-
ка", М. 1975г.