8)ToolBar1 - инструментальной панели со следующими кнопками( класса TToolButton):
-ToolButton1 - запуск численного метода(связан с пунктом главного меню ButtonClick1);
-ToolButton2- сохранение исходных данных в файл(связан с пунктом главного меню N6Click);
-ToolButton3 - загрузка исходных данных из файла(связан с пунктом главного меню N7Click);
-ToolButton4 - вызов формы информации по программе(связан с пунктом главного меню N2Click);
-ToolButton5 - Закрытие приложения(связан с пунктом главного меню N3Click).
Интерфейс формы таблицы и графика результатов Form1
Рисунок 3.2 - Форма отображения результатов
Для интерфейса пользователя на форме используются следующие компоненты:
1) Текстовая таблица из трёх колонок StringGrid1 класса TStringGrid, в которой отображаются численные значения рассчитанных переменных элементов массивов решения X и Y;
2) Двухмерный график Chart1 класса TChart, в котором используется один набор точек график Series1 класса TLineSeries и не отображается легенда и заготовок графика;
3) Текстовая метка Label1 класса TLable для отображения текста: “Таблица результатов решения:”
4) SaveDialog1 - диалоговое окно выбора имени текстового файла для сохранения массивов решения X и Y в виде таблицы.
5) SavePictureDialog1- диалоговое окно задания имени файла для сохранения результатов;
6) Кнопки управления класса TButton:
-“Закрыть”(Button1Click класса TButton)- выход из программы;
-“Сохранить таблицу”(Button4Click класса TButton)- для записи таблицы результатов и исходных данных в текстовый файл;
-“Сохранить в bmp-файл”(Button3Click класса TButton)- сохранение графика в файл формата растровых изображений(bmp);
-“Сохранить в wmf-файл”(Button2Click класса TButton)- сохранение графика в файл формата Windows Metafile.
Интерфейс формы информации о программе Form3
Интерфейс пользователя на форме строится с помощью следующих компонентов:
1) PageControl1- набор закладок для организации двух страниц:
-“Численный метод”(TabSheet1)- страница с описанием численного метода;
-“О программе”(TabSheet2)- страница со сведениями о программе;
2) RichEdit1 - окно многострочного форматного текстового редактора, расположенное на странице TabSheet1, в которое загружается описание численного метода Нистрема из внешнего файла “имя файла.формат”;
3) RichEdit2 - окно многострочного форматного текстового редактора, расположенное на странице TabSheet2, в котором отображается информация о программе;
4) кнопка Button1 класса TButton для закрытия формы с информацией.
3.3 Программирование ввода-вывода данных
Ввод исходных данных в проекте реализован двумя способами:
1) С помощью формы Form2, где значения переменных исходных данных считываются из текстовых полей Теxt компонентов Edit с последующим преобразованием их в соответствующий вещественный или целочисленный тип данных.
2) Чтением ранее сохранённых значений из внешнего текстового файла с помощью потока ifstream из модуля fstream; алгоритм чтения исходных данных соответствует
Рисунку 2.2а на форм Form2.
В приложении предусмотрено сохранение исходных данных во внешний файл на форме Form1 с помощью файлового потока ofstream.
Отображении численных значений выполняется с помощью формы Form2 в ячейках таблицы StringGrid1, используя функции преобразования численных данных в строковые IntToStr и FloatToStr, а так же с помощью компонента Chart1. Результаты расчёта таблицы можно сохранить в текстовый файл вместе с исходными данными и выражением OДУ, используя поток ofstream. На форме реализована возможность изменения высоты формы графика и таблиц в обработчике события OnResize.
3.4 Программная реализация численного метода
Исходное ОДУ, представленное выражением (2.1), оформляется на форме Form1 в виде функции:
double F(double X, double Y)
{return a*X*X+b*X+c*Y*Y+d*Y+e*X*Y+g;}
Программная реализация на языке С++ метода Нистрема для численного интегрирования ОДУ выполняется на основе разработанной схемы алгоритма рисунка 2.4 в функции обработчике выбора пункта ButtonClick1 из главного меню:
void __fastcall TForm1::Button1Click(TObject *Sender)
В начале тела функции проверяется наличие ввода исходных данных. В теле цикла расчёта точек сохранения организуется отображение значения текущего счётчика i в свойстве ProgressBar1->Position.
Тексты cpp и h файлов проекта помещаются в Приложение А.
4. Тестирование работоспособности программы
4.1 Описание аппаратной конфигурации для тестирования
Тестирование разработанного приложения выполнялась на персональном компьютере под управлением операционной системы Windows 10 со следующими характеристиками аппаратной части:
1) Тип ЦП AMD Athlon(tm) X4 840 Quad Core Processor 3.10GHz с характеристиками:
-Ядро - Trinity;
-Количество ядер - 4;
-Частота - 3400МГц;
-Тепловыделение - 100Вт;
-Тип памяти - DDR3;
2) Системная плата ASRock FM2A68M-DG3+ с параметрами:
-форм-фактор ATX;
-Весь Твёрдый Конденсаторный проект
-Максимальный объём оперативной памяти-32Гб;
-Поддержка технологии Dual Channel DDR3 Memory Technology;
-Поддержка DDR3 2400+(ОС)/2133(OC)/1866(OC)/1600/1333/1066 не=ECC, безбуферная память1066/800 не-ECC;
3)установлен 1 модуль оперативной памяти (DDR3) объёмом 8192 Мб;
4)Типы внешней памяти компьютера:
-дисковые устройства: WDC WD2500AAJS-00YZCA0(250Gb);
WDC WD3200AAKS-00L9A0(250Gb);
Silicon-power USB Device;
5)тип видеоадаптера NVIDIA GeForce GT-740;
-Частота SPU - 810МГц;
-Частота ядра - 810МГц;
-Частота памяти- 1800/3200МГц;
-Тип памяти - DDR3/GDDR5
-Объём памяти 2048Мб;
-Ядро - GK107;
-Шина памяти - 128бит;
6)Параметры монитора:
-тип ЭЛТ-монитора- SyncMaster 923NW;
-Диагональ:19;
-Разрешение: 1440x900 (16:10);
-Тип ЖК-матрицы: TFT TN;
-Шаг точки по вертикали: 0.285 мм;
-Шаг точки по горизонтали: 0.285 мм;
-Яркость: 300 кд/м2;
-Контрастность: 1000:1;
-Область обзора: по горизонтали: 170°; по вертикали: 160°;
7) состав интерфейса для подключения периферийных устройств:
-2 разъёма стандарта USB2.0;
-2 разъёма стандарта USB3.0;
-1 разъём порта LTP;
-блок из 3 аудиоразъёмов.
4.2 Тестирование разработанной программы
Разработанное приложение влючает в себя следующие файлы:
1)загрузочный файл- Nistrem(3).exe объёмом(123kb);
2)информационный файл- Метод Нистрема.rtf
Для тестирования программы используется дифференциальное уравнение вида:
где
Согласно принятой форме записи ОДУ в программе описывается следующими исходными данными:
-a=0;
-b=0;
-c=0;
-d=0;
-e=0;
-f=1;
При этом использовались следующие исходные данные для решения:
1)начало интервала интегрирования X0=0;
2)начальное условие функции Y0=0;
3)конец интервала интегрирования Xk=3;
4)величина шага интегрирования h=0.01;
5)число точек расчёта Np=10.
При вводе исходных данных форма Form1 имеет вид рисунка 4.1.
Время расчёта составило менее 1 с.
Результаты расчёта в виде текстового файла и графика приводятся в Приложении Б.
Рисунок 4.1- ввод исходных данных
4.3 Решение задачи в математической системе Mathcad
Для тестирования используется математический пакет MathCAD 11A. При этом исходное уравнение (4.1) задаётся в виде функции:
(4.2)
Для численного расчёта с параметрами интегрирования, указанными в п.4.2, используется функция численного интегрирования многошаговым методом Адамса
Adams(x0, yo, xk, N, dy, h)
Где: x0- начальное значение независимой переменной;
y0- начальное значение зависимой переменной;
xk- конечное значение независимой переменой;
N- число точек решения;
dy- выражение ОДУ;
h- величина шага интегрирования.
Результаты решения в виде таблицы и графика приводятся в приложении В.
4.4 Решение задачи в математической системе MATLAB
Для тестирования уравнения вида(4.1) использовался пакет MATLAB версии 6.5. Дифференциальное уравнение(4.1) задаётся в виде m-файла func.m функцией:
Function f= func(x,y)
f=[0*x*x+0*x+0*y*y+0*y+0*y*x+1];
Для расчёта ОДУ используется встроенная функция численного интегрирования адаптированным методом Рунге-Кутта 4-5го порядка точности:
ode45(`m-файла',X,Y0);
Где m-файл - имя m-файла с ОДУ
X - массив расчётных точек независимой переменной
Y0 - начальное значение зависимой переменной.
Для построения двухмерного графика используется функция plot().
Состав m-файла для решения ОДУ следующий:
clc
[X,Y]=ode45(`func',[0 3],0)
plot(X,Y)
grid on
Результаты расчёта в виде численных данных и графика решения в среде MATLAB приводятся в Приложении Г.
4.5 Анализ результатов тестирования
По данным Приложения Б получено конечное значение:
.02
По данным Приложения В получено конечное значение:
По данным Приложения Г получено конечное значение:
Тогда абсолютное значение ошибки программы по Mathcad
Относительное значение ошибки теста Mathcad
.6%
Тогда абсолютное значение ошибки программы по MATLAB
Относительное значение ошибки теста MATLAB
%
Как видно из данных Приложений Б, В и Г получена точность расчёта менее 1%, что допустимо для технических расчётов. Это связано с тем что у метода Нистрема более высокая точность расчётов чем в используемых математических средах.
5. Разработка гипертекстового варианта документа работы
Html-документ со справочной информацией по разработанной программе выполняется на языке HTML в среде текстового редактора Блокнот. Полный исходный текст документа находится в Приложении Д.
Рисунок 5.1- Окно обозревателя Google со справкой
Заключение
В результате выполнения курсовой работы было произведено описание задачи решение обыкновенного дифференциального уравнения численным явным методом Нистрема, разработана схема алгоритма и написана программа решения на языке программирования C++ Builder. Проведённое тестирование показало правильность вычисления по спроектированной программе.
Разработанная программа может использоваться для решения ОДУ на ПК в среде Windows 7/8/10.
Приложения
Приложение А
Тексты спроектированной программы
Текст файла Progect1.cpp
#include <vcl.h>
#pragma hdrstop
//--------------------------------------------------------------------
USEFORM("Unit2.cpp", Form2);
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit3.cpp", Form3);
//--------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->CreateForm(__classid(TForm3), &Form3);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//--------------------------------------------------------------------
Файл Unit1.h(форма Form1)
#ifndef Unit1H
#define Unit1H
//--------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <ToolWin.hpp>
Продолжение приложения А
#include <ImgList.hpp>
//--------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TEdit *Edit5;
TProgressBar *ProgressBar1;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TMainMenu *MainMenu1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TSaveDialog *SaveDialog1;
TOpenDialog *OpenDialog1;
TLabel *Label7;
TEdit *Edit6;
TEdit *Edit7;
TEdit *Edit8;
TEdit *Edit9;
TEdit *Edit10;
TEdit *Edit11;
TLabel *Label8;
TLabel *Label9;
TLabel *Label10;
TLabel *Label11;
TLabel *Label12;
TLabel *Label13;
TButton *Button1;
TToolBar *ToolBar1;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TToolButton *ToolButton4;
TImageList *ImageList1;
void __fastcall N6Click(TObject *Sender);
void __fastcall N1Click(TObject *Sender);
void __fastcall N4Click(TObject *Sender);
void __fastcall N5Click(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall N3Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//--------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
#endif
Продолжение приложения А
Файл Unit1.cpp(форма Form1)
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
#include <fstream.h>
#include "Unit2.h"
#include <string.h>
#include "Unit3.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double *X, *Y, X0, Y0, X1,Y1, X2,Y2,X3,Y3,Xk, Xn, Yn, h;
long int Nj;
int Np;
int j;
int i;
double a, b, c, d, e, g;
double F(double X, double Y)
{return a*X*X+b*X+c*Y*Y+d*Y+e*X*Y+g;}
//--------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------
void __fastcall TForm1::N6Click(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
Form2->ShowModal();
}
//--------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{ if( SaveDialog1->Execute())
{ ofstream fout (SaveDialog1->FileName.c_str(), ios::out);
fout<< X0 <<endl;
fout<< Y0 <<endl;