Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Борщенко_КСФ_3-4 / Мой МС Курсач.doc
Скачиваний:
14
Добавлен:
11.02.2016
Размер:
1.05 Mб
Скачать

2.5 Заключение

В этой части курсовой работы было проведено численное моделирования динамических процессов в системе автоматического регулирования с помощью двух программных приложений -ExcelиDelphi.

Результаты, полученные при использовании этих двух пакетов, показали идентичные решения.

Литература

1. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузовю -13-е изд., исправленное.-М.: Наука, Гл.Ред. физ.-мат. лит., 1986. -544 с.

2. Вычислительная техника и программирование. Часть 3 «Основы алгоритмизации, про-граммирования и решения инженерных и экономических задач на ЭВМ». Учебное посо-бие / Под общей редакцией проф. Меркта Р.В. – Одесса: ОГМУ,2000. –97 с.

3. Электронные учебно-методические материалы кафедры «Техническая кибернетика».

4. Меркт, «Вычислительная техника и программирование. Часть 3», ОНМУ,

Одесса – 2004.

5. Г.В. Галисеев, «Программирование в среде Delphi», Москва – Санкт-Петербург – Киев, 2004.

Приложение 1

Текст модуля MyType

unit MyType;

interface

type

Vec = array[0..200] of Double;

VecSh = array[0..20] of Double;

Mat = array[0..20,0..21] of Double;

implementation

end.

Текст модуля MyProc

unit MyProc;

interface

uses

MyType,

SysUtils,

Classes,

Math;

procedure Gauss(N:Integer; A:Mat; var X:VecSh; var S:Double);

procedure Gram(N:Integer; var A:Mat; var X,Y:Vec; var M,K:Integer);

procedure Aprox(Kpol,Jm:Integer; T,Xp,Yp:Vec; var A,B:VecSh;

var Xa,Ya,YYa:Vec; var R2X,R2Y:Double);

implementation

procedure Gauss(N:Integer; A:Mat; var X:VecSh; var S:Double);

var

I,J,K,K1,N1 : Integer;

R : Double;

begin

// if A.RowCount+1 <> A.ColCount then

// raise Exception.Create('Матрица кооэффициентов некорректна');

N1:=N+1;

for K:=0 to N-1 do begin

K1:=K+1;

S:=A[K,K];

J:=K;

for I:=K1 to N-1 do begin

R:=A[I,K];

if Abs(R) > Abs(S) then begin

S:=R;

J:=I;

end;

end;

// if S=0.0 then ShowMessage('s=0');

// raise Exception.Create('Матрица кооэффициентов вырождена');

if J<> K then

for I:=K to N1-1 do begin

R:=A[K,I];

A[K,I]:=A[J,I];

A[J,I]:=R

end;

for J:=K1 to N1-1 do A[K,J]:=A[K,J]/S;

for I:=K1 to N-1 do begin

R:=A[I,K];

for J:=K1 to N1-1 do A[I,J]:=A[I,J]-A[K,J]*R;

end;

end;

// if S<>0.0 then

for I:=N-1 downto 0 do begin

S:=A[I,N1-1];

for J:=I+1 to N-1 do S:=S-A[I,J]*X[J];

X[I]:=S;

end;

end;

procedure Gram(N:Integer; var A:Mat; var X,Y:Vec; var M,K:Integer);

var

I1,Pp,I,J,L : Integer;

S : Double;

Begin

M:=K+1;

for I:=0 to M-1 do

begin

for J:=0 to M-1 do

begin

S:=0; Pp:=I+J;

for L:=1 to N do

S:=S+Power(X[L],Pp);

A[I,J]:=S;

end;

I1:=I;

S:=0;

for L:=1 to N do

S:=S+Y[L]*Power(X[L],I1);

A[I,M]:=S;

end;

End;

procedure Aprox(Kpol,Jm:Integer; T,Xp,Yp:Vec; var A,B:VecSh;

var Xa,Ya,YYa:Vec; var R2X,R2Y:Double);

var

M,K,J : Integer;

S,S1,S2,S3 : Double;

R : VecSh;

Ag : Mat;

Begin

Gram(Jm,Ag,T,Xp,M,Kpol);

Gauss(M,Ag,R,S);

B:=R;

Gram(Jm,Ag,T,Yp,M,Kpol);

Gauss(M,Ag,R,S);

A:=R;

for J:=1 to Jm do begin

Xa[J]:=0;

Ya[J]:=0;

YYa[J]:=0;

for K:=0 to Kpol do begin

Xa[J]:=Xa[J]+B[K]*Power(T[J],K);

Ya[J]:=Ya[J]+A[K]*Power(T[J],K);

end;

for K:=1 to Kpol do

YYa[J]:=YYa[J]+K*A[K]*Power(T[J],K-1);

end;

S1:=0;

S2:=0;

S3:=0;

For J:=1 to Jm do

begin

S1:=S1+Sqr(Xp[J]-Xa[J]);

S2:=S2+Sqr(Xp[J]);

S3:=S3+Xp[J];

end;

R2X:=1-S1/(S2-Sqr(S3)/Jm);

S1:=0;

S2:=0;

S3:=0;

For J:=1 to Jm do

begin

S1:=S1+Sqr(Yp[J]-Ya[J]);

S2:=S2+Sqr(Yp[J]);

S3:=S3+Yp[J];

end;

R2Y:=1-S1/(S2-Sqr(S3)/Jm);

End;

end.

Текст программы идентификации IdentODY1

program IdentODY1;

{$APPTYPE CONSOLE}

uses

Math {: CoClass},

sysutils {: CoClass},

classes {: CoClass},

Dialogs {: CoClass},

MyType {: CoClass},

MyProc {: CoClass},

Graphics {: CoClass},

Graphik {: CoClass};

var

Ne,Ine,Jm,Im,J,I,I1,Kpol,Nz : Integer;

C1,K1,R2X,R2Y,R2Xmin,R2Ymin,S : Double;

A,B,R : VecSh;

Te,Xe,Ye,T,Xp,Yp,Xa,Ya,YYa : Vec;

Aind : Mat;

F1,F2,F3 : TextFile;

begin

AssignFile(F1,'Input_1.txt');

AssignFile(F2,'Input_2.txt');

AssignFile(F3,'Output_1.txt');

ReSet(F1);

ReSet(F2);

ReWrite(F3);

Readln(F1,Ne,Jm,Kpol);

Writeln('Ne=',Ne:2,' Jm=',Jm:2,' Kpol=',Kpol:2);

Writeln(F3,'Ne=',Ne:2,' Jm=',Jm:2,' Kpol=',Kpol:2);

for I:=0 to 20 do

for J:=0 to 21 do Aind[I,J]:=0;

/////////////////////////////////////////////////

for Ine := 1 to Ne do begin

//////////////////////////////////////////////////

Readln(F2,Im);

Writeln(F3,'Ine=', Ine:3,' Im=',Im:3);

Writeln('Ine=', Ine:3,' Im=',Im:3);

Writeln(F3,' T ',' Xe ',' Ye ');

for I:=0 to Im-1 do begin

Readln(F2,Te[I],Xe[I],Ye[I]);

Writeln(F3,Te[I]:10:5,Xe[I]:10:5,Ye[I]:10:5);

end;

GrProp.Line1Color := clBlack;

GrProp.Line2Color := clRed;

GrProp.Point1Color := clBlack;

GrProp.Point2Color := clRed;

GrProp.GridDigitsY := 3;

GrProp.GridDigitsX := 3;

ShowGraphik(Te,Xe,Te,Ye,Te,Xe,Te,Ye,Im,Im,Im,Im);

Readln;

for Nz:=0 to Im-Jm-1 do begin

for J:=0 to Jm-1 do begin

I:=J+Nz;

T[J]:=Te[I]-Te[Nz];

Xp[J]:=Xe[I];

Yp[J]:=Ye[I];

end;

Aprox(Kpol,Jm,T,Xp,Yp,A,B,Xa,Ya,YYa,R2X,R2Y);

If ((Ine=1) and (Nz=0)) or (R2Xmin>R2X) then R2Xmin:=R2X;

If ((Ine=1) and (Nz=0)) or (R2Ymin>R2Y) then R2Ymin:=R2Y;

for J:=0 to Jm-1 do begin

Aind[0,0]:=Aind[0,0]+Sqr(YYa[J]);

Aind[0,1]:=Aind[0,1]-Xa[J]*YYa[J];

Aind[0,2]:=Aind[0,2]-Ya[J]*YYa[J];

Aind[1,1]:=Aind[1,1]+Sqr(Xa[J]);

Aind[1,2]:=Aind[1,2]+Xa[J]*Ya[J];

end;

Aind[1,0]:=Aind[0,1];

end;

end;

//////////////////////////////////////////////////

Gauss(2,Aind,R,S);

C1:=R[0];

K1:=R[1];

Writeln(F3,' C1=',C1:10:5,' K1=',K1:10:5);

Writeln(F3,'R2Xmin=',R2Xmin:5:3,' R2Ymin=',R2Ymin:5:3);

Writeln(' C1=',C1:10:5,' K1=',K1:10:5);

Writeln('R2Xmin=',R2Xmin:5:3,' R2Ymin=',R2Ymin:5:3);

Readln;

Close(F1);

Close(F2);

Close(F3);

end.

Соседние файлы в папке Борщенко_КСФ_3-4