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. Описание численного метода</a><br><a href="#Bookmark1">2. Проектирование схем алгоритма</a><br><a href="#Bookmark6">3. Кодирование программы</a><br><a href="#Bookmark7">4. Тестирование программы</a><br><a href="#Bookmark8">5. Список используемых источников</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> dy/dx=f(x,y) </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;"> 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;"> <em>у=f(x)</em></span><span
Продолжение приложения Д
style="color:#000000;font-family:'Courier New';font-size:19px;"> (1.2) </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>