- •Лабораторная работа №1
- •1.Схематическое изображение гидравлической модели с двумя закрытыми ёмкостями
- •2. Построение системы уравнений математического описания гидравлической системы
- •3. Информационная матица системы уравнений
- •4. Блок-схема гидравлической системы
- •5. Компьютерная программа на языке vba для расчета стационарного режима гидравлической системы
- •Cells.Select
- •6. Расчётное исполнение модели
- •7. Выводы
4. Блок-схема гидравлической системы
P9 V1 V3
1 3
С Т А Р Т
Р1-Р6, К1-К7, НG Н,
g
8 7 F P7 V7 P10
11 10 2 5 9 H1 V2 V5
4 V4 V6 H1
(P7 P9 V1 V2
V4 V7
P10 V3 V5
V6)
6
H1
V1,V2,V3,V4,V5,V6,V7,P7,P9,P10
H1 P8
С Топ
12 13
H2
Рис.2 Блок-схема расчёта стационарного режима гидравлической системы.
При составлении данной блок-схемы использовалось два алгоритмических блока – стандартных алгоритма:
- метод половинного деления: алгоритмический блок (9) для определения Н1;
- вычисление корней квадратного уравнения: алгоритмические блоки (12), (13) для определения Н2 и Р8.
Топология гидравлической системы отображается вычислительными блоками слева от алгоритмического блока (9). Результатом расчета по вычислительным блокам (11), (10), (1), (2), (4), (8), (7), (3), (5), (6) является значение величины функции:
f = V3 + V7 – V5 – V6 (9)
которая используется стандартным модулем метода половинного деления в алгоритмическом блоке (9) для определения уровня жидкости Н1 в первой емкости.
Первым шагом при составлении информационной матрицы – задаёмся начальным приближением переменной Н1. При этом определяем искомую величину Р7( уравнение для определения Р7 находится под номером (11) в построение системы уравнений математического описания гидравлической системы). Вторым шагом определяем Р9, при уже известных Р7 и Н1( уравнение 10). На 3-5 этапах решения определяем V1,V2,V4( уравнения 1,2,4). На 6-ом этапе находим V7, при уже известных V1,V2,V4 (уравнение 8). Шагом 7-10 является нахождение Р10,V3, V5,V6 ( уравнения 7,3,4,6). Шаг 12 и 13 помогает определить Р8 и Н2 посредством решения квадратного уравнения.
5. Компьютерная программа на языке vba для расчета стационарного режима гидравлической системы
Option Explicit
Option Base 1
Const np% = 10, nk% = 7, nv% = 13
Dim vm!(nk), v!(nk), ak!(nk), p!(np), hg!(2), h!(2)
Dim a!, b!, c!, e!, ro!, pn!, g!, x!
Dim i%, kl%, ipr%
Dim bu As Boolean
Public Sub stat()
ipr = 1
With Worksheets(" Лист1")
' Высота ёмкостей (1-2) m
hg(1) = .Cells(4, 5): hg(2) = .Cells(5, 5)
' Плотность (кг/m3)
ro = .Cells(6, 5)
' Начальное давление (Мпа)
pn = .Cells(6, 9)
' Давление (1-6) /Мпа/
For i = 1 To 6: p(i) = .Cells(8, i + 4): Next i
' Коэф. пропускной способности (1-7)
For i = 1 To 7: ak(i) = .Cells(9, i + 4): Next i
' Относительная локальная погрешность ( % )
e = .Cells(11, 6)
' вывод промежуточных результатов, 1-частичный, 2-полный
kl= .Cells(10, 6)
End With
Worksheets("Лист2").Activate
Cells.Select
Selection.Clear
Range("a1").Select
If kl = 2 Then
Cells(ipr, 5) = "Промежуточный вывод": ipr = ipr + 1
Cells(ipr, 5) = "h": Cells(ipr, 6) = "p(7-9)": Cells(ipr, 7) = "vm": ipr = ipr + 1
End If
g = 9.815: e = e / 100: a = 0: b = hg(1) * (1 - e)
Call MPD(a, b, e, bu, x)
With Worksheets("Лист2")
If bu Then
a = ro * g * 0.000001: b = p(10) + ro * g * hg(2) * 0.000001
c = (p(10) - pn) * hg(2)
h(2) = (b - Sqr(b * b - 4 * a * c)) / 2 / a
p(8) = pn * hg(2) / (hg(2) - h(2))
For i = 1 To 7: vm(i) = v(i) * ro: Next i
.Cells(1, 1) = "РЕЗУЛЬТАТ"
.Cells(2, 1) = "h": .Cells(2, 2) = "p(7-10)": .Cells(2, 3) = "vm"
.Cells(3, 1) = h(1): .Cells(3, 2) = p(7): .Cells(3, 3) = vm(1)
.Cells(4, 1) = h(2): .Cells(4, 2) = p(8): .Cells(4, 3) = vm(2)
.Cells(5, 2) = p(9): .Cells(5, 3) = vm(3)
.Cells(6, 2) = p(10): .Cells(6, 3) = vm(4)
.Cells(7, 3) = vm(5)
.Cells(8, 3) = vm(6)
.Cells(9, 3) = vm(7)
Else
kl = 2
.Cells(1, 1) = "РЕШЕНИЯ НЕТ"
.Cells(2, 1) = "a": .Cells(2, 2) = "f(a)": .Cells(2, 3) = "b": .Cells(2, 4) = "f(b)"
.Cells(3, 1) = a
.Cells(ipr, 5) = "Промежуточный вывод a": ipr = ipr + 1
.Cells(ipr, 5) = "h": .Cells(ipr, 6) = "p(7-9)": .Cells(ipr, 7) = "vm": ipr = ipr + 1
.Cells(3, 2) = FUNC(a)
.Cells(3, 3) = b
.Cells(1, 5) = " Промежуточный вывод b": ipr = ipr + 1
.Cells(2, 5) = "h": .Cells(2, 6) = "p(7-9)": .Cells(2, 7) = "vm": ipr = ipr + 1
Cells(3, 4) = FUNC(b)
End If
End With
End Sub
Function FUNC(x!) As Single
Dim vm!(7), fx!
h(1) = x
p(7) = pn * hg(1) / (hg(1) - h(1))
p(9) = p(7) + ro * g * h(1) * 0.000001
v(1) = ak(1) * Sgn(p(1) - p(9)) * Sqr(Abs(p(1) - p(9)))
v(2) = ak(2) * Sgn(p(2) - p(9)) * Sqr(Abs(p(2) - p(9)))
v(4) = ak(4) * Sgn(p(9) - p(4)) * Sqr(Abs(p(9) - p(4)))
v(7) = (v(1) + v(2) - v(4)) * ro
p(10) = p(9) - Sgn(v(7)) * (v(7) / ak(7)) ^ 2
v(3) = ak(3) * Sgn(p(3) - p(10)) * Sqr(Abs(p(3) - p(10)))
v(5) = ak(5) * Sgn(p(10) - p(5)) * Sqr(Abs(p(10) - p(5)))
v(6) = ak(6) * Sgn(p(10) - p(6)) * Sqr(Abs(p(10) - p(6)))
fx = (v(3) + v(7) - v(5) - v(6)) * ro
For i = 1 To 7: vm(i) = v(i) * ro: Next i
If kl = 0 Then GoTo 400
If kl = 1 Then GoTo 300
Cells(ipr, 5) = h(1): Cells(ipr, 6) = p(7): Cells(ipr, 7) = vm(1): ipr = ipr + 1
Cells(ipr, 6) = p(8): Cells(ipr, 7) = vm(2): ipr = ipr + 1
Cells(ipr, 6) = p(9): Cells(ipr, 7) = vm(3): ipr = ipr + 1
Cells(ipr, 7) = vm(4): ipr = ipr + 1
Cells(ipr, 7) = vm(5): ipr = ipr + 1
Cells(ipr, 7) = vm(6): ipr = ipr + 1
Cells(ipr, 7) = vm(7): ipr = ipr + 1
300: Cells(ipr, 5) = "x = ": Cells(ipr, 6) = x: Cells(ipr, 7) = " fx = ": Cells(ipr, 8) = fx:
ipr = ipr + 1
400: FUNC = fx
End Function
Sub MPD(a!, b!, eps!, bu As Boolean, xcon!)
Dim fa!, fb!, x!, fx!
fa = FUNC(a): fb = FUNC(b)
If fa * fb > 0 Then: bu = False: GoTo 100
Do
x = (a + b) / 2: fx = FUNC(x)
If fx * fa < 0 Then b = x Else a = x
Loop While Abs(a - b) > eps
xcon = Abs(a + b) / 2: bu = True
100:
End Sub
Sub auto_open()
Worksheets("Лист1").Activate
End Sub
Пояснения команд V. Basic:
Option Base 1 – задание нужного минимального значения индекса в начале программы. Константа определяет минимальное значение индекса, то есть 1;
Const – присвоение какой-либо величине постоянное значение( в данной программе фиксируемое количество р, v и к );
Dim – используется для объявления переменной, область действия которой ограничевается процедурой, которой она объявлена или модулем ( ! – действительное короткое, % - целое короткое );
Public Sub stat() – представляет собой самостоятельную програмную еденицу с уникальным именем, благодаря которой она может быть вызвана и выполнена
.Cells(7, 3) = vm(5) – оператор ввода в ячейку определённого значения ;
End Sub - окончание выполнения программы;
For i = 1 To 7: vm(i) = v(i) * ro: Next i – данной командой обеспечивается организация повторений, если их количество известно заранее. Если 17, то выполняется серия команд :
Cells(1, 1) = "РЕЗУЛЬТАТ"
.Cells(2, 1) = "h": .Cells(2, 2) = "p(7-10)": .Cells(2, 3) = "vm"
.Cells(3, 1) = h(1): .Cells(3, 2) = p(7): .Cells(3, 3) = vm(1)
.Cells(4, 1) = h(2): .Cells(4, 2) = p(8): .Cells(4, 3) = vm(2)
.Cells(5, 2) = p(9): .Cells(5, 3) = vm(3)
.Cells(6, 2) = p(10): .Cells(6, 3) = vm(4)
.Cells(7, 3) = vm(5)
.Cells(8, 3) = vm(6)
.Cells(9, 3) = vm(7)
если значение «i» станет больше значения выражения 7, то выполняется серия команд:
kl = 2
.Cells(1, 1) = "РЕШЕНИЯ НЕТ"
.Cells(2, 1) = "a": .Cells(2, 2) = "f(a)": .Cells(2, 3) = "b": .Cells(2, 4) = "f(b)"
.Cells(3, 1) = a
.Cells(ipr, 5) = "Промежуточный вывод a": ipr = ipr + 1
.Cells(ipr, 5) = "h": .Cells(ipr, 6) = "p(7-9)": .Cells(ipr, 7) = "vm": ipr = ipr + 1
.Cells(3, 2) = FUNC(a)
.Cells(3, 3) = b
.Cells(1, 5) = " Промежуточный вывод b": ipr = ipr + 1
.Cells(2, 5) = "h": .Cells(2, 6) = "p(7-9)": .Cells(2, 7) = "vm": ipr = ipr + 1
Cells(3, 4) = FUNC(b)
Call MPD(a, b, e, bu, x) – значения фактических параметров (a, b, e, bu, x) присваиваются соответствующим формальным параметрам ;
If kl = 2 Then – оператор ветвления по условиям ( если kl равно 2, то выполняется группа операторов :Cells(ipr, 5) = "Промежуточный вывод": ipr = ipr + 1
Cells(ipr, 5) = "h": Cells(ipr, 6) = "p(7-9)": Cells(ipr, 7) = "vm": ipr = ipr + 1);
Do - оператор цикла
x = (a + b) / 2: fx = FUNC(x)
If fx * fa < 0 Then b = x Else a = x
Loop While Abs(a - b) > eps
xcon = Abs(a + b) / 2: bu = True
если условие Abs(a - b) > eps истина, то выполняется группа операторов:
x = (a + b) / 2: fx = FUNC(x)
If fx * fa < 0 Then b = x Else a = x
если условие не выполнимо, то:
xcon = Abs(a + b) / 2: bu = True