Отчет по лабораторной работе №5 по ТОУ 4 курс
.docМинистерство образования Российской Федерации
Государственное образовательное учреждение
Высшего профессионального образования
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Математический факультет
Кафедра Прикладной математики
ОТЧЕТ
По лабораторной работе №5
по курсу Теория оптимального управления
Метод штрафных функций
ОГУ 010200.6006.02 О
Руководитель
_____________ Иванова Ю.П.
“___ ”______________2011 г.
Исполнитель
студент гр. 08 ПриМ
_______________Кияева Е. А.
“___ ” _____________2011 г.
Оренбург 2011
Содержание
Постановка задачи………………………………………………………..3
Метод штрафных функций………………………………………………4
Практическая часть……………………………………………………….8
Приложение А – Листинг программы………………………………….12
Постановка задачи
Требуется решить методом штрафных функций следующую задачу.
Найти минимум функционала
|
|
при динамических ограничениях, заданных системой дифференциальных уравнений
,
|
|
с начальными условиями
|
|
Фазовые ограничения
, |
|
и управление почти всюду на [0,Т] удовлетворяют ограничениям
, |
|
где Т – фиксировано и принимает значение из отрезка [3,20].
Метод штрафных функций
Рассмотрим задачу оптимального управления с фазовыми и смешанными ограничениями
, |
(1) |
, |
(2) |
, |
(3) |
, |
(4) |
, , |
(5) |
где , , |
(6) |
: , |
|
: . |
|
Функции, входящие в постановку задачи, являются непрерывными по t, непрерывно дифференцируемыми по х и непрерывными по u. Будем решать эту задачу методом штрафных функций.
Включим ограничения (4) и (5) в функционал с помощью штрафного слагаемого и перейдем к следующей последовательности задач:
|
(7) |
, |
(8) |
, |
(9) |
, |
(10) |
где , . |
|
Каждая из задач последовательности является задачей с закрепленным левым и свободным правым концом и решается по рассмотренной выше схеме. Начальным приближением для решения очередной задачи служит решение предыдущей задачи. Каждая последующая задача решается с большей точностью, чем предыдущая. Дискретная задача оптимального управления, аппроксимирующая непрерывную, имеет вид
|
(11) |
, , |
(12) |
, |
(13) |
, . |
(14) |
Алгоритм метода штрафов
Шаг |
Действие |
1 |
Выбирать начальное значение коэффициента штрафа ; |
2 |
Задать начальное приближение управления – допустимый набор где ; |
3 |
Построить начальную траекторию: , где , используя разностные уравнения и начальные условия: |
4 |
Вычислить начальное приближение целевой функции : |
5 |
Положить, что − решение -ой задачи в методе штрафных функций; |
6 |
Переход к следующему шагу метода штрафных функций. Увеличить коэффициент штрафа ( − постоянный множитель): |
7 |
Вычислить сопряженные переменные по формулам
; |
8 |
Вычислить управление по формуле
|
9 |
Вычислить соответствующую этому управлению траекторию |
10 |
Вычислить очередное приближение целевой функции
; |
11 |
Проверить условие монотонности: если , то переход к шагу 12, иначе − − переход к шагу 14; |
12 |
Проверить, достигнута ли заданная точность вычислений в итерационном методе. Если и , то переход к шагу 14, иначе – к шагу 13; |
13 |
Положить , переход к шагу 7; |
14 |
Положить, что − решение задачи в методе штрафных функций; |
15 |
Проверить, выполнена ли точность вычислений в методе штрафных функций: если и , то переход к шагу 18, иначе – к шагу 16; |
16 |
Положить |
17 |
Увеличить точность вычислений при решении очередной задачи: и перейти к шагу 6; |
18 |
Принять за решение исходной задачи . Конец алгоритма. |
Практическая часть
Включим фазовые ограничения из постановки задачи в функционал с помощью штрафного слагаемого и перейдем к следующей последовательности задач:
,
,
Проведем дискретную аппроксимацию поставленной задачи. Для этого разобъем отрезок [0;2π] точками на q частей. Обозначим значения в точках разбиения следующим образом:
Для приближенного вычисления минимизируемого функционала воспользуемся формулой левых прямоугольников
Для аппроксимации дифференциального уравнения воспользуемся схемой Эйлера, то есть
C начальными условиями
и ограничениями на управление
Составим функцию Лагранжа
Условие стационарности по x
Условие стационарности по x используем для вычисления сопряженных переменных.
Найдем частные производные от функции Лагранжа по управлению
С помощью метода штрафных функций получим решение дискретной задачи (рисунок 1).
Приложение А
(обязательное)
Листинг программы
TForm1 *Form1;
int q,n=2;
double a=-0.1;
double T=20,t0=3;
double dt;
typedef double **mass;
typedef double *mas;
double f(mass x, mass u,int j,int l)
{
switch (j)
{
case 0: return x[0][l]+0.1*x[1][l]-u[0][l];
case 1: return 0.1*x[0][l]+a*x[1][l]-u[1][l];
}
}
double F0(mass x,mass u,int l)
{
return x[0][l]+x[1][l]+0.1*(u[0][l]+u[1][l]);
}
double FI(mass x)
{
return 0;
}
double dF0x(mass x, int j)
{
switch (j)
{
case 0: return 1;
case 1: return 1;
}
}
double dF0u(mass x, double dt, int j)
{
switch (j)
{
case 0: return 0.1;
case 1: return 0.1;
}
}
double dfx(mass x,double dt, int j)
{
switch (j)
{
case 0: return 1;
case 1: return 0.1;
case 2: return 0.1;
case 3: return (-0.1);
}
}
double dfu(mass x,double dt, int j)
{
switch (j)
{
case 0: return (-1);
case 1: return (-1);
}
}
double dFi(double x,double dt, int j)
{
switch (j)
{
case 0: return 0;
case 1: return 0;
}
}
double g1(mass x,int l)
{
if ((-x[0][l])<=0) return 0;
else return (-x[0][l]);
}
double dg1(mass x, double dt,int l,int j)
{
if (-x[0][l]<=0)
{
switch (j)
{
case 0: return 0;
case 1: return 0;
}
}
else
{
switch (j)
{
case 0: return (-1);
case 1: return 0;
}
}
}
double g2(mass x, int l)
{
if (-x[1][l]<=0) return 0;
else return (-x[1][l]);
}
double dg2(mass x, double dt,int l,int j)
{
if (-x[1][l]<=0)
{
switch (j)
{
case 0: return 0;
case 1: return 0;
}
}
else
{
switch (j)
{
case 0: return (-1);
case 1: return 0;
}
}
}
double dLdu1(mass x,double d,double p)
{
return dF0u(x,dt,0)*d-dfu(x,dt,0)*p;
}
double dLdu2(mass x,double d,double p)
{
return dF0u(x,dt,1)*d-dfu(x,dt,1)*p;
}
mass Proecz (int n, mass u)
{
for (int i=0; i++; i<n)
{
if (u[0][i]>1)
{
u[0][i]=1;
u[1][i]=0;
}
if (u[1][i]>1)
{
u[0][i]=0;
u[1][i]=1;
}
if (u[0][i]<0)
{
u[0][i]=0;
u[1][i]=1;
}
if (u[1][i]<0)
{
u[0][i]=1;
u[1][i]=0;
}
if (u[0][i]>0 && u[0][i]<1)
{
u[1][i]=1-u[0][i];
}
if (u[1][i]>0 && u[1][i]<1)
{
u[0][i]=1-u[1][i];
}
}
}
mass prisw(mass a, mass b)
{
for (int j=0;j<=q;j++)
for (int i=0;i<n;i++)
a[i][j]=b[i][j];
return a;
}
double Fx(mass x,mass psi,int j,double dt)
{
double s=0;
return int(x[0][j]*psi[0][j]*dt+x[1][j]*psi[1][j]*dt);
}
double dFx(mass x,double dt,mass psi, int j)
{
double F=Fx(x,psi,j,dt);
return (F-Fx(x,psi,j,dt))/dt;
}
bool max(mass x, mass y,double eps)
{double MAX;
bool flag1;
for (int i=0;i<n;i++)
{MAX=fabs(x[i][0]-y[i][0]);
for (int j=0;j<=q;j++)
if (fabs(x[i][j]-y[i][j])>MAX) MAX=fabs(x[i][j]-y[i][j]);
if (MAX>=eps) flag1=true;
else flag1=false;
}
return flag1;
}
double H(mass x,mass u, mass psi, int l)
{
return psi[0][l]*f(x,u,l,0)+psi[1][l]*f(x,u,l,1)-F0(x,u,l);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Chart1->Series[0]->Clear();
Chart2->Series[0]->Clear();
Chart3->Series[0]->Clear();
StringGrid1->ColCount=n+3;
int iter=0;
mas f0;
bool flag=false;
dt=StrToFloat(Edit1->Text);
A=StrToFloat(Edit2->Text);
a=StrToFloat(Edit3->Text);
double J0,J1,Jk,Jk1, epsx=StrToFloat(Edit5->Text), epsj=StrToFloat(Edit4->Text)alfa;
double p=(20.0-3.0)/dt;
q=p;
double dtj=epsj, dtx=epsx;
mass x,x1,xk,xk1,fx,psi,x1,u,u1,uk,uk1;
x=new double*[n], xk1=new double*[n],uk=new double*[m];
x1=new double*[n],u=new double*[m],uk1=new double*[m];
xk=new double*[n],u1=new double*[m],psi=new double*[n];
for (int i=0;i<n;i++)
{
x[i]=new double [q+1];
x1[i]=new double [q+1];
xk[i]=new double [q+1];
xk1[i]=new double [q+1];
psi[i]=new double [q+1];
}
for (int i=0;i<m;i++)
{
u[i]=new double [q];
u1[i]=new double [q];
uk1[i]=new double [q];
uk[i]=new double [q];
}
for (int j=0;j<p+1;j++)
for (int i=0;i<n+1;i++)
x1[i][j]=0;
mas dL=new double [q+1];
int k=0;
for (int i=0;i<=q-1;i++)
{
u[0][i]=0.2;
u[1][i]=1-u[0][i];
}
x[0][0]=0.1;
x[1][0]=5;
for (int i=0;i<=q-1;i++)
{
x[0][i+1]=x[0][i]+f(x,u,0,i)*dt;
x[1][i+1]=x[1][i]+f(x,u,1,i)*dt;
}
double s1=0;
for (int i=0;i<=q-1;i++)
{
s1+=g1(x,i)*g1(x,i)+g2(x,i)*g2(x,i);
}
double s2=0;
for (int i=0;i<=q-1;i++)
{
s2+=F0(x,u,i)*dt;
}
J0=s2-0.1*s1*dt-0.1*(g1(x,q-1)+g2(x,q-1));
J1=J0;
x=prisw(x1,x);
u=prisw(u1,u);
flag=false;
do
{
A*=2; k++;
psi[0][q]=A*g1(x,q-1);
psi[1][q]=A*g2(x,q-1);
for (int i=q-1; i--; i>=0)
{
psi[0][i]=psi[0][i+1]-dF0x(x,0)*dt-2*A*dg1(x,dt,i,0)*dt+(dfx(x,dt,0)*psi[0][i+1]+dfx(x,dt,1)*psi[1][i+1])*dt;
psi[1][i]=psi[1][i+1]-dF0x(x,1)*dt-2*A*dg2(x,dt,i,1)*dt+(dfx(x,dt,2)*psi[0][i+1]+dfx(x,dt,3)*psi[1][i+1])*dt;
}
s1=0;
for (int i=0;i<=q-1;i++)
{
s1+=g1(x,i)*g1(x,i)+g2(x,i)*g2(x,i);
}
for (int i=0;i<=q-1;i++)
{
u1[0][i]=u[0][i]-A*dLdu1(x,dt,psi[0][i]);
u1[1][i]=u[1][i]-A*dLdu2(x,dt,psi[1][i]);
}
u=Proecz(q,u1);
x1[0][0]=0.1;
x1[1][0]=5;
for (int i=0;i<=q-1;i++)
{
x1[0][i+1]=x1[0][i]+f(x,u,0,i)*dt;
x1[1][i+1]=x1[1][i]+f(x,u,1,i)*dt;
}
s1=0;
for (int i=0;i<=q-1;i++)
{
s1+=g1(x1,i)*g1(x1,i)+g2(x1,i)*g2(x1,i);
}
s2=0;
for (int i=0;i<=q-1;i++)
{
s2+=F0(x1,u1,i)*dt;
}
J1=s2+A*s1*dt+A*(g1(x1,q-1)+g2(x1,q-1));
if (J1<J0)
if ((fabs(J0-J1)>=epsj) &&(max(x,x1,epsx)))
{
J0=J1; x=prisw(x,x1); u=prisw(u,u1); flag=true;
}
else
{ Jk1=J1; xk1=prisw(xk1,x1); uk1=prisw(uk1,u1); flag=false;}
else
{
J1=J0; x1=prisw(x1,x); u1=prisw(u1,u);
Jk1=J1; xk1=prisw(xk1,x1); uk1=prisw(uk1,u1); flag=false;
}
}
while (flag);
flag=true;
if ((fabs(Jk-Jk1)>=dtj)&&(max(xk,xk1,dtx)))
{
Jk=Jk1; xk=prisw(xk,xk1); uk=prisw(uk,uk1); epsj=epsj/2; epsx=epsx/2; flag=true;
}
else
{
flag=false;
}
}
while (flag);
Edit6->Text=FloatToStr(Jk1);
StringGrid1->RowCount=q+1;
Chart2->LeftAxis->Automatic=false;
Chart2->LeftAxis->Maximum=2;
Chart2->LeftAxis->Minimum=-2;
Chart3->LeftAxis->Automatic=false;
Chart3->LeftAxis->Maximum=3;
Chart3->LeftAxis->Minimum=0;
for (int i=0;i<=q;i++)
{
StringGrid1->Cells[0][i]=FloatToStrF(i*dt,ffGeneral,5,2);
StringGrid1->Cells[1][i]=FloatToStrF(xk1[0][i],ffGeneral,5,2);
StringGrid1->Cells[2][i]=FloatToStrF(xk1[1][i],ffGeneral,5,2);
if (i%10==0)
{
Chart1->Series[0]->AddXY(StrToFloat(i*dt),StrToFloat(xk1[0][i]),"",clRed);
Chart1->Series[1]->AddXY(StrToFloat(i*dt),StrToFloat(xk1[1][i]),"",clBlue);
}
if (i!=q)
{
StringGrid1->Cells[3][i]=FloatToStrF(uk1[0][i],ffGeneral,5,2);
StringGrid1->Cells[4][i]=FloatToStrF(uk1[1][i],ffGeneral,5,2);
StringGrid1->Cells[5][i]=FloatToStrF(H(xk1,uk1,psi,i),ffGeneral,5,2);
if (i%10==0)
{
Chart3->Series[0]->AddXY(StrToFloat(i*dt),StrToFloat(H(xk1,uk1,psi,i)),"",clRed);
Chart2->Series[0]->AddXY(StrToFloat(i*dt),StrToFloat(uk1[0][i]),"",clRed);
Chart2->Series[1]->AddXY(StrToFloat(i*dt),StrToFloat(uk1[1][i]),"",clGreen);
}
}
}
delete [] x;
delete [] x1;
delete [] u1;
delete [] u;
delete [] uk;
delete [] uk1;
delete [] xk1;
delete [] xk;
delete [] psi;
}