Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчет по лабораторной работе №5 по ТОУ 4 курс

.doc
Скачиваний:
4
Добавлен:
14.11.2019
Размер:
352.26 Кб
Скачать

Министерство образования Российской Федерации

Государственное образовательное учреждение

Высшего профессионального образования

«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Математический факультет

Кафедра Прикладной математики

ОТЧЕТ

По лабораторной работе №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;

}