Скачиваний:
36
Добавлен:
02.05.2014
Размер:
4.47 Кб
Скачать
#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;
        }
}
Соседние файлы в папке Интерполяция сплайном