7
010200.6006.02
_____________ ..
___ ______________2011 .
. 08
_______________ . .
___ _____________2011 .
2011
腅..3
...7
.8
..11
.
:
(1)
(2)
(3)
(4)
(5)
(6)
(. /.. ) , ;
(. /) t;
(. /.) t;
(..) , ;
(1/ ..) ;
(1/..) ;
;
(2) (. /.. ) .
(3) (. /.. ) .
(. /.. ) , .
, .
:
(1) (6) . , .
: ) : ) ) ) u ; | |
( ) | |
, | |
; | |
. ( , ) ; | |
; | |
; | |
; | |
; | |
( ): | |
; (.. , ) , 14; | |
; | |
; | |
; | |
n, .. : ; | |
, : | |
i,j, .. ) ) | |
, : | |
, .. : | |
− ; | |
. (.. , , ) , 32, − 21; | |
; | |
( ) | |
; | |
; | |
. (.. , , ) , 32, − 25; | |
; | |
; | |
, .. | |
, I; | |
: | |
. 0; | |
− . . |
|
|
1) .
[0,T] N , , (1) . (2), (3) - . :
2)
. , , .
, .
()
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct point
{bool f;double x; double y;};
double dt, dx1,dx2,du,eps,J,J_,k1=0.0004321,k2=0.008281,a,T;
int N,m1,m2,m3;
typedef double **massiv;
typedef double *masv;
struct sov
{massiv u,V;};
typedef sov *m;
double Bk(double x, double y, double u)
{
return (a*u+x+y)*dt;
}
double f(double x1,double x2, double u,int i)
|
|
{
switch (i)
{
case 0: return x1-(k1*x1+u)*dt;
case 1: return x2+(k1*x1-k2*x2)*dt;
}
}
double I(massiv x, masv u)
{
double s=0;
for (int i=0;i<N;i++)
s+=(a*u[i]+x[0][i]+x[1][i])*dt;
return s;
}
bool D(point x)
{
if ((x.x>=1)&&(x.x<=10))
if ((x.y>=-10)&&(x.y<=10)) return true;
else return false;
else return false;
}
int round (double a)
{
if (a-int (a)>0.5) return int(a)+1;
if (a-int(a)<=0.5) return int (a);
}
point prok(point x)
{
point a;
double d;
if (dx1>dx2) d=dx1;
else d=dx2;
a.f=false;
int i0,j0;
a.x=round((x.x-1)/dx1);
a.y=round((x.y+10)/dx2);
if ((1+a.x*dx1>=1)&&(1+a.x*dx1<=10)&&(-10+a.y*dx2>=-10)&&(-10+a.y*dx2<=10)) a.f=true;
else
if (((x.x+d>=1)&&(x.x<1))||((x.x-d>10)&&(x.x>10))||((x.y+d>=-10)&&(x.y<-10))||((x.y-d<=10)&&(x.y>10)))
{
a.f=true;
if (x.x<1) a.x=0;
if (x.x>10) a.x=m1;
if (x.y<-10) a.y=0;
if (x.y>10) a.y=m2;
}
return a;
}
double max(double a, double b)
{
if (a>b) return a;
else return b;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i0,j0,i_0,j_0;
eps=StrToFloat(Edit6->Text);
N=StrToInt(Edit4->Text);
m1=StrToInt(Edit1->Text);
m2=StrToInt(Edit2->Text);
m3=StrToInt(Edit3->Text);
a=StrToFloat(Edit7->Text);
T=StrToFloat(Edit12->Text);
bool flag=false;
int notx,notu;
point xk,x1;
double up;
mas U;
mass X;
m x;
do
{
dt=T/N;
dx1=9.0/m1;
dx2=20.0/m2;
du=1.0/m3;
x=new sov [N+1];
X=new double* [2];
U=new double [N+2];
for (int i=0;i<=N;i++)
{
x[i].u=new double *[m1+1];
x[i].V=new double *[m1+1];
for (int j=0;j<=m1;j++)
{
x[i].u[j]=new double [m2+1];
x[i].V[j]=new double [m2+1];
}
}
for (int i=0;i<2;i++)
X[i]=new double [N+2];
for (int i=0;i<=m1;i++)
for (int j=0;j<=m2;j++)
x[N].V[i][j]=0;
for (int k=N-1;k>=0;k--)
{
notx=0;
for (int i=0;i<=m1;i++)
for (int j=0;j<=m2;j++)
{
x1.x=1+i*dx1;
x1.y=-10+j*dx2;
notu=0;
for (int n=0;n<=m3;n++)
{
up=n*du;
xk.x=f(x1.x,x1.y,up,0);
xk.y=f(x1.x,x1.y,up,1);
if (!D(xk)) notu+=1;
else
{
if (prok(xk).f)
{
i0=prok(xk).x;
j0=prok(xk).y;
double fn=Bk(x1.x,x1.y,up)+x[k+1].V[i0][j0];
if ((fn<x[k].V[i][j]) ||(n==0))
{
x[k].V[i][j]=fn;
x[k].u[i][j]=up;
}
}
else notu++;
}
}
if (notu==m3) notx+=1;
}
}
point b;
b.x=X[0][0]=5;
b.y=X[1][0]=2;
int i_,j_;
if (prok(b).f)
{
i_=prok(b).x;
j_=prok(b).y;
}
b.x=X[0][0]=5;
b.y=X[1][0]=2;
for (int k=0;k<N;k++)
{
if (prok(b).f)
{
i0=prok(b).x;
j0=prok(b).y;
U[k]=x[k].u[i0][j0];
b.x=X[0][k+1]=f(X[0][k],X[1][k],U[k],0);
b.y=X[1][k+1]=f(X[0][k],X[1][k],U[k],1);
}
}
J=I(X,U);
flag=true;
if ((fabs(J-x[0].V[i_][j_])<=eps)||((J-J_)<=eps)) flag=false;
else
{
J_=J;
m1=2*m1;
m2=2*m2;
m3=2*m3;
N=2*N;
}
}
while (flag);
Edit5->Text=FloatToStr(J);
StringGrid1->Cells[0][0]="dt";
StringGrid1->Cells[1][0]="x1(t)";
StringGrid1->Cells[2][0]="x2(t)";
StringGrid1->Cells[3][0]="u(t)";
for (int i=0;i<=N;i++)
{
StringGrid1->Cells[0][i+1]=FloatToStrF(i*dt,ffGeneral,5,2);
StringGrid1->Cells[1][i+1]=FloatToStrF(X[0][i],ffGeneral,5,2);
StringGrid1->Cells[2][i+1]=FloatToStrF(X[1][i],ffGeneral,5,2);
if (i%10==0)
{
Chart1->Series[0]->AddXY(StrToFloat(i*dt),StrToFloat(X[0][i]),"",clRed);
Chart1->Series[1]->AddXY(StrToFloat(i*dt),StrToFloat(X[1][i]),"",clBlue);
|
|
}
if (i!=N)
{
StringGrid1->Cells[3][i+1]=FloatToStrF(U[i],ffGeneral,5,2);
if (i%10==0)
{
Chart2->Series[0]->AddXY(StrToFloat(i*dt),StrToFloat(U[i]),"",clRed);
}
}
}
delete []X;
delete [] x;
delete []U;
}