.


:




:

































 

 

 

 


 

 

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;

}



 



<== | ==>
5 |
:


: 2016-09-03; !; : 766 |


:

:

, , .
==> ...

1728 - | 1390 -


© 2015-2024 lektsii.org - -

: 0.117 .