Математическое моделирование. Структура программы при моделировании по системе дифференциальных уравнений, страница 8

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 = Yi1 + ∆t fi1 .

Параметры данной подпрограммы: 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 на предыдущем шаге (Yi1); 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 осуществляется перенос значений с текущего шага на предыдущий.