Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
02.05.2014
Размер:
4.79 Кб
Скачать
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Main.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
long double F(long double x)
{
	long double ans=0;
	ans=x*x+exp(x);
	return ans;
}
long double T(long double a,
			  long double b,
			  long double c,
			  long double ya,
			  long double yb,
			  long double yc)
{
    long double x;
	x=(b-c)*(b-c)*(ya-yc)-(c-a)*(c-a)*(yb-yc);
	x=x/((b-c)*(ya-yc)+(c-a)*(yb-yc));
	x=x/2;x+=c;
	return (x);
}
long double **XY(long double a,long double b,long double ya,long double yb,int n)
{
	long double **XY;
    XY = new long double *[2];
    XY[0] = new long double [n+2];
    XY[1] = new long double [n+2];
    XY[0][0]=a;XY[1][0]=ya;
    XY[0][n+1]=b;XY[1][n+1]=yb;

    for (int i=1;i<=n;i++)
    {
    	XY[0][i]=a+i*(b-a)/(n+1);
    	XY[1][i]=F(XY[0][i]);
    }
    return XY;
}
long double **CXY(long double a, long double b, long double s,
				  long double ya,long double yb,long double ys,
                  int n)
{
	long double **xy;
    long double **Tmp;
    xy = new long double *[2];
    xy[0] = new long double [n+2];
    xy[1] = new long double [n+2];
    xy[0][0]=a;xy[1][0]=ya;
    xy[0][n+1]=b;xy[1][n+1]=yb;
    if(fmod(n,2)!=0)
    {
    	Tmp=XY(a,s,ya,ys,(n-1)/2);
        for(int i=1;i<=(n+1)/2;i++)
        {
        	xy[0][i]=Tmp[0][i];
            xy[1][i]=Tmp[1][i];
        }
        Tmp=XY(s,b,ys,yb,(n-1)/2);
        for(int i=(n+1)/2;i<=n;i++)
        {
        	xy[0][i]=Tmp[0][i-(n+1)/2];
            xy[1][i]=Tmp[1][i-(n+1)/2];
        }
    }
    else
    xy=XY(a,b,ya,yb,n);
    return xy;
}

TfrmMain *frmMain;
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
	: TForm(Owner)
{
	for(long double i=-1;i<=0.00;i+=0.05)
	Series1->AddXY(i,F(i),"",clRed);
}
void __fastcall TfrmMain::btnCloseClick(TObject *Sender)
{
	Close();
}

void __fastcall TfrmMain::btnSearchClick(TObject *Sender)
{
	if (rbtn1->Checked)
	{
	long double a=-1;long double ya=F(a);
		long double b=0;long double yb=F(b);
        long double s,ys;
		int N=StrToInt(edtN->Text)-2;
        int n=StrToInt(edtD->Text);
        int ts=N/n;
        long double **xy;
        xy=XY(a,b,ya,yb,n);
        for(int i=2;i<=ts;i++)
        {
            long double c=xy[1][1];
            int t=1;
        	for(int k=2;k<=n;k++)
            if(xy[1][k]<c){c=xy[1][k];t=k;}
            a=xy[0][t-1];ya=xy[1][t-1];
            b=xy[0][t+1];yb=xy[1][t+1];
			s=xy[0][t];ys=xy[1][t];
            xy=CXY(a,b,s,ya,yb,ys,n);
        }
		edtE->Text=FloatToStr((b-a)/2);
		edtX->Text=FloatToStr((a+b)/2);   
	}
	if (rbtn2->Checked)
	{
		long double Lmb=1.618033989;
		long double a=-1;
		long double b=0;
		int   N=StrToInt(edtN->Text);
		long double x1=b-(b-a)/Lmb;
		long double x2=a+(b-a)/Lmb;
		long double y1=F(x1);
		long double y2=F(x2);
		for(int i=1;i<=N;i++)
		{
			if(y1>y2)
			{
				a=x1;
				x1=x2;y1=y2;
				x2=a+(b-a)/Lmb;y2=F(x2);
			}
			else
			{
				b=x2;
				x2=x1;y2=y1;
				x1=b-(b-a)/Lmb;y1=F(x1);
			}
		}
		edtE->Text=FloatToStr(fabs(b-a)/2);
		edtX->Text=FloatToStr((b+a)/2);
	}
	if(rbtn3->Checked)
	{
    	float a=-1;
		long double b=0;

		int   N=StrToInt(edtN->Text);
        long double c=a+(b-a)/2;
		long double ya=F(a);
		long double yb=F(b);
		long double yc=F(c);
		long double x; x=T(a,b,c,ya,yb,yc);
		long double yx=F(x);

		for(int i=1;i<=N-4;i++)
        {
            int fl=0;
			if (x>c)fl=1;
			if (x<c)fl=2;
			if (x==c)fl=3;
        	switch (fl)
			{
				case 1:
				{
					if(yx>yc){b=x;yb=yx;x=T(a,b,c,ya,yb,yc);yx=F(x);}
					else if(yx<yc){a=c;ya=yc;c=x;yc=yx;x=T(a,b,c,ya,yb,yc);yx=F(x);}
					else if(yx==yc){a=c;ya=yc;b=x;yb=yx;c=(a+b)/2;yc=F(c);x=T(a,b,c,ya,yb,yc);yx=F(x);i++;}

				}break;
				case 2:
				{
					if(yx>yc){a=x;ya=yx;x=T(a,b,c,ya,yb,yc);yx=F(x);}
					else if(yx<yc){b=c;yb=yc;c=x;yc=yx;x=T(a,b,c,ya,yb,yc);yx=F(x);}
					else if(yx==yc){a=x;ya=yx;b=c;yb=yc;c=(a+b)/2;yc=F(c);x=T(a,b,c,ya,yb,yc);yx=F(x);i++;}

				}break;
				case 3:{x=(a+c)/2;yx=F(x);}break;
			}
		}   
		edtE->Text=FloatToStr(fabs(b-a)/2);
		edtX->Text=FloatToStr((b+a)/2);
	}
}   
void __fastcall TfrmMain::rbtn1Click(TObject *Sender)
{
		edtD->Enabled=1;
        btnBlockSize->Enabled=1;
}
void __fastcall TfrmMain::rbtn2Click(TObject *Sender)
{
	edtD->Enabled=0;
    btnBlockSize->Enabled=0;
}
void __fastcall TfrmMain::rbtn3Click(TObject *Sender)
{
	edtD->Enabled=0;
    btnBlockSize->Enabled=0;
}
void __fastcall TfrmMain::btnBlockSizeClick(TObject *Sender)
{
    long double N=StrToInt(edtN->Text)-2;
	long double i=2;
    while((i<=N)&&(fmod(N,i)!=0)) i++;
    edtD->Text=FloatToStr(i);
}
Соседние файлы в папке Программа