Многошаговые методы решения дифференциальных уравнений
Характеристика многошаговых методов Адамса (явного и неявного), прогноза и коррекции. Специфика их описания и принципов, анализ применения к конкретной задаче, код программы решения данных методов на языке программирования 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
