14
15 Procedure cX(t: double; x: DArray);var
16 begin
17 t >= 0 if then x[1] := xm[1]
18 else x[1] := ;0
19 ;end
20
21 Procedure cF(Y: DArray; t: double; Z, F: DArray);var 22 var
28 F[2] := (lK[2]*Y[1] - Y[2])/lT[2]; 29 Z[2] := lK[3]*Y[2];
30 if Z[2] > ly0[3] then Z[2] := ly0[3]
32 ;end 33
На основе метода Эйлера составим подпрограмму расчета значений переменных модели на текущем шаге, в которой будет вызываться подпрограмма cF для расчета значений переменных, для которых записаны алгебраические уравнения (z), и правых частей дифференциальных уравнений ( f = dydt). По табл. 1.1 расчетное соотношение для данного метода:
Yi = Yi−1 + ∆t ⋅ fi−1 .
Параметры данной подпрограммы: Yp – массив значений переменных на предыдущем шаге; Y, Z – массивы рассчитываемых значений переменных на текущем шаге; t, dt – значение текущего времени и шага расчета. Внутренние переменные подпрограммы: F – массив значений правых частей дифференциальных уравнений (dydt ); j – счетчик (номер дифференциального уравнения в системе, или номер переменной y j ).
34 Procedure cY(Yp: DArray; t, dt: double;
35 Y, Z: DArray);var
36 var 3738 F: DArray; j: integer; = f (t − ∆t, X(t − ∆t),Y )
39 begin
40 cF( , Yp t-dt, Z, );F
41 j := 1 2 for to do
42 Y[j] := Yp[j] + *F[j];dt
43 ;end
44
Составим подпрограмму для ввода исходных данных для расчета: параметров звеньев и входных воздействий, интервала и шага расчета. Для удобства работы при отладке программы ввод будем производить из текстового файла. Параметров у подпрограммы нету. Ввод производится непосредственно в глобальные переменные программы: filename – имя файла вывода (вначале, в подпрограмме она используется для имени файла ввода); tk, dt – интервал и шаг расчета. Глобальная переменная f – текстовый файл.
45 Procedure pIn;
46 begin
47 write('Введите имя файла ввода ');
48 readln(filename);
49 assign(f, filename);
50 reset(f);
51 write('Введите имя файла вывода '); 52 readln(f, filename);
53 write('Введите величину скачка X1 ');
54 readln(f, xm[1]);
55 write('Введите постоянную времени интегратора T1
');
56 readln(f, lT[1]);
57 write('Введите коэффициент передачи ' +
58 'апериодического звена K2 '); 59 readln(f, lK[2]);
60 write('Введите постоянную времени ' +
61 'апериодического звена T2 ');
62 readln(f, lT[2]);
63 write('Введите коэффициент передачи звена с ' +
64 'ограничением K3 ');
65 readln(f, lK[3]); 66 write('Введите уровень ограничения y03 ');
67 readln(f, ly0[3]);
68 write('Введите интервал расчета '); 69 readln(f, tk); 70 write('Введите шаг расчета ');
71 readln(f, dt);
72 close(f);
73 end;
74
Теперь составим головной модуль программы. В строке 76 вызывается подпрограмма ввода исходных данных. Затем, в строках 77, 78 открывается для записи файл вывода f. В строках 79…81 производится обнуление (задание нулевых начальных условий) переменных: Y – значений переменных y на текущем шаге (Yi ); Yp – значений переменных y на предыдущем шаге (Yi−1); Z – значений переменных z. В строке 82 задается нулевое время, и в строке 83 выводятся значения для момента времени t = 0. В строке 84 рассчитывается количество шагов расчета N. В строках 85, 86, 92 организуется цикл по шагам расчета i от 1 до N. В цикле:
1. В строке 87 определяется текущее время t, соответствующее текущему шагу расчета.
2. В строке 88 осуществляется расчет значений переменных модели на текущем шаге расчета. Для этого вызывается подпрограмма cY.
3. В строках 89, 90 рассчитанные значения выводятся в файл.
4. В строке 91 осуществляется перенос значений с текущего шага на предыдущий.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.