Таблица 5.2 – Результаты решения задачи Коши методом Рунге-Кутта с непостоянным шагом.
X | u(x) | v(x) |
2 | 4 | 7,389056099 |
2,2 | 4,4 | 9,025013486 |
2,4 | 4,8 | 11,02317634 |
2,6 | 5,2 | 13,46373796 |
2,8 | 5,6 | 16,44464663 |
3 | 6 | 20,08553669 |
3,2 | 6,4 | 24,53252981 |
3,4 | 6,8 | 29,96409944 |
3,6 | 7,2 | 36,59823348 |
3,8 | 7,6 | 44,701183 |
4 | 8 | 54,59814775 |
Как видно из полученных таблиц результатов, точность решения в 0.0001 при решении методом Рунге-Кутта с непостоянным шагом достигается всего за 10 шагов, в то время, когда для достижения этой же точности при решении методом Рунге-Кутта 5-го порядка с постоянным шагом требуется около 100 шагов.
Сравнивая полученные результаты с результатами работы программы “Adams3.exe”, приходим к выводу, что неявная схема Адамса третьего порядка достаточно эффективна при численном решении задачи Коши (быстрота, высокая точность решения), однако по своим характеристикам она уступает более совершенным методам, применяющимися в различных математических пакетах.
Заключение
Результатом выполнения курсового проекта является готовый программный продукт, позволяющий решать задачу Коши для системы дифференциальных уравнений при помощи неявной схемы Адамса 3-го порядка, демонстрирующий возможности численного решения поставленной задачи с заданной степенью точности.
Готовый программный продукт может найти широкое применение при решении многих прикладных технических программ, а в частности, эффективно использование применённой схемы Адамса 3-го порядка для решения так называемых “жёстких” систем дифференциальных уравнний, для которых существует лишь численное решение.
Данная программа решает заданную пользователем систему дифференциальных уравнений с указанной точностью за минимальный промежуток времени. При этом пользователю предоставляется возможность визуально оценить неточность решения, сравнивая графики полученного и точного решений.
К достоинствам программы можно отнести также удобный пользовательский интерфейс, возможность ввода пользовательских систем дифференциальных уравнений, а также высокая стабильность работы. Однако имеются и некоторые недостатки. К недостаткам программы можно отнести: критичность к вводимым пользователем функций, отсутсвие обработки исключительных событий. Это, естественно, ограничивает возможности программы.
Литература
1. Архангельский А.Я. Программирование в С++ Builder 6. – М.: ЗАО “Издательство БИНОМ”, 2002. – 360 с.
2. Калиткин Н.Н. Численные методы. ¾ М.: Наука, 1978. ¾ 512 с.
3. Самарский А.А., Гулин А.В. Численные методы. ¾ М.: Наука, 1989. – 432с.
4. Синицын А.К., Навроцкий А.А. Алгоритмы вычислительной математики. - Мн.: БГУИР,2002. – 80 с: ил.
5. Синицин А.К. Программирование алгоритмов в среде BuilderC++. –Мн.: БГУИР, 2004. – 90 с.: ил.
6. Страуструп Бьерн. Язык программирования C++. –М.: ЗАО “Издательство БИНОМ”, 2002. – 1099c.:ил.
7. Шилд Г. Программирование на BorlandC++ для профессионалов— М.:ООО “попурри” ,1999. – 800c.:ил.
Приложения
Приложение 1
Блок-схема алгоритма
Блок-схема решения задачи Коши неявной схемой Адамса 3-го порядка.
Блок-схема алгоритма преобразования строки в обратную польскую запись:
Блок-схема вычисления функций:
Приложение 2
Листинг программы
Главная программа (Unit1.cpp):
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "math.h"
#include "stdio.h"
#include "Unit3.h"
#include "Unit5.h"
#include "fstream.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char *opz(char *); // ф-ия преобразования в обратную польскую запись;
double fpr(char *str,double u, double v,double x); // обратныйходпольской
int p=1,s=1,j=1,o=0; // записи;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N7Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender) // очисткаформы
{
Edit1->Clear();
Edit2->Clear();
Edit3->Clear();
Edit4->Clear();
Edit5->Clear();
Edit6->Clear();
Edit7->Clear();
Edit8->Clear();
Edit9->Clear();
Memo1->Clear();
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="10";
Edit2->Text="1";
Edit3->Text="2";
Edit4->Text="4";
Edit5->Text="0,0001";
Edit6->Text="4";
Edit7->Text=FloatToStrF(exp(2),ffFixed,20,18);
Memo1->Text="результаты программы";
Button1->Show();
}
//---------------------------------------------------------------------------
void __fastcallTForm1::Button1Click(TObject *Sender) //обработка события нажатия кнопки «выполнить»
{
//---------------------------------------------------------------------------
int nx,np,k,i,n;
double a,b,e,h,d,de,z,x;
double y[2],yp[2],f[2],fm[2],fp[2],fp1[2],fp2[2];
unsigned long int time=GetTickCount();
unsigned long int time1=0;
a=StrToFloat(Edit3->Text);
b=StrToFloat(Edit4->Text);
e=StrToFloat(Edit5->Text);
nx=StrToInt(Edit1->Text);
np=StrToInt(Edit2->Text);
Memo1->Clear();
Memo1->Lines->Add("Входныеданные:");
Memo1->Lines->Add("");
Memo1->Lines->Add("du/dx="+Edit8->Text+";");
Memo1->Lines->Add("dv/dx="+Edit9->Text+";");
Memo1->Lines->Add("Интервал: ["+Edit3->Text+";"+Edit4->Text+"]");
Memo1->Lines->Add("Допустимаяпогрешность: е="+Edit5->Text);
Memo1->Lines->Add("Начальныеусловия:");
Memo1->Lines->Add("u="+Edit6->Text);
Memo1->Lines->Add("v="+Edit7->Text);
Memo1->Lines->Add("Количествошаговсетки: "+Edit1->Text);
Memo1->Lines->Add("Шагвывода: "+Edit2->Text);
Memo1->Lines->Add("");
Memo1->Lines->Add("");
char *u1 =(char *)malloc(strlen(Edit8->Text.c_str())+1);
char *v1 =(char *)malloc(strlen(Edit9->Text.c_str())+1);
strcpy(u1,Edit8->Text.c_str());
strcpy(v1,Edit9->Text.c_str());
char *u =(char *)malloc(strlen(u1)+1); //динамическое выделение памяти
char *v =(char *)malloc(strlen(v1)+1);
strcpy(u,opz(&(u1[0]))); // преобразование в обратную польскую запись
strcpy(v,opz(&(v1[0])));
do {
h=(b-a)/nx;
x=a;
y[0]=StrToFloat(Edit6->Text);
y[1]=StrToFloat(Edit7->Text);
if(np!=0&&s==0){
Memo1->Lines->Add("Результаты:");
Memo1->Lines->Add(" x | u(x) | точное | разн. | v(x) | точное | разн. | ");
Memo1->Lines->Add("-----------------------------------------------------");
Memo1->Lines->Add(FloatToStrF(x,ffFixed,5,3)+" "+FloatToStrF(y[0],ffFixed,8,4)+" "+FloatToStrF(2*x,ffFixed,8,4)+" "+FloatToStrF(y[0]-2*x,ffFixed,8,4)+" "+FloatToStrF(y[1],ffFixed,8,4)+" "+FloatToStrF(exp(x),ffFixed,8,4)+" "+FloatToStrF(y[1]-exp(x),ffFixed,8,4));
}
Series1->Clear();