/
Содержание
4. Параметрическая оптимизация электрической цепи
Цель параметрического синтеза - определение числовых значений параметров элементов. Синтез носит название оптимизации, если определяются наилучшие в заданном смысле структуры и значения параметров. Задачу выбора оптимальной структуры называют структурной оптимизацией, а расчет оптимальных значений параметров при заданной структуре - параметрической оптимизацией.
В общем случае решение задачи параметрической оптимизации осуществляется путем перебора определенным образом выбираемых вариантов значений параметров, сравнения их между собой и выбора наилучшего варианта. Алгоритм выбора очередного варианта значений параметров носит название стратегии поиска.
Чаще всего решение задачи параметрической оптимизации проводится в несколько этапов. На первом этапе выделяют области параметров, в которых целевая функция является унимодальной, на втором - уточняют положения точек локального минимума в областях унимодальности, а затем среди точек локального минимума выбирают точку глобального минимума. При этом наиболее сложным и не поддающимся строгой алгоритмизации и формализации является первый этап. Для реализации второго этапа применяют специальные итерационные численные методы поиска экстремумов унимодальных функций.
Параметрическая оптимизация осуществляется в пространстве двух варьируемых параметров методом координатного спуска в соответствии с алгоритмом:
Procedure Koord(var Pmin:Vect; var Kpmin:real);
var i:byte;
P,PL:Vect;
def:boolean;
begin
for i:=1 to s do
p[i]:=(pl[i]+pp[i])/2;
repeat
PL:=P;
for i:=1 to s do
begin
p[i]:=Gold(P,i);
end;
def:=true;
for i:=1 to s do
if abs(p[i]-pl[i])-delt*abs(p[i]+pl[i])/2>=0 then def:=false;
until def;
for i:=1 to s do
pmin[i]:=(p[i]+pl[i])/2;
Kpmin:=Kp_nep(Pmin);
end;
5. Результаты работы программы
Список используемой литературы
Четвергов К.В. Информатика. Часть 3. Учебное пособие для студентов специальности 'Промышленная электроника' дистанционной формы обучения. - Томск: ТУСУР 1998. - 55с.
Листинг программы
program kurs;
Uses Crt, Graph;
Const N=2; E0=110;Ec=50;Es=50; L=0.0001; C=0.000001; R1=1; R2=1; R3=R2; R4=100;R5=R4;delt=0.01;TT=0.01;w=2*pi/TT;M=100;h=TT/M;s=2; Pl:array[1..s] of real=(1e-4,1e-6);
Pp:array[1..s] of real=(1e-1,1e-2); Type Matrix=array[1..N,1..N] of real;
Vector=array[1..N] of real;Vect=array[1..s] of real;
Var A:Matrix;
B0,Bc,Bs,B,D0,Dc,Ds,D,Lam,X,X1:Vector;
P:Vect;
t,kpmax,Z1,Z2,K1,K2,K3,K4:real;
grdr,grmd,i,j,k:integer; X0,Y01,Y02,Y03,xx,xx1,y1,y11,y2,y21,y3,y31,y4,y41,y5,y51,y6,y61:integer; kx,ky1,ky2,ky3:real;
def:boolean;
{********************Процедура сложения двух матриц A_sum=A1+A2}
Procedure Add_Matr(n:byte;A1,A2:Matrix; var A_rez:Matrix);
var i,j:byte;
begin
for i:=1 to n do
for j:=1 to n do
a_rez[i,j]:=a1[i,j]+a2[i,j]
end;
{******************Процедура сложения двух векторов B_sum=B1+B2} Procedure Add_Vect(n:byte;B1,B2:Vector; var B_rez:Vector);
var i:byte;
begin
for i:=1 to n do
b_rez[i]:=b1[i]+b2[i]
end;
{*******************Процедура умножения двух матриц A_rez=A1*A2} Procedure Mult_Matr_Matr(n:byte;A1,A2:Matrix; var A_rez:Matrix);
var i,j,k:byte;
begin
for i:=1 to n do
for j:=1 to n do
begin
a_rez[i,j]:=0;
for k:=1 to n do a_rez[i,j]:=a_rez[i,j]+a1[i,k]*a2[k,j];
end;
end;
{*******************Процедура умножения матрицы на вектор Y=A*X} Procedure Mult_Matr_Vect(n:byte;A:Matrix; X:Vector; var Y:Vector);
var i,j:byte;
begin
for i:=1 to n do
begin
y[i]:=0;
for j:=1 to n do
y[i]:=y[i]+a[i,j]*x[j];
end;
end;
{******Процедура умножения матрицы на вещественное число A:=A*c} Procedure Mult_Matr_Sc(n:byte; var A:Matrix; Sc:real);
var i,j:byte;
begin
for i:=1 to n do
for j:=1 to n do
a[i,j]:=Sc*a[i,j];
end;
{******Процедура умножения вектора на вещественное число B:=B*c} Procedure Mult_Vect_Sc(n:byte; var B:Vector; Sc:real);
var i:byte;
begin
for i:=1 to n do b[i]:=Sc*b[i];
end;
{************* Формирование матриц А,B0,Bc,Bs математической модели }
Procedure Def_A_B(P:Vect);
begin
Z1:=1+R1*R3/(R4*R1+R4*R3-R2*R4-R3*R2);
Z2:=R4*R1+R4*R3-R2*R4-R3*R2; K1:=r4/z2*r3/z1*r1*r3/z2-r3*r4/z2+r4/z2*r3*r5/z1-r3/z2*(r4+r3)/z1*r1/z2+(r4+r3)/z2-r5/z2*r3/(r4+r5)*1/z1; K3:=r4/z1*r1*r3/z2+r4/(r4+r5)*r5/z1+r1/z2*(r3+r4)/z1+r5/(r4+r5)*1/z1; K2:=r4/z2*r3/z1*r1/z2-r4/z2-r4/z2*r3/(r4+r5)*1/z1;
K4:=r4/z1*r1/z2-r4/(r4+r5)*1/z1;
a[1,1]:=-k3/p[1];
a[1,2]:=k1/p[1];
a[2,1]:=-k4/p[2];
a[2,2]:=k2/p[2];
b0[1]:=1/p[1];b0[2]:=0;
bc[1]:=1/p[1];bc[2]:=0;
bs[1]:=1/p[1];bs[2]:=0;
end;
{******Процедура формирования вектора B(t)=B0+Bc*cos(wt)+Bs*sin(wt)**}
Procedure Def_B_t(t:real);
begin
b[1]:=b0[1]+bc[1]*cos(w*t)+bs[1]*sin(w*t);
b[2]:=b0[2]+bc[2]*cos(w*t)+bs[2]*sin(w*t);
end;
{****** Функция определения выходной переменной***************}
function U5(X:Vector):real;
begin
U5:=-r4/(r4+r5)*r5/z1*x[1]+r4/z2*r3/(r4+r5)*r5/z1*x[2];
end;
{********Процедура вычисления обратной матрицы второго порядка }
Procedure Obr_Matr(A:Matrix; var A_obr:Matrix);
var det:real;
begin
det:=a[1,1]*a[2,2]-a[1,2]*a[2,1];
A_obr[1,1]:=a[2,2]/det;
A_obr[1,2]:=-a[1,2]/det;
A_obr[2,1]:=-a[2,1]/det;
A_obr[2,2]:=a[1,1]/det;
end;
{********************Процедура формирования единичной матрицы E}
Procedure E_Matr(n:byte; var E:Matrix);
var i,j:byte;
begin
for i:=1 to n do
begin
for j:=1 to n do
e[i,j]:=0;
e[i,i]:=1;
end;
end;
{Процедура вычисления собственных чисел матрицы А второго порядка }
Procedure Det_L(A:Matrix; var L:Vector; var comp:boolean);
var p0,p1,D:real;
begin
p1:=-(a[1,1]+a[2,2]);
p0:=a[1,1]*a[2,2]-a[1,2]*a[2,1];
D:=p1*p1-4*p0;
if D>=0 then
begin
comp:=false;
l[1]:=(-p1+sqrt(D))/2;
l[2]:=(-p1-sqrt(D))/2;
end
else begin
Comp:=true;
l[1]:=-p1/2;
l[2]:=sqrt(-D)/2;
end
end;
{**определение векторов D0,Dc,Ds для аналитического метода***} procedure Def_An;
var Z1,Z2:Matrix;
Y1,Y2:Vector;
begin
Obr_Matr(A,Z1);
Mult_Matr_Vect(n,Z1,B0,D0);
Mult_Vect_Sc(n,D0,-1);
Mult_Matr_Matr(n,A,A,Z1);
E_Matr(n,Z2);
Mult_Matr_Sc(n,Z2,4*pi*pi/TT/TT);
Add_Matr(n,Z1,Z2,Z2);
Obr_Matr(Z2,Z1);
Mult_Matr_Vect(n,A,Bc,Y1);
Y2:=Bs;
Mult_Vect_Sc(n,Y2,w);
Add_Vect(n,Y1,Y2,Y1);
Mult_Matr_Vect(n,Z1,Y1,Dc);
Mult_Vect_Sc(n,Dc,-1);
Y1:=Bc;
Mult_Vect_Sc(n,Y1,w);
Mult_Matr_Vect(n,A,Bs,Y2);
Mult_Vect_Sc(n,Y2,-1);
Add_Vect(n,Y1,Y2,Y1);
Mult_Matr_Vect(n,Z1,Y1,Ds);
end;
{**определение аналитического решения D9t)=D0+Dc*cos(wt)+Ds*sin(wt)***} procedure Def_An_t(t:real);
varY:Vector;
begin
Y:=Dc;
Mult_Vect_Sc(n,Y,cos(w*t));
Add_Vect(n,D0,Y,D);
Y:=Ds;
Mult_Vect_Sc(n,Y,sin(w*t));
Add_Vect(n,D,Y,D);
end;
{******************** Численная схема трапеции }
Procedure Trapec(n:integer; A:Matrix; B:Vector; h:real; var X:Vector);
var Z1,Z2,Z3:Matrix;
Y1,Y2:Vector;
begin
E_Matr(n,Z1);
Mult_Matr_Sc(n,Z1,2);
Z2:=A;
Mult_Matr_Sc(n,Z2,h);
Add_Matr(n,Z1,Z2,Z3);
Mult_Matr_Vect(n,Z3,X,Y1);
Y2:=B;
Mult_Vect_Sc(n,Y2,2*h);
Add_Vect(n,Y1,Y2,Y1);
Mult_Matr_Sc(n,Z2,-1);
Add_Matr(n,Z1,Z2,Z3);
Obr_Matr(Z3,Z1);
Mult_Matr_Vect(n,Z1,Y1,X);
end;
{*******инициализация графического режима******** }
Procedure Init;
begin
grdr:=VGA;
grmd:=VGAHi; {инициализация графического режима} InitGraph(grdr,grmd,'d:bpbgi');
X0:=15;
Y01:=150;
Y02:=300;
Y03:=450;
line(X0,5,X0,GetMaxY-5);
line(X0-5,Y01,GetMaxX-5,Y01);
line(X0-5,Y02,GetMaxX-5,Y02);
line(X0-5,Y03,GetMaxX-5,Y03);
outtextxy(X0+5,5,'x1');
outtextxy(X0+5,Y01+10,'x2');
outtextxy(X0+5,Y02+10,'U4');
outtextxy(GetMaxX-10,Y01+5,'t');
outtextxy(GetMaxX-10,Y02+5,'t');
outtextxy(GetMaxX-10,Y03+5,'t');
end;
{*******Вычисление нормы матрицы************************** }
function Norm(n:byte; A:Matrix):real;
var
i,j:byte;
max,sum:real;
begin
max:=abs(a[1,1]);
for j:=1 to n do
begin
sum:=0;
for i:=1 to n do
sum:=sum+abs(a[i,j]);
if sum>max then max:=sum;
end;
Norm:=max;
end;
{****************Процедура вычисления экспоненциальной матрицы } Procedure M_Exp(n:byte; A:Matrix; t:real; var Exp_M:Matrix);
var
i,s:byte;
Z1,Z2,Z3:Matrix;
ss:real;
begin
ss:=Norm(n,A);
s:=round(ln(10*t*ss)/ln(2));
E_Matr(n,Z1);
Z2:=Z1;Z3:=Z2;
for i:=1 to s do
begin
Mult_Matr_Matr(n,A,Z2,Z3); Mult_Matr_Sc(n,Z3,t/exp(s*ln(2))/i); Add_Matr(n,Z1,Z3,Z1);
Z2:=Z3;
end;
for i:=1 to s do
begin
Mult_Matr_Matr(n,Z1,Z1,Z2);
Z1:=Z2;
end;
Exp_M:=Z1;
end;
{*Определение периодического решения непосредственным методом********} Procedure Def_nep(var X:Vector);
var Z1,Z2:Matrix;
Y:Vector;
begin
y[1]:=0;y[2]:=0;
for i:=1 to M do
begin
t:=i*h;
Def_B_t(t);
Trapec(n,A,B,h,X);
end;
Det_L(A,Lam,def);
M_Exp(n,A,TT,Z1);
Mult_Matr_Sc(n,Z1,-1);
E_Matr(n,Z2);
Add_Matr(n,Z1,Z2,Z2);
Obr_Matr(Z2,Z1);
Mult_Matr_Vect(n,Z1,Y,X);
end;
{***********Построение графика периодического решения ****************} Procedure Per_Solve(P:Vect);
begin
Def_A_B(P);
Def_An;
Def_nep(X);
Init;
kx:=(GetMaxX-X0-10)/TT;
ky1:=120/50;
ky2:=120/200;
ky3:=-100/2;
Def_An_t(0);
xx1:=X0;
y11:=Y01-round(ky1*x[1]);
y21:=Y02-round(ky2*x[2]);
y31:=Y01-round(ky1*d[1]);
y41:=Y02-round(ky2*d[2]);
y51:=Y03-round(ky3*U5(X));
y61:=Y03-round(ky3*U5(D));
for i:=1 to M do
begin
t:=i*h;
Def_An_t(t);
Def_B_t(t);
Trapec(n,A,B,h,X);
xx:=X0+round(kx*t);
y1:=Y01-round(ky1*x[1]);
y2:=Y02-round(ky2*x[2]);
y3:=Y01-round(ky1*d[1]);
y4:=Y02-round(ky2*d[2]);
y5:=Y03-round(ky3*U5(X));
y6:=Y03-round(ky3*U5(D));
setcolor(Red);
line(xx1,y11,xx,y1);
line(xx1,y21,xx,y2);
line(xx1,y51,xx,y5);
setcolor(Green);
line(xx1,y31,xx,y3);
line(xx1,y41,xx,y4);
line(xx1,y61,xx,y6); xx1:=xx;y11:=y1;y21:=y2;y31:=y3;y41:=y4;y51:=y5;y61:=y6;
end;
readln;
CloseGraph;
end;
{****************************Метод установления****************}
Procedure Ust(P:Vect);
begin
Def_A_B(P);
x[1]:=0;x[2]:=0;
j:=0;
repeat
j:=j+1;
X1:=X;
for i:=1 to M do
begin
t:=i*h;
Def_B_t(t);
trapec(n,A,B,h,X);
end;
def:=true;
for i:=1 to n do
if abs(x[i]-x1[i])-delt*abs(x[i]+x1[i])/2>=0 then def:=false; until def;
Init;
kx:=(GetMaxX-X0-10)/TT/j;
ky1:=120/50;
ky2:=120/200;
ky3:=-100/2;
x[1]:=0;x[2]:=0;
init;
xx1:=X0;y11:=Y01;y21:=Y02;y31:=Y03;
for k:=0 to j-1 do
for i:=1 to M do
begin
t:=i*h+k*TT;
Def_B_t(t);
trapec(n,A,B,h,X);
xx:=X0+round(kx*t);
y1:=Y01-round(ky1*x[1]);
y2:=Y02-round(ky2*x[2]);
y3:=Y03-round(ky3*U5(X));
setcolor(Red);
line(xx1,y11,xx,y1);
line(xx1,y21,xx,y2);
line(xx1,y31,xx,y3);
xx1:=xx;y11:=y1;y21:=y2;y31:=y3;
end;
readln;
CloseGraph;
end;
{*Определение коэффициента пульсаций по решению непосредственным методом} function Kp_nep(P:Vect):real;
var Usr,Umax,Umin:real;
begin
Def_A_B(P);
Def_nep(X);
Usr:=0;Umin:=U5(X);Umax:=Umin;
for i:=1 to M do
begin
t:=i*h;
Def_B_t(t);
trapec(n,A,B,h,X);
Usr:=Usr+U5(X);
if U5(X)>Umax then Umax:=U5(X);
if U5(X)<Umin then Umin:=U5(X); end;
Kp_nep:=(Umax-Umin)*M/Usr/2;
end;
{***************Метод золотого сечения }
function Gold(P:Vect;i:byte):real;
const g=0.618034;
var r,xl,xp:real;
X1,X2:Vect;
begin
xp:=pp[i];xl:=pl[i];X1:=P;X2:=P;
repeat r:=g*(xp-xl);x1[i]:=xl+r;x2[i]:=xp-r;
if kp_nep(X1)<kp_nep(X2) then xp:=x1[i] else xl:=x2[i]
until abs(xp-xl)-delt*abs(xp+xl)/2<0;
Gold:=(xp+xl)/2;
end;
{*************** Метод координатного спуска } Procedure Koord(var Pmin:Vect; var Kpmin:real);
var i:byte;
P,PL:Vect;
def:boolean;
begin
for i:=1 to s do
p[i]:=(pl[i]+pp[i])/2;
repeat
PL:=P;
for i:=1 to s do
begin
p[i]:=Gold(P,i);
end;
def:=true;
for i:=1 to s do
if abs(p[i]-pl[i])-delt*abs(p[i]+pl[i])/2>=0 then def:=false; until def;
for i:=1 to s do
pmin[i]:=(p[i]+pl[i])/2;
Kpmin:=Kp_nep(Pmin);
end;
{************************ Управляющая программа *********** }
Begin
ClrScr;
Koord(P,kpmax);{оптимизация методом координатного спуска} Def_A_B(P);{формирование матриц А,В математической модели} Det_L(A,Lam,def);{определение собственных чисел}
writeln('Оптимальная точка:'); writeln('p[1]=',p[1],'p[2]=',p[2],'kpmax=',kpmax); writeln('Собственные числа:'); {вывод собственных чисел на экран} if not def then
begin
writeln('l[1]=',lam[1]);writeln('l[2]=',lam[2]); writeln('Постоянные времени:'); writeln('tau1=',1/abs(lam[1]));writeln('tau2',1/abs(lam[2])); end
else
begin
writeln('l[1]=',lam[1],'+j',lam[2]);writeln('l[1]=',lam[1],'-j',lam[2]); writeln('Постоянная времени: tau=',1/abs(lam[1]));
writeln('Собственная частота: fc=',lam[2]/2/pi);
end;
readln;
Ust(P);{определение периодического решения методом установления} Per_Solve(P);{определение периодического решения непосредственным методом}
End.