Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №11 / Программа / Main
.cpp#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);
}