Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчёт 4.docx
Скачиваний:
14
Добавлен:
02.06.2015
Размер:
339.84 Кб
Скачать

6.Код программы

Содержание модуля Class1.cpp

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

#pragma hdrstop

#include "Class1.h"

#include "string.h"

#include "strstream.h"

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include<math.h>

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

#pragma package(smart_init)

#pragma link "CSPIN"

//#pragma resource "*.dfm"

void Class1::aboutme()

{

Application->MessageBox("Данное приложение выполнено студентом ВятГУ Факультета АВТ группы УТ-21 Петуховым Павлом", "О создателе" );

}

const int n=3;

const float a[][4]={{1.53,1.61,1.43,-5.13},{2.35,2.31,2.07,-3.69},

{3.83,3.73,3.45,-5.98}};

float x[3];

void Class1::test_SLAU_3()

{

AnsiString s;

for(int j=0;j<3;j++){

if(j<2)s=" + ";

else s="";

for(int i=0;i<3;i++){

Form1->StringGrid1->Cells[2*j][i]=FloatToStrF(a[i][j],ffFixed,5,2)

+" * ";

Form1->StringGrid1->Cells[2*j+1][i]=" x["+IntToStr(j)+"]"+s;}

for(int i=0;i<3;i++){

Form1->StringGrid1->Cells[6][i]=" = ";

Form1->StringGrid1->Cells[7][i]=FloatToStrF(a[i][3],ffFixed,5,2);}}

}

void Class1::gauss(float& nev,int& mul,int& ad)

{

int i,j,k,l;

float a1[3][4],c,b,s;

//копирование исходной матрицы во вспомогательную матрицу

for(i=0;i<n;i++)

for(j=0;j<n+1;j++) a1[i][j]=a[i][j];

//решение СЛАУ

mul=ad=0;

for(i=0;i<n-1;i++){

c=a1[i][i];

for(j=i;j<n+1;j++) {a1[i][j]/=c; mul++;}

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

b=a1[k][i];

for(l=i;l<n+1;l++)

{a1[k][l]-=b*a1[i][l]; ad++; mul++;}}}

x[n-1]=a1[n-1][n]/a1[n-1][n-1]; mul++;

for(k=n-2;k>=0;k--){

s=0;

for(j=k+1;j<n;j++)

{s+=a1[k][j]*x[j]; ad++; mul++;}

x[k]=a1[k][n]-s; ad++;}

//вычисление невязки

c=0;

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

b=0;

for(int j=0;j<n;j++) b+=a[i][j]*x[j];

c+=pow(b-a[i][n],2);}

nev=sqrt(c)/n;

}

void Class1::helpf()

{

Form3->Show(); //обращение к форме

}

void Class1::resh()

{

int mul,ad;

float nev;

gauss(nev,mul,ad);

for(int i=0;i<3;i++){

Form1->StringGrid2->Cells[0][i]=" x["+IntToStr(i)+"] = ";

Form1->StringGrid2->Cells[1][i]=FloatToStrF(x[i],ffFixed,7,5);}

Form1->LabeledEdit1->Text=FloatToStrF(nev,ffExponent,4,2);

Form1->LabeledEdit2->Text=IntToStr(mul);

Form1->LabeledEdit3->Text=IntToStr(ad);}

void Class1::test_SLAU_n()

{

Form2->Show();

Form2->StringGrid1->Cells[0][0]=" n";

Form2->StringGrid1->Cells[1][0]=" k";

Form2->StringGrid1->Cells[2][0]=" mul";

Form2->StringGrid1->Cells[3][0]=" ad";

Form2->StringGrid1->Cells[4][0]=" nev_f";

Form2->StringGrid1->Cells[5][0]=" nev_d";

Form2->StringGrid1->Cells[6][0]=" nev_ld";

}

template<class T>

void Class1::gauss_1(float**b,int n,T& nev,int& mul,int& ad)

{ T c,z,d,s;

int max;

T* x=new T[n];

T** a=new T*[n];

for(int i=0;i<n;i++) a[i]=new T[n+1];

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

for(int j=0;j<n+1;j++)

a[i][j]=b[i][j];

mul=ad=0;

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

max=i;

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

if(fabs(a[k][i])>fabs(a[max][i])) max=k;

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

{z=a[i][j]; a[i][j]=a[max][j]; a[max][j]=z;}

c=a[i][i];

for(int j=i;j<n+1;j++) {a[i][j]/=c; mul++;}

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

d=a[k][i];

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

{a[k][l]-=d*a[i][l]; mul++; ad++;}}}

x[n-1]=a[n-1][n]/a[n-1][n-1]; mul++;

for(int k=n-2;k>=0;k--){

s=0;

for(int j=k+1;j<n;j++) {s+=a[k][j]*x[j]; mul++; ad++;}

x[k]=a[k][n]-s; ad++;}

//вычисление невязки

c=0;

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

d=0;

for(int j=0;j<n;j++) d+=b[i][j]*x[j];

c+=pow(d-b[i][n],2);}

nev=sqrt(c)/n;

for(int i=0;i<n;i++) delete[]a[i];

delete[]a; a=0;

delete[]x; x=0;

}

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

int pk=1;

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

void Class1::resh1()

{

Form4->Series1->Clear();

Form4->Series2->Clear();

Form4->Series3->Clear();

Form4->Series4->Clear();

Form4->Series5->Clear();

int count=0, current=0;

for(int n=Form2->CSpinEdit1->Value; n<=Form2->CSpinEdit2->Value;

n+=Form2->CSpinEdit3->Value)

count+=n; count*=Form2->CSpinEdit4->Value;

float**b,w,z;

int mul,smul,ad,sad;

float nev_f,snev_f;

double nev_d,snev_d;

long double nev_ld,snev_ld;

int k=Form2->CSpinEdit4->Value;

for(int n=Form2->CSpinEdit1->Value;

n<=Form2->CSpinEdit2->Value;n+=Form2->CSpinEdit3->Value){

b=new float*[n];

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

b[i]=new float[n+1];

smul=0; sad=0; snev_f=0; snev_d=0; snev_ld=0;

for(int kc=0;kc<k;kc++){

srand(time(NULL));

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

w=rand()%(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value+1)+Form2->CSpinEdit8->Value

+(float)random(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value+1)

/(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value)-0.5;

if(w>Form2->CSpinEdit7->Value)w=Form2->CSpinEdit7->Value;

if(w<Form2->CSpinEdit8->Value)w=Form2->CSpinEdit8->Value;

b[i][n]=w;

for(int j=0;j<n;j++){

z=rand()%(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value+1)+Form2->CSpinEdit6->Value

+(float)random(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value+1)

/(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value)-0.5;

if(z>Form2->CSpinEdit5->Value)z=Form2->CSpinEdit5->Value;

if(z<Form2->CSpinEdit6->Value)z=Form2->CSpinEdit6->Value;

b[i][j]=z; }}

gauss_1(b,n,nev_f,mul,ad);

snev_f+=nev_f; smul+=mul; sad+=ad;

gauss_1(b,n,nev_d,mul,ad);

snev_d+=nev_d;

gauss_1(b,n,nev_ld,mul,ad);

snev_ld+=nev_ld;

current+=n;

Form2->ProgressBar1->Position=100*current/count; }

Form2->StringGrid1->Cells[0][pk]=IntToStr(n);

Form2->StringGrid1->Cells[1][pk]=IntToStr(k);

Form2->StringGrid1->Cells[2][pk]=IntToStr(smul);

Form2->StringGrid1->Cells[3][pk]=IntToStr(sad);

Form2->StringGrid1->Cells[4][pk]=FloatToStrF(snev_f/k,ffExponent,5,4);

Form2->StringGrid1->Cells[5][pk]=FloatToStrF(snev_d/k,ffExponent,5,4);

Form2->StringGrid1->Cells[6][pk]=FloatToStrF(snev_ld/k,ffExponent,5,4);

Form4->Series1->AddXY(n,smul,"",clRed);

Form4->Series2->AddXY(n,sad,"",clGreen);

Form4->Series3->AddXY(n,snev_f/k*1.0e6,"",clRed);

Form4->Series4->AddXY(n,snev_d/k*1.0e15,"",clGreen);

Form4->Series5->AddXY(n,snev_ld/k*1.0e18,"",clBlack);

pk++;

for(int i=0;i<n;i++)delete[] b[i];

delete[]b; b=0; }

}

void Class1::graf()

{

Form4->Show();

}

void Class1::sbros()

{

for(int i=1;i<Form2->StringGrid1->RowCount;i++)

for(int j=0;j<Form2->StringGrid1->ColCount;j++)

Form2->StringGrid1->Cells[j][i]="";

Form2->ProgressBar1->Position=0;

Form4->Series1->Clear();

Form4->Series2->Clear();

Form4->Series3->Clear();

Form4->Series4->Clear();

Form4->Series5->Clear();

pk=1;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]