Многошаговые методы решения дифференциальных уравнений

Характеристика многошаговых методов Адамса (явного и неявного), прогноза и коррекции. Специфика их описания и принципов, анализ применения к конкретной задаче, код программы решения данных методов на языке программирования Borland C++ Builder 6.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 01.12.2009
Размер файла 31,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

12

Введение

Данная курсовая работа включает в себя три многошаговых метода решения обыкновенного дифференциального уравнения.

Использующиеся многошаговые методы решения обыкновенного дифференциального уравнения:

1. Явный метод Адамса - Башфорта.

2. Неявный метод Адамса - Моултона.

3. Метод прогноза и коррекции.

Также данная курсовая работа включает в себя: описание метода, применение метода к конкретной задаче (анализ), код программы решения вышеперечисленных методов на языке программирования Borland C++ Builder 6.

Описание метода

Наша задача состоит в том, чтобы рассмотреть и реализовать в программном виде многошаговые методы Адамса (явные и неявные) и метод прогноза и коррекции.

Рассмотрим задачу Коши:

y' = f(x,y) , a? x?b (1)

y(a) =y0 (2)

Точность вычислений в отличие от одношаговых методов можно увеличить, если использовать информацию о нескольких предыдущих точках xk , xk-1 , …

Большой и важный класс многошаговых методов возникает на основе следующего подхода. Если подставить в формулу (1) точное решение y(x) и проинтегрировать это уравнение на отрезке (xk , xk+1 ), то получим:

, (3)

где в последнем члене предполагаем, что p(x) - полином, аппроксимирующий f(x,y(x)) . Чтобы построить этот полином, предположим, что yk , yk-1 , … , yk-n - приближения к решению в точках xk , xk-1 , … , xk-n . Мы по-прежнему считаем, что узлы расположены равномерно с шагом h. Тогда fi = f(xi , yi ) (i = k, k-1, …, k-n) есть приближения к f(x,y(x)) в точках xk , xk-1 , … , xk-n , и мы в качестве p возьмём полином для набора данных (xi , fi ) (i = k, k-1, …, k-n) . Таким образом, p - полином степени n , удовлетворяющий условиям p(xi ) = fi , (i = k, k-1, …, k-n). В принципе, можно проинтегрировать этот полином явно, что ведёт к следующему методу:

(4)

В простейшем случае, когда n=0 , полином p есть константа, равная fk и (4) превращается в обычный метод Эйлера. Если n=1 , то p есть линейная функция, проходящая через точки (xk -1 , fk -1 ) и (xk , fk ) ,т.е.

.

Интегрируя этот полином от xk до xk +1, получаем следующий метод:

, (5)

который является двухшаговым, поскольку использует информацию в двух точках xk и xk -1 .

Аналогично, если n=2,то p есть квадратичный полином, интерполирующий данные (xk -2 , fk -2 ) , (xk -1 , fk -1 ) и (xk , fk ) , а метод имеет вид:

(6)

Если n=3 , то интерполяционный полином является кубическим, а соответствующий метод определяется формулой:

(7)

Методы (6) и (7), соответственно называются трёхшаговым и четырёхшаговым.

Формулы (5)-(7) известны как явные методы Адамса (Адамса-Башфорта), т.к. они для нахождения yk+1 не требуют решения никаких уравнений. Метод (5) имеет второй порядок точности, поэтому его называют методом второго порядка. Аналогично, методы (6) и (7) называют соответственно методами Адамса-Башфорта третьего и четвёртого порядков.

Методы Адамса-Башфорта используют уже сосчитанные значения в точке xk и в предыдущих точках. В принципе, при построении интерполяционного полинома мы можем использовать и точки xk+1 , xk+2 и т.д. Простейший случай при этом состоит в использовании точек xk+1 , xk , … , xk-n и построении интерполяционного полинома степени n+1 , удовлетворяющего условиям p(xi )= fi (i = k+1, k, …, k-n) . При этом возникает класс методов, известных как неявные методы Адамса (Адамса-Моултона).

Если n=0, то p - линейная функция, проходящая через точки (xk , fk ) и (xk+1 , fk+1 ) , и соответствующий метод

(8)

является методом Адамса-Моултона второго порядка.

Если n=2, то p - кубический полином, построенный по точкам (xk+1 , fk+1 ) , (xk , fk ), (xk -1 , fk -1 ) и (xk -2 , fk -2 ), и соответствующий метод

(9)

является методом Адамса-Моултона четвёртого порядка.

Заметим теперь, что в формулах (8) и (9) значение fk+1 неизвестно. Дело в том, что для вычисления f(xk+1 , yk+1 )= fk+1 нужно знать значение yk+1 , которое само пока является неизвестным. Следовательно, методы Адамса-Моултона определяют yk+1 только неявно. Так, например, соотношение (8) действительно является уравнением относительно неизвестного значения yk+1. То же самое справедливо и относительно (9). В силу этого методы Адамса-Моултона называются неявными. В то же время методы Адамса-Башфорта называют явными, поскольку они для нахождения значения yk+1 не требуют решения никаких уравнений.

Теперь рассмотрим метод прогноза и коррекции. Он также относится задачам класса Коши, а именно к численным решениям многошаговыми методами.

Рассмотрим 2-х шаговый метод прогноза и коррекции. Пусть дано ДУ для которого известно значение функции в двух соседних узлах сетки

, (xk-1, yk-1) и (xk, yk).

Сначала строится прогноз значения по формуле Адамса-Башфорта

.

Затем это значение корректируется по более точной формуле.

Для того чтобы начать расчет методом прогноза и коррекции, необходимо знать значения функции в двух первых узлах сетки - x0 и x1 - (x0, y0) и (x1, y1). Обычно значение в узле x1 определяется каким-либо одношаговым методом.

На каждом шаге построения решения методом прогноза и коррекции требуется вычислить всего одно значение функции, а одно берется из предыдущего узла сетки.

Применение метода к конкретной задаче (анализ)

Дано дифференциальное уравнение вида

4xy'' + 2y' + y = 0, x[1,2], где y(1)=1,38177, y'(1)=-0,15058.

Точное решение этого уравнения имеет вид .

Задача состоит в том, чтобы решить это дифференциальное уравнение, применив многошаговые методы решения ОДУ: явный метод Адамса-Башфорта, неявный метод Адамса-Моултона, метод прогноза и коррекции.

Как было описано выше данное уравнение можно решить как методом второго порядка, так и методами третьего и четвертого порядков. Но я применил методы второго порядка во всех трех случаях (в случае метода Адамса-Башфорта применил формулу (5), в Адамсе-Моултоне применил формулу (8), а в методе прогноза и коррекции прогноз строится по формуле (5), а коррекция по формуле (8)).

Изучив методы и применив их к данному дифференциальному уравнению, приходим к такому выводу: при решении данного уравнения тремя известными способами при шаге h=0,1 все три метода дают хорошую точность.

Достоинством метода решения ОДУ заключается в том, что в каждой точке рассчитывается только одно значение функции f(x,y) и они являются весьма экономичными по затратам времени вычислений при достаточной точности.

К недостаткам можно отнести невозможность старта многошагового метода из единственной начальной точки, так как для вычислений по k-шаговой формуле необходимо значение значения функции в k узлах. Поэтому приходится (k-1) решение в первых узлах x1, x2, …, xk-1 получать с помощью какого-либо одношагового метода (я применил метод Рунге-Кутте 2-го порядка). Другим недостатком является невозможность изменения шага в процессе решения, что легко реализуется в одношаговых методах.

Листинг программы

#include <vcl.h>

#pragma hdrstop

#include "UMoreStep.h"

#include <math.h>

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int n=10;

double x1=1,x2=2;

double x[100],y[100],p_y[100];

double h=(x2-x1)/n;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

double dif_ur(double x,double y,double p_y)

{

return ((-2*p_y-y)/(4*x));

}

void __fastcall TForm1::Button_BashClick(TObject *Sender)

{

Label_TypeMethod->Caption="Aaain-Aaooi?o";

y[0] = 1.38177

x[0] = x1;

p_y[0] = -0.15058;

x[1] = x[0] + h;

p_y[1]=p_y[0]+(h/2)*(dif_ur(x[0],y[0],p_y[0])+dif_ur(x[0]+h,y[0],p_y[0]+h*dif_ur(x[0],y[0],p_y[0])));

y[1]=y[0]+(h/2)*(p_y[0]+p_y[1]);

for(int i=1;i<n+1;i++)

{

x[i+1]=x[i]+h;

p_y[i+1]=p_y[i]+h/2*(3*dif_ur(x[i],y[i],p_y[i])-dif_ur(x[i-1],y[i-1],p_y[i-1]));

y[i+1]=y[i]+h/2*(3*p_y[i]-p_y[i-1]);

}

for (int j = 0; j <= n; j++)

{

StringGrid1->Cells[0][j]=FloatToStr(x[j]);

StringGrid1->Cells[1][j]=FloatToStr(y[j]);

StringGrid1->Cells[2][j]=FloatToStr(sin(sqrt(x[j]))+cos(sqrt(x[j])));

StringGrid1->Cells[3][j]=FloatToStr(fabs(StrToFloat(StringGrid1->Cells[2][j])-y[j]));

}

}

void __fastcall TForm1::Button_ExitClick(TObject *Sender)

{

Close();

}

void __fastcall TForm1::Button_MolClick(TObject *Sender)

{

Label_TypeMethod->Caption="Aaain-Iioeoii";

y[0] = 1.38177;

x[0] = x1;

p_y[0] = -0.15058;

for(int i=0;i<n+1;i++)

{

x[i+1]=x[i]+h;

p_y[i+1] = p_y[i] + (h * dif_ur(x[i], y[i], p_y[i]) + h * dif_ur(x[i] + h, y[i] + h * p_y[i], p_y[i] + h * dif_ur(x[i], y[i], p_y[i]))) / 2;

y[i+1] = y[i] + h * (p_y[i] + h * dif_ur(x[i], y[i], p_y[i]) / 2);

p_y[i+1] = (p_y[i] + h * (dif_ur(x[i] + h, y[i+1], p_y[i+1]) + dif_ur(x[i], y[i], p_y[i])) / 2);

y[i+1] = y[i] + h * (p_y[i+1] + p_y[i]) / 2;

}

for (int j = 0; j <= n; j++)

{

StringGrid1->Cells[0][j]=FloatToStr(x[j]);

StringGrid1->Cells[1][j]=FloatToStr(y[j]);

StringGrid1->Cells[2][j]=FloatToStr(sin(sqrt(x[j]))+cos(sqrt(x[j])));

StringGrid1->Cells[3][j]=FloatToStr(fabs(StrToFloat(StringGrid1->Cells[2][j])-y[j]));

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

Button_Bash->Visible=true;

Button_Mol->Visible=false;

Button_Cor->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

Button_Bash->Visible=false;

Button_Mol->Visible=true;

Button_Cor->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton3Click(TObject *Sender)

{

Button_Bash->Visible=false;

Button_Mol->Visible=false;

Button_Cor->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_CorClick(TObject *Sender)

{

Label_TypeMethod->Caption="I?aaeeoi?-ei??aeoi?";

y[0] = 1.38177;

x[0] = x1;

p_y[0] = -0.15058;

x[1] = x[0] + h;

p_y[1]=p_y[0]+(h/2)*(dif_ur(x[0],y[0],p_y[0])+dif_ur(x[0]+h,y[0],p_y[0]+h*dif_ur(x[0],y[0],p_y[0])));

y[1]=y[0]+(h/2)*(p_y[0]+p_y[1]);

for(int i=1;i<n+1;i++)

x[i+1]=x[i]+h;

p_y[i+1] = p_y[i] + h * (3 * dif_ur(x[i],y[i],p_y[i]) - dif_ur(x[i-1],y[i-1],p_y[i-1])) / 2;

y[i+1] = y[i] + h * (3* p_y[i] - p_y[i-1]) / 2;

p_y[i+1] = p_y[i] + h * (dif_ur(x[i]+h, y[i+1], p_y[i+1]) + dif_ur(x[i], y[i], p_y[i]))/2;

y[i+1] = y[i] + h * (p_y[i+1] + p_y[i])/2;

}

for (int j = 0; j <= n; j++)

{

StringGrid1->Cells[0][j]=FloatToStr(x[j]);

StringGrid1->Cells[1][j]=FloatToStr(y[j]);

StringGrid1->Cells[2][j]=FloatToStr(sin(sqrt(x[j]))+cos(sqrt(x[j])));

StringGrid1->Cells[3][j]=FloatToStr(fabs(StrToFloat(StringGrid1->Cells[2][j])-y[j]));

}

}

Результаты расчета

Метод Адамса-Башфорта

x

exact solution

y

error

1

1,38177329067604

1,38177

3,29067604005725E-6

1,1

1,36543385512386

1,36545333494318

1,94798193216625E-5

1,2

1,3467827931773

1,34661933977273

0,000163453404572925

1,3

1,32614183910416

1,32588519852612

0,000256640578043141

1,4

1,30377563353274

1,30346514735694

0,000310486175804584

1,5

1,27990532272839

1,27957128853577

0,000334034192624262

1,6

1,25471820307239

1,25438392699673

0,000334276075660152

1,7

1,2283747392501

1,22805836929195

0,000316369958149775

1,8

1,20101378595756

1,20072959517654

0,000284190781024675

1,9

1,17275654886199

1,17251584901979

0,000240699842204883

2

1,14370964075811

1,1435214460441

0,000188194714010557

Метод Адамса-Моултона

x

exact solution

y

error

1

1,38177329067604

1,38177

3,29067604005725E-6

1,1

1,36543385512386

1,36546037053267

2,65154088104422E-5

1,2

1,3467827931773

1,34682666087201

4,38676947109723E-5

1,3

1,32614183910416

1,32619402286957

5,21837654078901E-5

1,4

1,30377563353274

1,30382943566818

5,38021354416577E-5

1,5

1,27990532272839

1,27995569425606

5,03715276659314E-5

1,6

1,25471820307239

1,25476128734688

4,30842744907492E-5

1,7

1,2283747392501

1,22840756096378

3,28217136845617E-5

1,8

1,20101378595756

1,20103403374354

2,02477859798972E-5

1,9

1,17275654886199

1,17276241989401

5,87103201764609E-6

2

1,14370964075811

1,14369972745694

9,91330116907119E-6

Метод прогноза и коррекции

x

exact solution

y

error

1

1,38177329067604

1,38177

3,29067604005725E-6

1,1

1,36543385512386

1,36545333494318

1,94798193216625E-5

1,2

1,3467827931773

1,34680554703575

2,27538584458425E-5

1,3

1,32614183910416

1,32615890975456

1,70706503960812E-5

1,4

1,30377563353274

1,30378054845518

4,91492243921124E-6

1,5

1,27990532272839

1,27989334139954

1,19813288543E-5

1,6

1,25471820307239

1,25468582407744

3,23789949485528E-5

1,7

1,2283747392501

1,22831936753384

5,53717162598104E-5

1,8

1,20101378595756

1,20093350217706

8,02837804958173E-5

1,9

1,17275654886199

1,17264994579682

0,000106603065173971

2

1,14370964075811

1,1435757049175

0,000133935840614283


Подобные документы

  • Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений: Эйлера, Рунге-Кутта, Адамса и Рунге. Техники приближенного решения данных уравнений: метод конечных разностей, разностной прогонки, коллокаций; анализ результатов.

    курсовая работа [532,9 K], добавлен 14.01.2014

  • Суть основных идей и методов, особенностей и областей применения программирования для численных методов и решения нелинейных уравнений. Методы итераций, дихотомии и хорд и их использование. Алгоритм метода Ньютона, создание программы и ее тестирование.

    курсовая работа [423,0 K], добавлен 17.02.2010

  • Метод половинного деления как один из методов решения нелинейных уравнений, его основа на последовательном сужении интервала, содержащего единственный корень уравнения. Алгоритм решения задачи. Описание программы, структура входных и выходных данных.

    лабораторная работа [454,1 K], добавлен 09.11.2012

  • Разработка программы для решения системы обыкновенных дифференциальных уравнений на базе языка программирования Паскаль АВС. Чтение исходных данных из внешнего файла. Вывод исходных данных и результатов на дисплей и во внешний файл. Суть метода Ейлера.

    реферат [126,1 K], добавлен 12.01.2012

  • Математическое описание численных методов решения уравнения, построение графика функции. Cтруктурная схема алгоритма с использованием метода дихотомии. Использование численных методов решения дифференциальных уравнений, составление листинга программы.

    курсовая работа [984,2 K], добавлен 19.12.2009

  • Решение нелинейных уравнений методом простых итераций и аналитическим, простым и модифицированным методом Ньютона. Программы на языке программирования Паскаль и С для вычислений по вариантам в порядке указанных методов. Изменение параметров задачи.

    лабораторная работа [191,0 K], добавлен 24.06.2008

  • Особенности решения задач нелинейного программирования различными методами для проведения анализа поведения этих методов на выбранных математических моделях нелинейного программирования. Общая характеристика классических и числовых методов решения.

    дипломная работа [2,4 M], добавлен 20.01.2013

  • Численные методы решения нелинейных уравнений, систем линейных и нелинейных алгебраических уравнений, дифференциальных уравнений, определенных интегралов. Методы аппроксимации дискретных функций и методы решения задач линейного программирования.

    методичка [185,7 K], добавлен 18.12.2014

  • Разработка программы на языке Turbo Pascal 7.0 для преобразования кинетической схемы протекания химических реакций при изотермических условиях в систему дифференциальных уравнений. Ее решение в численном виде методом Рунге-Кутта четвертого порядка.

    курсовая работа [929,7 K], добавлен 06.01.2013

  • Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.

    курсовая работа [35,8 K], добавлен 11.06.2007

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.