|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Моделирование динамических режимов ректификационной установки
Кому не сложно, пожалуйста сделайте описание каждой строчки того что происходит в данном коде
Код:
program Project; {$APPTYPE CONSOLE} uses SysUtils, Windows; const Fr = 500; xf = 0.6; N = 50; Nf = 20; KPD = 0.45; R = 10; a = 1.35; h = 665; rsm = 76; rp = 539; b1 = 640; x0z = 0.23; xnp1z = 0.973; S = 0.0009; E = 0.0001; Tmax = 3; Hb = 8; dh = 0.0025; var x, y, x1, y1: array [0..N+1] of double; txt: text; D, V, W, L, F_1, xf1, Mcp, G, b2, C, Cz, Lmin, Lmax, dL, T: double; i: integer; procedure STATB06; var Dmin, Dmax, xNp1, yim1ZV: double; i: integer; begin x[0] := x0z; y[0] := x0z; Dmax := Fr; Dmin := Fr * (xf - x[0]) / (1 - x[0]); repeat D := (Dmin + Dmax) / 2; W := Fr - D; L := R * D; V := D + L; xNp1 := (Fr * xf - W * x0z) / D; x[1] := (V * y[0]+ W*x[0]) / (L + Fr); for i := 2 to N+1 do begin yim1ZV := (a * x[i-1]) / (1 + (a - 1) * x[i-1]); y[i-1] := y[i-2] + KPD * (yim1ZV - y[i-2]); if i < Nf then x[i] := x[i-1] - V *(y[i-2] - y[i-1]) / (L + Fr) { исчерпывающая часть } else if i = Nf then x[i] := ((L + Fr) * x[i-1] - V * (y[i-2] - y[i-1]) - Fr * xf) / L { питание } else x[i] := (V * (y[i-1] - y[i-2])) / L + x[i-1] { укрепляющая часть } end; if abs(x[N+1] - xNp1) <= E then break; if x[N+1] > xNp1 then Dmax := D else Dmin := D; until false; end; function f1(x1, x0, y0: double): double; { куб } begin Result := ((L + F_1) * x1 - V * y0 - W * x0) / Hb end; function f2(x1, x0, y1, y0: double): double; { исчерпывающая часть } begin Result := ((L + F_1) * (x1 - x0) + V * (y0 - y1)) / Hb end; function f3(x1, x0, y1, y0: double): double; { укрепляющая часть } begin Result := (L * (x1 - x0) + V * (y0 - y1)) / Hb end; function f4(x1, y0: double): double; { дефлегматор } begin Result := (V * y0 - (L + D) * x1) / Hb end; function f5(x1, x0, y1, y0: double): double; { тарелка питания } begin Result := (L * x1 + Fr * xf - (L + Fr) * x0 + V * (y0 - y1)) / Hb end; procedure EULER; var i, j: integer; begin for i := 1 to 50 do begin for j := 0 to N+1 do begin { решение системы дифференциальных уравнений } if j = 0 then x1[j] := x1[j] + dh * f1(x1[1], x1[0], y1[0]) else if j < Nf then x1[j] := x1[j] + dh * f2(x1[j+1], x1[j], y1[j], y1[j-1]) else if ((j > Nf) and (j < N+1)) then x1[j] := x1[j] + dh * f3(x1[j+1], x1[j], y1[j], y1[j-1]) else if j = (N+1) then x1[j] := x1[j] + dh * f4(x1[j], y1[j-1]) else x1[j] := x1[j] + dh * f5(x1[j+1], x1[j], y1[j], y1[j-1]) end; y1[0] := x1[0]; for j := 1 to N+1 do y1[j] := y1[j-1] + KPD * (a * x1[j] / (1 + (a - 1) * x1[j]) - y1[j-1]); end; end; begin SetConsoleCP(1251); SetConsoleOutPutCP(1251); assign(txt, 'results.txt'); rewrite(txt); STATB06; Mcp := (xf * 72 + (1 - xf) * 86); G := (Mcp * V * rsm) / rp; b2 := G * h * S; Cz := (b1 * Fr + b2) * (x[N+1] - x[0]) / (Fr * (xf - x[0])); writeln(txt, 'Статика:'); writeln(txt, 'F = ', Fr, ' D = ', D:6:3, ' W = ', W:6:3, ' L = ', L:8:3, ' Cz = ', Cz:8:3); for i := 0 to N do writeln(txt, 'x[',i,'] = ', x[i]:6:3, ' y[', i, '] = ', y[i]:6:3); writeln(txt, 'x[', N+1,'] = ', x[N+1]:6:3); Lmin := 0.5 * L; Lmax := (0.5 + 1) * L; dL := (Lmax - Lmin) * 0.01; F_1 := Fr + 0.05 * Fr; xf1 := xf + xf * 0.05; Mcp := (xf1 * 72 + (1 - xf1) * 86); T := 0; writeln(txt, 'Динамика:'); repeat L := Lmin; repeat D := L / R; V := L + D; W := F_1 - D; for i := 0 to N+1 do begin x1[i] := x[i]; y1[i] := y[i]; end; EULER; G := (Mcp * V * rsm) / rp; b2 := G * h * S; C := (b1 * F_1 + b2) * (x1[N+1] - x1[0]) / (F_1 * (xf1 - x1[0])); if (x1[0] <= x0z) and (x1[N+1] >= xNp1z) and (x1[N+1] <= 1) and (C <= Cz) then break; L := L + dL; until L > Lmax; for i := 0 to N+1 do begin x[i] := x1[i]; y[i] := y1[i]; end; writeln(txt, 'T = ', T:0:2, ' x[0] = ', x[0]:0:3, ' x[', N+1,'] = ', x[N+1]:0:3, ' C = ', C:0:3, ' L = ', L:0:3); T := T + 0.25; until T > Tmax; writeln(txt, 'В конце:'); writeln(txt, 'F = ', Fr, ' D = ', D:6:3, ' W = ', W:6:3, ' L = ', L:8:3, ' C = ', C:8:3); for i := 0 to N do writeln(txt, 'x[', i, '] = ', x[i]:6:3, ' y[', i, '] = ', y[i]:6:3); writeln(txt, 'x[', N+1, '] = ', x[N+1]:6:3); Close(txt); writeln('Complete!'); readln; end. lmikle: пользуемся тегами Последний раз редактировалось lmikle, 12.01.2017 в 01:35. |
#2
|
|||
|
|||
Ну и как ты себе это представляешь?
Тут и инициализация данных (для описания которой неплохо было бы представлять работу самого моделируемого процесса), и решение системы дифуров, и вывод результатов. Ну а тупо описывать, типа "на строчке 128 переменной T присваивается значение 0", особого смысла нет, это и так понятно по коду. А вот нафига присваивается... можнет какая температура или это время процесса... тут физику процесса надо понимать. |
#3
|
|||
|
|||
Цитата:
|
#4
|
|||
|
|||
Ну так прочти любую книжку по основам Паскаля. Что бы хотя бы основной синтакс понимать. Если крупными мазками:
1. const (строка 5). Объявление секции констант, т.е. фиксированных значений. Идет присваивание с помощью знака '='. Формат: <имя_константы> = <значение_константы>; константы, обычно, в процессе выполнения менять нельзя. 2. var (строка 26). Объявление секции переменных. В данном случае - глобальный, т.е. видимых из любого места программы. Указывается в виде списка имен, далее следует двоеточие, далее - тип переменной (Integer - целые числа, Double - дробные числа, text - специальный тип для вывода в файл). Формат: <имя_переменной>[, <имя_переменной>, ...] : <тип_данных>; 2.1. Описание массива (строка 27). Массив - это тоже переменная, просто она может хранить не одно значение, а много. Доступ осуществляется по номеру элемента в массиве - индексу. формат: <имя_массива> : array [<мин_номер>..<макс_номер>] of <тип_данных>; 3. function/procedure - описание подпрограммы. Фактически - создание своего оператора. Отличие - функция возвращает значение, процедура - нет. Т.е. описав функцию в одном месте, потом ее можно вызывать в других местах программы для выполнения указанноых действий. В функции по умолчанию создается специальная переменная Result - значение этой переменной будет передано как возвращаемое из функции. Все, надоело. Не хочу тут писать учебник по Паскалю. |