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;
}