Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Алгоритм реализации схемы Беллмана

ОТЧЕТ

 

 

По лабораторной работе №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; Мы поможем в написании ваших работ!; просмотров: 780 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Два самых важных дня в твоей жизни: день, когда ты появился на свет, и день, когда понял, зачем. © Марк Твен
==> читать все изречения...

2253 - | 2077 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.