Розрахункова робота
Задача стабілізації руху
Мета роботи: розв’язати задачу стабілізації руху (мінімальними зусиллями добитися зупинки обертання).
Постановка задачі
Задано систему, яка описує обертовий рух тіла:
x1(0)=24,
x2(0)=16, x3(0)=16,
x1(T)=x2(T)= x3(T)=0;
T=1, 0 ? t ?1
Початкове наближення:
Функціонал задачі замінимо інтегральною сумою.
Почергово змінюються коефіцієнти Xn,i=Xn,i+/-Hi, що призводить до зміни значень u, через що понижується значення вказаної інтегральної суми.
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit4.h"
#include "Unit5.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit6.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
double x[3][101];
double u1[101], u2[101], u3[101];
double xp[3][101];
double u1p[101], u2p[101], u3p[101];
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=0,j=0;
double tau=0.01,T=1;
double F=0,F1=0,F1_1=0,F1_2=0,F1_3=0;
int k1=0,kil=0,kil1=0;
double dxk[3]={0,0,0};
//dxk[0]=Edit7->Text.ToDouble();
//dxk[1]=Edit7->Text.ToDouble();
//dxk[2]=Edit7->Text.ToDouble();
x[0][0]=24; x[1][0]=16; x[2][0]=16;
u1p[0]=24; u2p[0]=16;u3p[0]=16;
for (i=0;i<101;i++)
{
u1[i]=x[0][0]*(1-i/(100*T)); x[0][i]=u1[i]; xp[0][i]=u1[i];
u2[i]=x[1][0]*(1-i/(100*T)); x[1][i]=u2[i]; xp[1][i]=u2[i];
u3[i]=x[2][0]*(1-i/(100*T)); x[2][i]=u3[i]; xp[2][i]=u3[i];
}
for (i=0;i<100;i++)
{ u1[i+1]=(x[0][i+1]-x[0][i])*6/tau;
u2[i+1]= (x[1][i+1]-x[1][i])/tau + 0.2*\
(x[1][i+1]+x[1][i])*(x[2][i+1]+x[2][i])/4;
u3[i+1]=((x[2][i+1]-x[2][i])/tau - 0.2* \
(x[0][i+1]+x[0][i])*(x[1][i+1]+x[1][i])/4)*5;
u1p[i]=u1[i]; u2p[i]=u2[i]; u3p[i]=u3[i];
}
F=0;
for(i=0;i<100;i++)
{F+= fabs((u1[i]+u1[i+1])/2)+\
fabs((u2[i]+u2[i+1])/2)+\
fabs((u3[i]+u3[i+1])/2); }
Edit1->Text=F*tau;
ListBox1->Items->Add(F*tau);
Series1->Title="U1";
Series2->Title="U2";
Series3->Title="U3";
Series1->AddArray(u1,100);
Series2->AddArray(u2,100);
Series3->AddArray(u3,100);
Series4->Title="X1";
Series5->Title="X2";
Series6->Title="X3";
Series4->AddArray(x[0],100);
Series5->AddArray(x[1],100);
Series6->AddArray(x[2],100);
Form1->Update();
Form4->Show();
Form4->Series1->Title="U1";
Form4->Series2->Title="U2";
Form4->Series3->Title="U3";
Form5->Show();
Form5->Series1->Title="X1";
Form5->Series2->Title="X2";
Form5->Series3->Title="X3";
double eps=100;
x[0][100]=0;x[1][100]=0;x[2][100]=0;
do
{
dxk[0]=0.8; dxk[1]=0.8; dxk[2]=0.8;
F1=F;
for(k1=1;k1<100;k1++){
for(j=0;j<3;j++)
{ F=0;
for (i=1;i<99;i++)
{ u1[i+1]=(x[0][i+1]-x[0][i])*6/tau;
u2[i+1]= (x[1][i+1]-x[1][i])/tau + 0.2*\
(x[1][i+1]+x[1][i])*(x[2][i+1]+x[2][i])/4;
u3[i+1]=((x[2][i+1]-x[2][i])/tau - 0.2* \
(x[0][i+1]+x[0][i])*(x[1][i+1]+x[1][i])/4)/0.2;
}
for(i=1;i<99;i++)
{F+= fabs((u1[i]+u1[i+1])/2)+\
fabs((u2[i]+u2[i+1])/2)+\
fabs((u3[i]+u3[i+1])/2);}
F1_1=F; F=0;
x[j][k1]+=dxk[j];
for (i=1;i<99;i++)
{ u1[i+1]=(x[0][i+1]-x[0][i])*6/tau;
u2[i+1]= (x[1][i+1]-x[1][i])/tau + 0.2*\
(x[1][i+1]+x[1][i])*(x[2][i+1]+x[2][i])/4;
u3[i+1]=((x[2][i+1]-x[2][i])/tau - 0.2* \
(x[0][i+1]+x[0][i])*(x[1][i+1]+x[1][i])/4)/0.2;
}
for(i=1;i<99;i++)
{F+= fabs((u1[i]+u1[i+1])/2)+\
fabs((u2[i]+u2[i+1])/2)+\
fabs((u3[i]+u3[i+1])/2);}
F1_2=F; F=0;
x[j][k1]-=2*dxk[j];
for (i=1;i<99;i++)
{ u1[i+1]=(x[0][i+1]-x[0][i])*6/tau;
u2[i+1]= (x[1][i+1]-x[1][i])/tau + 0.2*\
(x[1][i+1]+x[1][i])*(x[2][i+1]+x[2][i])/4;
u3[i+1]=((x[2][i+1]-x[2][i])/tau - 0.2* \
(x[0][i+1]+x[0][i])*(x[1][i+1]+x[1][i])/4)/0.2;
}
for(i=1;i<99;i++)
{F+= fabs((u1[i]+u1[i+1])/2)+\
fabs((u2[i]+u2[i+1])/2)+\
fabs((u3[i]+u3[i+1])/2);}
F1_3=F; F=0;
if(F1_1<F1_2){ if(F1_1<F1_3){x[j][k1]+=dxk[j]; F=F1_1; }
else {x[j][k1]=x[j][k1]; F=F1_3;} }
else { if(F1_2<F1_3){x[j][k1]+=2*dxk[j]; F=F1_2;}
else {x[j][k1]=x[j][k1]; F=F1_3;} }
kil1++;
Edit6->Text=kil1;
if(F1*F1*F1*F1-F*F*F*F<0){dxk[j]=dxk[j]/2;}
}}
ListBox1->Items->Add(F*tau);
Edit2->Text=F1_1;
Edit3->Text=F1_2;
Edit4->Text=F1_3;
Edit5->Text=kil;
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
Series5->Clear();
Series6->Clear();
Series1->AddArray(u1,100);
Series2->AddArray(u2,100);
Series3->AddArray(u3,100);
Series4->AddArray(x[0],100);
Series5->AddArray(x[1],100);
Series6->AddArray(x[2],100);
Form1->Update();
Form4->Series1->Clear();
Form4->Series2->Clear();
Form4->Series3->Clear();
Form4->Series1->AddArray(u1,100);
Form4->Series2->AddArray(u2,100);
Form4->Series3->AddArray(u3,100);
Form4->Update();
Form5->Series1->Clear();
Form5->Series2->Clear();
Form5->Series3->Clear();
Form5->Series1->AddArray(x[0],100);
Form5->Series2->AddArray(x[1],100);
Form5->Series3->AddArray(x[2],100);
Form5->Update();
kil++;
eps= fabs( pow((F1_1+F1_2+F1_3)/3,5)-pow(F,5) );
}while ( eps>0.00000000001);
Button2->Visible=true;
CheckBox1->Visible=true;
CheckBox2->Visible=true;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form2->QRDBChart1->Series[0]->Clear();
Form2->QRDBChart1->Series[0]->Title="X1poch";
Form2->QRDBChart1->Series[0]->AddArray(xp[0],100);
Form2->QRDBChart2->Series[0]->Clear();
Form2->QRDBChart2->Series[0]->Title="X2poch";
Form2->QRDBChart2->Series[0]->AddArray(xp[1],100);
Form2->QRDBChart3->Series[0]->Clear();
Form2->QRDBChart3->Series[0]->Title="X3poch";
Form2->QRDBChart3->Series[0]->AddArray(xp[2],100);
Form2->QRDBChart4->Series[0]->Clear();
Form2->QRDBChart4->Series[0]->Title="U1poch";
Form2->QRDBChart4->Series[0]->AddArray(u1p,100);
Form2->QRDBChart5->Series[0]->Clear();
Form2->QRDBChart5->Series[0]->Title="U2poch";
Form2->QRDBChart5->Series[0]->AddArray(u2p,100);
Form2->QRDBChart6->Series[0]->Clear();
Form2->QRDBChart6->Series[0]->Title="U3poch";
Form2->QRDBChart6->Series[0]->AddArray(u3p,100);
Form2->QRDBChart10->Series[0]->Clear();
Form2->QRDBChart10->Series[0]->Title="X1";
Form2->QRDBChart10->Series[0]->AddArray(x[0],100);
Form2->QRDBChart11->Series[0]->Clear();
Form2->QRDBChart11->Series[0]->Title="X2";
Form2->QRDBChart11->Series[0]->AddArray(x[1],100);
Form2->QRDBChart12->Series[0]->Clear();
Form2->QRDBChart12->Series[0]->Title="X3";
Form2->QRDBChart12->Series[0]->AddArray(x[2],100);
Form2->QRDBChart9->Series[0]->Clear();
Form2->QRDBChart9->Series[0]->Title="U1";
Form2->QRDBChart9->Series[0]->AddArray(u1,100);
Form2->QRDBChart8->Series[0]->Clear();
Form2->QRDBChart8->Series[0]->Title="U2";
Form2->QRDBChart8->Series[0]->AddArray(u2,100);
Form2->QRDBChart7->Series[0]->Clear();
Form2->QRDBChart7->Series[0]->Title="U3";
Form2->QRDBChart7->Series[0]->AddArray(u3,100);
Form2->QuickRep1->Preview();
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Button2->Visible=false;
CheckBox1->Visible=false;
CheckBox2->Visible=false;
}
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(CheckBox1->Checked)
{
Form3->Chart1->Series[0]->Clear();
Form3->Chart1->Series[0]->Title="X1poch";
Form3->Chart1->Series[0]->AddArray(xp[0],100);
Form3->Chart1->Series[1]->Clear();
Form3->Chart1->Series[1]->Title="X2poch";
Form3->Chart1->Series[1]->AddArray(xp[1],100);
Form3->Chart1->Series[2]->Clear();
Form3->Chart1->Series[2]->Title="X3poch";
Form3->Chart1->Series[2]->AddArray(xp[2],100);
Form3->Show();
}else {Form3->Close();}
}
void __fastcall TForm1::CheckBox2Click(TObject *Sender)
{
if(CheckBox2->Checked)
{
Form6->Show();
Form6->Chart1->Series[0]->Clear();
Form6->Chart1->Series[0]->Title="U1poch";
Form6->Chart1->Series[0]->AddArray(u1p,100);
Form6->Chart1->Series[1]->Clear();
Form6->Chart1->Series[1]->Title="U2poch";
Form6->Chart1->Series[1]->AddArray(u2p,100);
Form6->Chart1->Series[2]->Clear();
Form6->Chart1->Series[2]->Title="U3poch";
Form6->Chart1->Series[2]->AddArray(u3p,100);
}else {Form6->Close();}}
Рисунок 1 --– Результат роботи програми
Висновок: на даній розрахунковій роботі було розв’язано задачу стабілізації руху. Було розглянуто обертовий рух тіла, досягнуто зупинки обертання мінімальними зусиллями.