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

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

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;