Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения

Проектирование электрической цепи

Работа из раздела: «Программирование, компьютеры и кибернетика»

/

Содержание

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.

ref.by 2006—2025
contextus@mail.ru