Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы / Интерполяция сплайном / Main
.cpp#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#include <stdio.h>
#include <math.h>
#pragma package(smart_init)
#pragma resource "*.dfm"
void __fastcall TfrmMain::GenSinPnts(double Xmin,double Xmax,int n)
{
double R;
R=Xmax-Xmin;
double dx;
dx=R/n;
double x;
x=Xmin;
for(int i=0;i<=n;i++)
{
X[i]=x;
Y[i]=sin(X[i]);
x+=dx;
}
GetG(n);
}
void __fastcall TfrmMain::GetG(int n)
{
double *A,*H,*B,*C,*D,*L,*V;
int i;
H = new double [n+1];
for (i=1;i<=n;i++)
H[i]=X[i]-X[i-1];
A = new double [n+1];
A[0]=1;
A[n]=1;
for(i=1;i<n;i++)
A[i]=(H[i]+H[i+1])/3;
B = new double [n+1];
B[0]=0;//H[1]/6;
for(i=1;i<n;i++)
B[i]=H[i+1]/6;
C = new double [n+1];
C[n]=H[n]/6;
for(i=1;i<n;i++)
C[i]=H[i]/6;
D = new double [n+1];
D[n]=0;
D[0]=0;
for(i=1;i<n;i++)
D[i]=(Y[i+1]-Y[i])/H[i+1]-(Y[i]-Y[i-1])/H[i];
L = new double [n+1];
L[0]=-B[0]/A[0];
for(i=1;i<n;i++)
L[i]=-B[i]/(A[i]+C[i]*L[i-1]);
V = new double [n+1];
V[0]=D[0]/A[0];
for (i=1;i<=n;i++)
V[i] = (D[i]-C[i]*V[i-1])/(A[i]+C[i]*L[i-1]);
M = new double [n+1];
M[n]=V[n];
for (i=n;i>0;i--)
M[i-1]=L[i-1]*M[i]+V[i-1];
delete A;
delete H;
delete B;
delete C;
delete D;
delete L;
delete V;
}
double __fastcall TfrmMain::Pn(double x,double *X,double *Y)
{
int i=0;
while (x>X[i]) i++;
// if (x==X[i]) return(Y[i]);
double hi=X[2]-X[1];
double S;
S=M[i-1]*(-hi*hi*(X[i]-x)+pow((X[i]-x),3))/(6*hi);
S+=M[i]*(-hi*hi*(x-X[i-1])+pow((x-X[i-1]),3))/(6*hi);
S+=Y[i-1]*(X[i]-x)/hi;
S+=Y[i]*(x-X[i-1])/hi;
return(S);
}
TfrmMain *frmMain;
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
sgMstk->Cells[0][0]="n";
sgMstk->Cells[1][0]="Dmax";
sgMstk->Cells[2][0]="Ddn";
sgMstk->Cells[3][0]="Kd";
}
void __fastcall TfrmMain::btnExtClick(TObject *Sender)
{
Close();
}
void __fastcall TfrmMain::btnClcltClick(TObject *Sender)
{
double x;
x=StrToFloat(edtArgmnt->Text);
mmOutpt->Lines->Add(FloatToStrF(Pn(x,X,Y),ffFixed,20,20));
}
void __fastcall TfrmMain::DelPnts()
{
delete X;
delete Y;
delete M;
}
void __fastcall TfrmMain::btnCleanClick(TObject *Sender)
{
DelPnts();
Series1->Clear();
Series2->Clear();
mmOutpt->Lines->Add("");
mmOutpt->Lines->Add("");
mmOutpt->Lines->Add("");
mmOutpt->Lines->Add("");
}
void __fastcall TfrmMain::btnMstkClick(TObject *Sender)
{
int i=1;
double Tmp;
for (int n=5;n<=10240;n*=2)
{
sgMstk->Cells[0][i++]=FloatToStr(n);
X = new double [n+1];
Y = new double [n+1];
GenSinPnts(0,M_PI,n);
double Hi=(X[5]-X[4])/2;
Tmp=fabs(Pn(X[0]+Hi,X,Y)-sin(X[0]+Hi));
for (int j=1;j<n;j++)
if(fabs(Pn(X[j]+Hi,X,Y)-sin(X[j]+Hi))>Tmp)
Tmp=fabs(Pn(X[j]+Hi,X,Y)-sin(X[j]+Hi));
sgMstk->Cells[1][i-1]=FloatToStrF(Tmp,ffExponent,5,5);
if (i>2)
{
sgMstk->Cells[2][i-1]=FloatToStrF(Tmp/8,ffExponent,5,5);
double K = StrToFloat(sgMstk->Cells[1][i-2])/Tmp;
sgMstk->Cells[3][i-1]=FloatToStrF(K,ffExponent,5,5);
}
DelPnts();
}
}
void __fastcall TfrmMain::btnGenSinClick(TObject *Sender)
{
N=StrToFloat(edtN->Text);
X = new double[N+1];
Y = new double[N+1];
GenSinPnts(StrToFloat(edtXmin->Text),StrToFloat(edtXmax->Text),N);
double T=X[0];
double dx=0.001;
while(T<X[N])
{
Series2->AddXY(T,Pn(T,X,Y),"",clRed);
T+=dx;
}
for(int i=0;i<=N;i++)
Series1->AddXY(X[i],Y[i],"",clGreen);
}
void __fastcall TfrmMain::btnGenFileClick(TObject *Sender)
{
FILE *fl;
fl = fopen("inpt.txt","rt");
fscanf(fl,"%i",&N);
mmOutpt->Lines->Add(FloatToStr(N));
X = new double[N+1];
Y = new double[N+1];
for(int i=0;i<=N;i++)
{
fscanf(fl,"%lf",&X[i]);
fscanf(fl,"%lf",&Y[i]);
Series1->AddXY(X[i],Y[i],"",clGreen);
}
fclose(fl);
GetG(N);
double T=X[1];
double dx=0.01;
while(T<X[N-1])
{
Series2->AddXY(T,Pn(T,X,Y),"",clRed);
T+=dx;
}
}
Соседние файлы в папке Интерполяция сплайном