Задания по численным методам

              Теоретическая часть

     Программа предназначена для  численного  решения  системы

обыкновенных дифференциальных уравнений вида:

     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г.

Вместе с этим смотрят:

Задача оперативного планирования производства
Законы логики
Запись дифференциальных уравнений
Золотое сечение