Расчёт среднеквадратичного отклонения




Отчёт по учебной практике

на тему «Разработка программного обеспечения для расчёта аппроксимации по методу наименьших квадратов»

 

 

Вариант №2

 

 

Студент ИС3-161-ОЗБ группы подпись______

 

Руководитель _______________ подпись______ ___________

 

Воронеж 2016

Оглавление

1. Постановка задачи. 3

1.1 Ввод данных. 3

1.2 Диспетчеризация решения задачи. 3

1.3 Защита данных и справочная информация. 3

1.4 Показатели качества работы.. 3

1.5 Вычислительная часть задачи. 4

2. Листинг программы.. 5

2.1 Авторизация. 5

2.2 Меню.. 6

2.3 Расчёт аппроксимации. 7

2.4 Расчёт среднеквадратичного отклонения. 9

2.5 Построение графика. 10

3. Приложение. 12

3.1 Авторизация. 12

3.2 Меню.. 12

3.3 Диалоговые окна. 13

3.4 Построение графика. 14

3.5 Вывод на печать. 15

3.6 Справка. 15

 


Постановка задачи

 

Реализовать следующую задачу:

1. Обеспечить в программу ввод данных с клавиатуры или из файла.

2. Реализовать вывод результатов в файл или на монитор.

3. Обеспечить диспетчеризацию решения задачи.

4. Реализовать защиту данных и справочную информацию.

5. Определить показатели качества созданного программного обеспечения.

 

Ввод данных

Данные вводятся клавиатурой в специальные столбцы, а также можно импортировать готовый файл разрешения txt или выбрать значения по умолчанию. Введенные данные в специальных столбцах можно сохранить для дальнейшего использования. Также предусмотрена ситуация при отсутствии файла, возможность создать его и выбрать его местоположение. При ошибке записи на диск будет выведено соответствующее сообщение.

 

Диспетчеризация решения задачи

 

Предусмотрен вывод результатов в качестве диаграммы и столбцов со значениями, также можно все результаты вывести на печать или сохранить. Предусмотрен вариант редактирования данных, вне зависимости от их исходных значений. При возникновении ошибки выводится соответствующее сообщение.

 

Защита данных и справочная информация

 

Вход в программу производится только после введения правильного пароля. Справочная информация доступна для просмотра с момента запуска программы. В справочной информации можно получить данные о разработчике, годе разработки. Так же в ней приведена инструкция по эксплуатации данным продуктом.

 

Показатели качества работы

 

После вычисления предоставляется информация о времени его выполнения. В зависимости от объёма данных, меняется скорость работы программы. Скорость работы непосредственно связана с мощностью вашего компьютера.

 

Вычислительная часть задачи

 

Вводятся значения Х и соответствующие им значения Y. Необходима построить функцию логарифмической аппроксимации данных значений по методу наименьших квадратов и отдельно среднеквадратичное отклонение от неё.

 

 


Листинг программы

Авторизация

 

void TForm1::CheckPassword(){

if(Edit1->Text==(AnsiString)"itworks!"){

StringGrid1->Visible=true;

Button1->Visible=true;

Edit2->Visible=true;

Button2->Visible=true;

 

Label2->Visible=false;

Edit1->Visible=false;

Button5->Visible=false;

ReadTable();

}else{

Edit1->Text="";

ShowMessage("Пароль введен неверно!");

}

}

void __fastcall TForm1::Button5Click(TObject *Sender)

{

CheckPassword();

}

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{

//При нажатии ENTER выполняется проверка пароля

if(Key==13)CheckPassword();

}


Меню

 

class TForm1: public TForm

{

__published: // IDE-managed Components

TButton *Button1;

TLabel *Label1;

TEdit *Edit2;

TButton *Button2;

TOpenDialog *OpenDialog1;

TStringGrid *StringGrid1;

TSaveDialog *SaveDialog1;

TButton *Button3;

TButton *Button4;

TLabel *Label2;

TEdit *Edit1;

TButton *Button5;

void __fastcall Button1Click(TObject *Sender);

void __fastcall FormCreate(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

void __fastcall StringGrid1SetEditText(TObject *Sender, int ACol, int ARow, const UnicodeString Value);

void __fastcall Edit2DblClick(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);

 

private: // User declarations

Settings settings;

public: // User declarations

__fastcall TForm1(TComponent* Owner);

void CheckPassword();

void getApprox(double **x, double *a, double *b, int n);

double ** getData(int n);

void DrawGraph(double **x, int n);

void ShowOpenSave();

void SaveTable();

void RowCount(int count);

void NewTable();

void ReadTable();

};


Расчёт аппроксимации

void TForm1::getApprox(double **x, double *b, double *k, int n) {

double slx = 0;

double sly = 0;

double slx2 = 0;

double slxly = 0;

for(int i=1; i<=n; i++) {

slx += log(x[0][i]);

sly += log(x[1][i]);

slx2 += log(x[0][i])*log(x[0][i]);

slxly += log(x[0][i])*log(x[1][i]);

}

*k = (slx*sly-n*slxly)/(slx*slx-n*slx2);

*b = exp((sly-(*k)*slx)/n);

return;

}

// Задание начального набора значений

double ** TForm1::getData(int n) {

double **f, b, k;

char buf[8];

f = new double* [2];

f[0] = new double[n+1];

f[1] = new double[n+1];

f[2] = new double[n+1];

for(int i=1; i<=n; i++) {

bool error=false;

try{

f[0][i]=StrToFloat(StringGrid1->Cells[0][i]);

f[1][i]=StrToFloat(StringGrid1->Cells[1][i]);

}catch(...){

ShowMessage("Ошибка введенных данных в строке " + (AnsiString)i);

error=true;

}

if (f[0][i]<=0|| f[1][i]<=0){ //Область допустимых значений

ShowMessage("Значение меньше или равно 0 в строке " + (AnsiString)i);

error=true;

}

if(error){

delete[] f[0];

delete[] f[1];

delete[] f[2];

delete[] f;

return 0;

}

}

 

 

getApprox(f, &b, &k, n); // аппроксимация

for(int i=1; i<=n; i++) {

double x = (double)i;

f[2][i] = b*pow(x,k);

}

return f;

}

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

DWORD Start = GetTickCount();

double **x;

int n=StringGrid1->RowCount-2;

Label1->Caption="";

x = getData(n);

if(x){

for(int i=1; i<=n; i++){

Form2->StringGrid1->Cells[0][i]=x[0][i];

Form2->StringGrid1->Cells[1][i]=x[1][i];

Form2->StringGrid1->Cells[2][i]=(double)SimpleRoundTo(x[2][i], -4);

}

Form2->RowCount(n+1);

Form2->DrawGraph(x,n);

Form2->Sred2Otcl(x,n);

 

//удаление динамического массива

delete[] x[0];

delete[] x[1];

delete[] x[2];

delete[] x;

DWORD End = GetTickCount();

Form2->Label3->Caption=((DWORD)End -(DWORD)Start);

Form2->Label3->Caption=Form2->Label3->Caption+" мс";

Form2->ShowModal();

}

}


Расчёт среднеквадратичного отклонения

 

void TForm2::Sred2Otcl(double **x,int n) {

double sredvib = 0;

double sum2vib =0;

double result;

double result2;

for(int i=1;i<=n;i++){

sredvib=x[2][i];

}

sredvib=sredvib/n;

for(int i=1;i<=n;i++){

sum2vib+=pow(sredvib - x[2][i],2);

}

result=sum2vib/(n-1);

result=sqrt(result);

Label2->Caption=(double)SimpleRoundTo(result, -4);

}


Построение графика

 

void TForm2::DrawGraph(double **x, int n) {

int numrow = 2;

TCanvas*c;

c=Image1->Canvas;

double OffsetY, OffsetX;

double MAX_X = 0;

double MAX_Y = 0;

double ScaleX, ScaleY;

double min, max;

int height, width;

int X,Y; // координаты в окне (в px)

height = Image1->ClientHeight-1;

width = Image1->ClientWidth;

PatBlt(c->Handle, 0, 0, width, height, WHITENESS);

// Область допустимых значений X

min = x[0][1];

max = x[0][1];

for(int i=1; i<=n; i++) {

if(x[0][i] < min)

min = x[0][i];

if(x[0][i] > max)

max = x[0][i];

}

double temp = max - min;

if (min > 0) min = 0;

MAX_X = max - min;

OffsetX = min*width/MAX_X; // смещение X

ScaleX = (double)width/MAX_X; // масштабный коэффициент X

 

 

// Область допустимых значений Y

min = x[1][1];

max = x[1][1];

for(int i=1; i<=n; i++) {

for(int j=1; j<=numrow; j++) {

if(x[j][i] < min)

min = x[j][i];

if(x[j][i] > max)

max = x[j][i];

}

}

MAX_Y = max - min;

OffsetY = max*height/MAX_Y; // смещение Y

ScaleY = (double)height/MAX_Y; //масштабный коэффициент Y

// Отрисовка осей координат

// черное перо 1px

c->Pen->Color=clBlack;

c->Pen->Width=1;

c->MoveTo(0,OffsetY);// перемещение в точку (0;OffsetY)

c->LineTo(width, OffsetY);// рисование горизонтальной оси

c->MoveTo(OffsetX,0); // перемещение в точку (OffsetX;0)

c->LineTo(OffsetX, height);// рисование вертикальной оси

// Отрисовка графика функции

int color = 0xFF; // красное перо для первого ряда данных

for(int j=1; j<=numrow; j++) {

// формирование пера 2px

c->Pen->Color=color;

c->Pen->Width=2;

X = (int)(OffsetX + x[0][1]*ScaleX); // координаты начальной точки графика

Y = (int)(OffsetY - x[j][1]*ScaleY);

c->MoveTo(X,Y); // перемещение в начальную точку

for(int i=1; i<=n; i++) {

X = OffsetX + x[0][i]*ScaleX;

Y = OffsetY - x[j][i]*ScaleY;

c->LineTo(X, Y);

}

color = color << 8; // изменение цвета пера для следующего ряда

}

}


Приложение

 

Программа написана на C++ в CodeGear Rad Studio 2009.

 

Авторизация

 

 

Меню

 

 

Диалоговые окна

 

 

 

 

 

Построение графика

 

 

Вывод на печать

 

Справка

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: