Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Симонов_курсовой_финал.docx
Скачиваний:
164
Добавлен:
13.03.2016
Размер:
1.49 Mб
Скачать

Текст программы

Program lol;

label stop;

const dx=0.0001;

type array2D=array [1..4,1..4] of real;

var x,df:array of real;

d2f:array2D;

eps,h,grad,s:real;

i,j,n,q:integer;

function f(x:array of real):real;

Begin

f:=2*sqr(x[1])+4*sqr(x[2])+8*sqr(x[3])+2*x[1]*x[2]-x[1]*x[3]+2*x[2]*x[3]+6*x[1]-7*x[3]

End;

Procedure invert(n,q:integer;matr1:array2D;var matr:array2D);

label M1,M2;

var a:array [1..4,1..8] of real;

i,j,k,m:integer;

t:real;

begin

m:=2*n; q:=0;

for i:=1 to n do

for j:=1 to m do

if j<=n then a[i,j]:=matr1[i,j] else

if j=n+i then a[i,j]:=1.0 else a[i,j]:=0;

for i:=1 to n do

begin k:=i;

M1:if a[k,i]=0 then

begin q:=1;

if k<n then k:=k+1 else goto M2;

goto M1;

end;

if q=1 then

for j:=1 to m do

begin t:=a[k,j]; a[k,j]:=a[i,j]; a[i,j]:=t

end;

for j:=m downto i do a[i,j]:=a[i,j]/a[i,i];

for k:=1 to n do

if k<>i then

for j:=m downto 1 do

a[k,j]:=a[k,j]-a[i,j]*a[k,i];

end;

q:=0;

for i:=1 to n do

for j:=1 to n do matr[i,j]:=a[i,j+n];

M2: end;

{Процедура вычисления координат вектора градиента и фомирования матрицы вторых производных}

procedure For_Mat_d2f(n:integer; var grad:real);

var

i,j:integer;

s,f0:real;

begin

//расчет производных

f0:=f(x);s:=0;

for i:=1 to n do

begin

x[i]:=x[i]+dx;

df[i]:=(f(x)-f0)/dx;

s:=sqr(df[i]);

x[i]:=x[i]-dx;

end;

grad:=sqrt(s);

//расчет вторых производных

for i:=1 to n do

begin

s:=-2*f(x);

x[i]:=x[i]+dx;

s:=s+f(x);

x[i]:=x[i]-2*dx;

s:=s+f(x);

x[i]:=x[i]+dx;

d2f[i,i]:=s/sqr(dx);

end;

//расчет смешанных производных

for i:=1 to n-1 do

for j:=i+1 to n do

begin

s:=f(x); {1}

x[i]:=x[i]-dx; x[j]:=x[j]-dx;

s:=s+f(x); {4}

x[j]:=x[j]+dx;

s:=s-f(x);{2}

x[i]:=x[i]+dx; x[j]:=x[j]-dx;

s:=s-f(x);{3}

x[j]:=x[j]+dx;

d2f[i,j]:=s/sqr(dx);

d2f[j,i]:=d2f[i,j];

end;

end; {For_Mat_d2f}

//*****************

begin

writeln('исходныеданные');

writeln;

write('введите размерность задачи оптимизации n=');

readln(n);

SetLength(x,n+1);

SetLength(df,n+1);

write('введите точность вычислений eps=');

readln(eps);

writeln('введите начальные значения переменных');

for i:=1 to n do

begin

write('x[',i,']=');

readln(x[i]);

end;

repeat

For_Mat_d2f(n,grad);

invert(n,q,d2f,d2f);

if q=1 then begin writeln('определительравеннулю');

goto stop end;

for i:=1 to n do

begin

s:=0;

for j:=1 to n do

s:=s+d2f[i,j]*df[j];

x[i]:=x[i]-s;

end;

until grad<eps;

writeln;

writeln('результатыоптимизации:'); writeln;

for i:=1 to n do

writeln('x[',i,']=',x[i]);

writeln;

writeln('значение функции цели = ',f(x));

stop:readln;

end.

Результаты расчета

Полученные значения совпадают с результатами минимизации из учебника [6].

1.6. Программа оптимизации теплообменного аппарата

Для разработки предложенной программы была использована среда PascalABC совместно с офисным пакетом Microsoft Excel 2010.

Текст программы

Program simone;

Constdx=0.0001;

Q=10000000; //Производительность

Tv1=64; //Начальная температура воды

Tv2=138; //Конечная температура воды

Tn=175.4; //Температура пара

R_zagr=0.00015; //Степень загрязнения

teta=0.98; //Коэффициент тепловых потерь

Lam_st=43; //Коэффициент теплопроводности

Delta_st=0.0025; //Толщина стенки

//Ограничения

dmax=10;

dmin=0.00000001;

Wmax=10;

Wmin=0.0000001;

//Параметры стенки

Pr_c=1.278;

Kw=0.0001;

Tc=138.2;

Lam_c=0.685;

mu_c=204.106/1000000;

L_tr=3;

//Параметры воды

Ro=957.66;

Cp=4221;

Lam_v=0.6832;

v=0.293/1000000;

Pr=1.735;

//Параметры пара

r1=2030.4;

mu_s=157.5/1000000;

Lambda_s=0.676;

Pr_s=1.023;

Ro_s=4.66;

w11=0.162;

//Цена

Cena_F=2000;

Cena_ElEn=5;

v_s=0.173/1000000;

dT=37.7;

H1=3;

type array2D = array of array of real;

Var x,x0,df,g :array of real; d2f:array2D;

eps,h,grad,s,r,fc,P,c :real;

i,j,n,n1,k,l :integer;

Alfa_vod,K_tp,F_ta,dP,N_nasosa,Zatr_F,

Zatr_ElEn,Delta_t,G_vod,Lambda,Alfa_para,a,an,eps1,Q_ta,HdTkr: real;

Function barier(g:array of real): real;

label stop;

Var i:integer;

s:real;

Begin

s:=0;

barier:=1e30;

For i:=1 to n1 do

if g[i]<0 then s:=s+1/g[i] else goto stop;

barier:=-r*s;

stop: end;

Function f(x: array of real):real;

Begin

eps1:=Power((Power(Lam_c/Lambda_s ,3)*(mu_c/mu_s)),0.125);

an:=0.725*Power( ( Power(Lam_v,3)*9.81*(Ro-Ro_s)*r1*1000)/(v*x[1]*(Tn-Tc)) ,0.25 )*eps1;

a:=25.7*Power((Ro_s*w11*w11)/(9.81*Ro*x[1]),0.08)*Power((an*x[1]/Lam_v),(-0.5))*an;

Alfa_para:=(a*0.84)/Power(10,0.07);

Delta_t:=((Tn-Tv1)-(Tn-Tv2))/ln((Tn-Tv1)/(Tn-Tv2));

Alfa_vod:=(0.021*Power((x[2]*x[1]/v),0.8)*Power(Pr,0.43)*Power((Pr/Pr_c),0.25)*Lam_v)/x[1];

K_tp:=1/(1/Alfa_para+Delta_st/Lam_st+1/Alfa_vod+R_zagr);

Q_ta:=Q*teta;

F_ta:=Q_ta/(K_tp*Delta_t);

Lambda:=0.11*Power((Kw/x[1])+(v*68/x[2]*x[1]),0.25);

dP:=Lambda*(L_tr/x[1])*(x[2]*x[2]/2)*Ro+7.5*(Ro*x[2]*x[2]/2);

G_vod:=Q_ta/(Cp*(Tv2-Tv1));

N_nasosa:=(G_vod*dP)/(Ro*0.85);

Zatr_F:=F_ta*Cena_F;

Zatr_ElEn:=(N_nasosa*8400/1000)*Cena_ElEn;

fc:=Zatr_F+Zatr_ElEn;

//Ограничения

g[1]:=-dmax+x[1];

g[2]:=-x[1]+dmin;

g[3]:=-Wmax+x[2];

g[4]:=-x[2]+Wmin;

P:=barier(g);

F:=fc+P;

End;

//Процедураобращенияматрицы

Procedure invert(n,q: integer; matr1:array2D; var matr: array2D);

label M1,M2;

Var

a:array of array of real;

i,j,k,m : integer;

t :real;

Begin

SetLength(a, n + 1);

For i := low(a) to high(a) do

SetLength(a[i], 2*(n+1));

m:=2*n; q:=0;

For i:=1 to n do

For j:= 1 to m do

If j<=n then a[i,j]:=matr1[i,j] else

If j=n+i then a[i,j]:=1.0 else a[i,j]:=0;

For i:=1 to n do

Begin k:=i;

M1: if a[k,i]=0 then

Begin q:= 1;

if k<n then k:=k+1 else goto M2;

goto M1;

End;

If q=1 then

For j:=1 to m do

Begin

t:=a[k,j]; a[k,j]:=a[i,j]; a[i,j]:=t

End;

For j:=m downto i do a[i,j]:=a[i,j]/a[i,i];

For k:= 1 to n do

If k<>i then

For j:=m downto 1 do

a[k,j]:=a[k,j]-a[i,j]*a[k,i];

End; { i }

q:=0;

For i:= 1 to n do

For j:= 1 to n do matr[i,j]:=a[i,j+n];

M2: End; {invert}

// Процедура вычисления координат вектора градиента и формирования матрицы вторых производных

Procedure For_Mat_d2f(n:integer; var grad:real);

Var

i,j :integer;

s,f0: real;

Begin

//Расчет первых производных

f0:=f(x); s:=0;

For i:= 1 to n do begin

x[i]:=x[i]+dx;

df[i]:=(f(x)-f0)/dx;

s:=sqr(df[i]);

x[i]:=x[i]-dx;

End;

grad:=sqrt(s);

//Расчет вторых производных

For i:=1 to n do

Begin

s:=-2*f(x);

x[i]:=x[i]+dx;

s:=s+f(x);

x[i]:=x[i]-2*dx;

s:=s+f(x);

x[i]:=x[i]+dx;

d2f[i,i]:=s/sqr(dx);

End;

//Расчет смешанных производных

For i:= 1 to n-1 do

For j:=i+1 to n do

Begin

s:=f(x); // 1

x[i]:=x[i]-dx; x[j]:=x[j]-dx;

s:=s+f(x); //4

x[j]:=x[j]+dx;

s:=s-f(x); //2

x[i]:=x[i]+dx; x[j]:=x[j]-dx;

s:=s-f(x); //3

x[j]:=x[j]+dx;

d2f[i,j]:=s/sqr(dx);

d2f[j,i]:=d2f[i,j];

End;

End; // For_Mat_d2f

Procedure tek_koord;

Var i,j :integer;

s: real;

Begin

Repeat

For_Mat_d2f(n,grad);

invert(n,q,d2f,d2f);

If q = 1 then

Begin

writeln('Определительравеннулю');

exit {goto stop}

End;

For i:= 1 to n do

Begin

s:=0;

For j:= 1 to n do

s:=s+d2f[i,j]*df[j];

x[i]:=x[i]-s;

End;

Until grad<eps;

End; // tek_koord

Procedure print;

Var i : integer;

Begin

Writeln('Итерация ',k, ' Параметрштрафаr=',r: 12:8);

For i:=1 to n do

Begin

Writeln('x0[',i,'] = ',x0[i], 'x[',i,'] = ',x[i]);

x0[i]:=x[i]

End;

writeln('Функцияштрафа = ',P);

writeln

End;

Begin

Writeln('Исходныеданные');

Writeln;

Write('Введите размерность задачи оптимизации n= ');

Readln(n);

Write('Введите точность вычислений eps= ');

Readln(eps);

Writeln('Введите начальные значения переменных');

SetLength(x,n + 1);

SetLength(x0,n+1);

SetLength(df,n+1);

SetLength(g,n + 3);

SetLength(d2f, n + 1);

For i := low(d2f) to high(d2f) do

SetLength(d2f[i], n+1);

For i:= 1 to n do

Begin

Write('x[',i,']=');

Readln(x[i]);

End;

Write('Введите число ограничений = ');

Readln(n1);

Write('Введите начальное значение параметра штрафа r=');

Readln(r);

Write('Введите число уменьшения параметра штрафа с=');

Readln(c);

Writeln;

k:=0;

Repeat

k:=k+1;

tek_koord;

print;

r:=r/c;

Until abs(P)<0.01;

Writeln;

Writeln('Peзyльтaтыоптимизации');

Writeln('c использованием обратной штрафной функции:');

Writeln;

For i:= 1 to n do writeln('x[',i,'] = ',x[i]);

Writeln;

Writeln('Значение функции цели = ',f(x));

Writeln;

Writeln('Значение функции цели = ',f(x));

Writeln;

Writeln('Значение функции цели = ',f(x));

Writeln;

Writeln('Оптимальные значения ');

Writeln;

Writeln('диаметр d = ',x[1]:2:3,' м');

Writeln;

Writeln('скоростьw = ',x[2]:2:3,' м3/с');

Writeln;

Writeln('ЗатратыЗ= ',f(x):8:3,' руб');

Writeln;

Writeln('ПлощадьтеплообменногоаппаратаF= ',F_ta:5:3,' м2');

Readln;

End.

Результаты оптимизации данной программы быть представлены на рисунке 1.2.

Рис.1.2. - Результаты оптимизации теплообменного аппарата

З=f(dвн,w)

Рис.1.3. – Изменение затрат

В программе Surfer 13 был построен график зависимости скорости в теплообменном аппарате от диаметра его труб.

Рис 1.4. – Зависимость диаметра от скорости теплоносителя с ограничениями

Из результатов оптимизации функции затрат для рассматриваемого аппарата видно, что минимум (З=140607.015 руб) достигается при dвн=17.915 мм, F=63.477 и скорости теплоносителя в трубахw=1.185 м/с.

По каталогу был выбран стандартный теплообменный аппарат, тип ихарактеристики данного аппарата представлены в таблице 1.1:

Таблица 1.1. - Характеристики теплообменного аппарата

Тип аппарата

Диаметр кожуха, мм

Условное давление, МПа

Число ходов по трубам

Наружный диаметр труб, мм

Площадь поверхности теплообменника, м2

Площадь проходного сечения одного хода по трубам, м2

Площадь проходного сечения по межтрубному пространству, м2

Наружный

Внутренний

В кожухе

В трубах

При длине прямого

участка 3000 мм

При толщине стенки труб, мм

В вырезе перегородки

Между перегородками

1,8

2

ТН

630

600

1,6

1,6

2

20

73

0,039

0,037

0,037

0,048