Курсовая работа: Разработка программы численного интегрирования обыкновенного дифференциального уравнения явным многошаговым методом Нистрема третьего порядка точности

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

fout<< Xk <<endl;

fout<< Np <<endl;

fout<< h <<endl;

fout<< a <<endl;

fout<< b <<endl;

fout<< c <<endl;

fout<< d <<endl;

fout<< e <<endl;

fout<< g <<endl;

fout.close();

}}

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

void __fastcall TForm1::N5Click(TObject *Sender)

{if( OpenDialog1->Execute())

{ ifstream fin (OpenDialog1->FileName.c_str());

fin >> X0;

Edit1->Text=FloatToStr(X0);

Продолжение приложения А

fin >> Y0;

Edit2->Text=FloatToStr(Y0);

fin >> Xk;

Edit3->Text=FloatToStr(Xk);

fin >> Np;

Edit4->Text=FloatToStr(Np);

fin >> h;

Edit5->Text=FloatToStr(h);

fin >> a;

Edit6->Text=FloatToStr(a);

fin >> b;

Edit7->Text=FloatToStr(b);

fin >> c;

Edit8->Text=FloatToStr(c);

fin >> d;

Edit9->Text=FloatToStr(d);

fin >> e;

Edit10->Text=FloatToStr(e);

fin >> g;

Edit11->Text=FloatToStr(g);

fin.close();

}}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

h=StrToFloatDef(Edit5->Text.c_str(), 0.01);

if(strlen(Edit1->Text.c_str())!=0){

if(strlen(Edit2->Text.c_str())!=0){

if(strlen(Edit3->Text.c_str())!=0){

if(strlen(Edit4->Text.c_str())!=0){

if(strlen(Edit5->Text.c_str())!=0){

if(strlen(Edit6->Text.c_str())!=0){

if(strlen(Edit7->Text.c_str())!=0){

if(strlen(Edit8->Text.c_str())!=0){

if(strlen(Edit9->Text.c_str())!=0){

if(strlen(Edit10->Text.c_str())!=0){

if(strlen(Edit11->Text.c_str())!=0){

a=StrToFloat(Edit6->Text);

b=StrToFloat(Edit7->Text);

c=StrToFloat(Edit8->Text);

d=StrToFloat(Edit9->Text);

e=StrToFloat(Edit10->Text);

g=StrToFloat(Edit11->Text);

X0=StrToFloat(Edit1->Text);

Y0=StrToFloat(Edit2->Text);

Xk=StrToFloat(Edit3->Text);

Np=StrToFloat(Edit4->Text);

h=StrToFloat(Edit5->Text); if(h==0){ ShowMessage("Ошибка. Значение h не может быть <0"); return; }

if (Xk<X0) ShowMessage("Ошибка. Начальное значение X0 не должно быть больше конечного Xk");

else{

if (Np>500) ShowMessage("Ошибка. Значение Np не должно быть больше 500");

else{

X = new double[Np+1];

Y = new double[Np+1];

X[0]=X0;

Продолжение приложения А

Xn=X0;

Y[0]=Y0;

Yn=Y0;

Nj =(Xk-X0)/Np/h+1;

X1=X0+h;

Y1=Y0+h*F(X0, Y0);

X2=X1+h;

Y2=Y1+h*F(X1, Y1);

ProgressBar1->Max=Np;

ProgressBar1->Position=0;

for(i=1; i<Np; i++)

{

for(j=0; j<=Nj; j++)

{ X3=X2+h;

Y3=Y1+h*(7*F(X2,Y2)-2*F(X1,Y1)+F(Xn,Yn))/3;

Xn=X1; Yn=Y1;

X1=X2; Y1=Y2;

X2=X3; Y2=Y3;

}

ProgressBar1->Position=i;

X[i]=X3;

Y[i]=Y3;

}

Form2->ShowModal();

}

}

}

}

}

}

}

}

}

}

}

}

}

}

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

void __fastcall TForm1::N3Click(TObject *Sender)

{

Form3->ShowModal();

}

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

Файл Unit2.h(форма Form2)

#ifndef Unit2H

#define Unit2H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Chart.hpp>

#include <Dialogs.hpp>

#include <ExtCtrls.hpp>

#include <ExtDlgs.hpp>

#include <Grids.hpp>

#include <TeEngine.hpp>

#include <TeeProcs.hpp>

#include <Series.hpp>

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

class TForm2 : public TForm

{

__published: // IDE-managed Components

TStringGrid *StringGrid1;

TChart *Chart1;

TSaveDialog *SaveDialog1;

TSavePictureDialog *SavePictureDialog1;

TButton *Button1;

TButton *Button2;

TButton *Button3;

TButton *Button4;

TLineSeries *Series1;

TLabel *Label1;

void __fastcall Button4Click(TObject *Sender);

void __fastcall FormShow(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall Button1Click(TObject *Sender);

void __fastcall FormResize(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm2(TComponent* Owner);

};

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

extern PACKAGE TForm2 *Form2;

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

#endif

Файл Unit2.cpp(форма Form2)

#include <vcl.h>

#pragma hdrstop

Продолжение приложения А

#include <math.h>

#include <fstream.h>

#include "Unit2.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

extern double *X, *Y, X0, Y0, Xk, Xn, Yn, a, b, h;

extern long int Nj;

extern int Np;

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

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TForm2::Button4Click(TObject *Sender)

{

Close();

}

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

void __fastcall TForm2::FormShow(TObject *Sender)

{ StringGrid1->RowCount=Np+1;

StringGrid1->Cells[0][0]="i";

StringGrid1->Cells[1][0]="X[i]";

StringGrid1->Cells[2][0]="Y[i]";

Series1->Clear();

for (int i=0; i<Np; i++)

{ StringGrid1->Cells[0][i+1]=IntToStr(i);

StringGrid1->Cells[1][i+1]=FloatToStrF(X[i],0,6,10);

StringGrid1->Cells[2][i+1]=FloatToStrF(Y[i],0,6,10);

Series1->AddXY(X[i],Y[i],"",clRed);

}

}//-----------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)

{ if(SavePictureDialog1->Execute())

Chart1->SaveToMetafile(SavePictureDialog1->FileName+".bmp");

}

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

void __fastcall TForm2::Button3Click(TObject *Sender)

{if(SavePictureDialog1->Execute())

Chart1->SaveToMetafile(SavePictureDialog1->FileName+".wmf");

}

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

void __fastcall TForm2::Button1Click(TObject *Sender)

{char *Name;

if (SaveDialog1->Execute())

{ Name=SaveDialog1->FileName.c_str();

ofstream four(Name, ios_base::out);

for(int i=0; i<Np; i++)

{ four <<X[i] << " " <<Y[i] <<endl;

}

four.close();

}}

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

void __fastcall TForm2::FormResize(TObject *Sender)

{

Chart1->Width=Form2->Width-(583-361);

Продолжение приложения А

Chart1->Height=Form2->Height-( 365-289);

StringGrid1->Height=Form2->Height-( 365-273);

Button2->Top=Form2->Height-( 365-296);

Button3->Top=Form2->Height-( 365-296);

Button1->Top=Form2->Height-( 365-296);

Button4->Top=Form2->Height-( 365-296);

}

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

Файл Unit3.h(форма Form3)

#ifndef Unit3H

#define Unit3H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

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

class TForm3 : public TForm

{

__published: // IDE-managed Components

TButton *Button1;

TPageControl *PageControl1;

TTabSheet *TabSheet1;

TTabSheet *TabSheet2;

TRichEdit *RichEdit1;

TRichEdit *RichEdit2;

void __fastcall Button1Click(TObject *Sender);

void __fastcall FormShow(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm3(TComponent* Owner);

};

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

extern PACKAGE TForm3 *Form3;

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

#endif

Файл Unit3.cpp(форма Form3)

#include <vcl.h>

#pragma hdrstop

#include "Unit3.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

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

__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

}

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

Продолжение приложения А

void __fastcall TForm3::Button1Click(TObject *Sender)

{

Close();

}

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

void __fastcall TForm3::FormShow(TObject *Sender)

{

RichEdit2->Lines->LoadFromFile("question38.txt");

}

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

Приложение Б

Результаты тестирования программы

Решение ОДУ: dy/dx=0*x^2+0*x+0*y^2+0*y+0*y*x+1

Исходные данные интегрирования:

X0=0

Y0=0

h=0.01

Xk=3

Np=10

Таблица результатов расчёта:

x y

0 0

0.32 0.32

0.62 0.62

0.92 0.92

1.22 1.22

1.52 1.52

1.82 1.82

2.12 2.12

2.42 2.42

2.72 2.72

3.02 3.02

Рисунок Б.1- График решения

Приложение В

Решение в математической системе Mathcad

Приложение Г

Решение в математической среде MATLAB

Рисунок Г.1- График решения в MATLAB

Приложение Д

Гипертекстовая справка по программе

<!doctype html>

<html lang="ru">

<head>

<meta charset="utf-8">

<title>Численный явный многошаговый метод Нистрема</title>

<meta name="author" content="Boris.M">

<meta name="generator" content="WYSIWYG Web Builder 12 Trial Version - http://www.wysiwygwebbuilder.com">

<link href="Нистрем.css" rel="stylesheet">

<link href="index.css" rel="stylesheet">

</head>

<body>

<a href="http://www.wysiwygwebbuilder.com" target="_blank"><img src="images/builtwithwwb12.png" alt="WYSIWYG Web Builder" style="position:absolute;left:2623px;top:1110px;border-width:0;z-index:250"></a>

<div id="wb_Text1" style="position:absolute;left:48px;top:52px;width:373px;height:36px;z-index:3;">

<span style="color:#1E90FF;font-family:Arial;font-size:32px;">Cодержание</span></div>

<div id="wb_Text2" style="position:absolute;left:48px;top:123px;width:295px;height:80px;z-index:4;">

<span style="color:#000000;font-family:Arial;font-size:13px;"><a href="#Bookmark4">1.&nbsp; Описание численного метода</a><br><a href="#Bookmark1">2.&nbsp; Проектирование схем алгоритма</a><br><a href="#Bookmark6">3.&nbsp; Кодирование программы</a><br><a href="#Bookmark7">4.&nbsp; Тестирование программы</a><br><a href="#Bookmark8">5.&nbsp; Список используемых источников</a></span></div>

<hr id="Line1" style="position:absolute;left:4px;top:226px;width:966px;z-index:5;">

<div id="wb_Text3" style="position:absolute;left:48px;top:244px;width:490px;height:36px;z-index:6;">

<span style="color:#1E90FF;font-family:Arial;font-size:32px;">1. Описание численного метода</span></div>

<div id="wb_Text4" style="position:absolute;left:4px;top:304px;width:813px;height:1444px;z-index:7;">

<div style="margin-left:45px;position:absolute;left:0px;top:0px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">Решением обыкновенного дифференциального уравнения в нормальной форме </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:21px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">Коши согласно [1]</span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:42px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;"><em>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; dy/dx=f(x,y)&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </em>(1.1)<em></em></span></div>

<div style="margin-left:89px;position:absolute;left:0px;top:63px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;"> </span></div>

<div style="position:absolute;left:0px;top:84px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">где x - независимая переменная;</span></div>

<div style="position:absolute;left:0px;top:105px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">&nbsp;&nbsp;&nbsp; y - зависимая переменная </span></div>

<div style="position:absolute;left:0px;top:126px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">является функция</span></div>

<div style="position:absolute;left:0px;top:147px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;"><br></span></div>

<div style="position:absolute;left:0px;top:168px;width:813px;height:21px;"><span style="color:#000000;font-family:Arial;font-size:19px;">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <em>у=f(x)</em></span><span

Продолжение приложения Д

style="color:#000000;font-family:'Courier New';font-size:19px;">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; (1.2)&nbsp; </span></div>

<div style="position:absolute;left:0px;top:191px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;"><br></span></div>

<div style="position:absolute;left:0px;top:212px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">удовлетворяющая начальным условиям - точке (x0,y0).</span></div>

<div style="position:absolute;left:0px;top:233px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">При использовании численного метода интегрирования решение уравнения </span></div>

<div style="position:absolute;left:0px;top:254px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">(1.2) получается в виде массива точек (x1,y1) описывающих кривую, </span></div>

<div style="position:absolute;left:0px;top:275px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">начинающуюся в конечной точке определения аргумента - Xk.</span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:296px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">Численный метод Нистрема относится к явным многошаговым методам </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:317px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">численного интегрирования. Данные методы используют для определения </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:338px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">каждой последующей точки не одно, а несколько значений функции в </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:359px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">предыдущих точках интегрирования. В отличие от одношаговых методов, </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:380px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">многошаговые не обладают свойством самостартования, поэтому перед </span></div>

<div style="margin-left:45px;position:absolute;left:0px;top:401px;width:813px;height:20px;"><span style="color:#000000;font-family:'Courier New';font-size:19px;">запуском вычислений необходимо рассчитать требуемое число первых точек </span></div>