| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- # -*- coding: utf-8 -*-
- """
- Лаба 6. Расчёт параметров буровзрывных работ (разработка на полное сечение).
- Расчёт по формулам (6.1)-(6.17) методички.
- Замечание: числовой пример методички содержит арифметические погрешности
- (например, w0 = 0,63 м вместо 0,93 м по формуле), поэтому проверка ниже
- сходится с примером только по схеме расчёта, но не по всем округлениям.
- Длины в м, массы в кг.
- """
- from math import sqrt, ceil, floor
- # ---------------------------------------------------------------- справочные данные
- # Табл. 6.3 + 6.4 + 6.5 + 6.9: патронированные ВВ по диапазону крепости.
- # ВВ: (название, e, rho_вв диапазон кг/м3, d патрона м, длина патрона м, масса патрона кг)
- VV_BY_F = (
- ((10, 20), ("Аммонит №1 скальный", 0.81, (1450, 1580), 0.036, 0.175, 0.250)),
- ((7, 10), ("Аммонал", 0.91, (950, 1150), 0.032, 0.250, 0.250)),
- ((4, 7), ("Аммонит №6ЖВ", 1.00, (1000, 1200), 0.032, 0.250, 0.200)),
- ((2, 4), ("Динафталит", 1.08, (1000, 1150), 0.032, 0.250, 0.200)),
- ((1, 2), ("Аммонит ПЖВ-20", 1.20, (1050, 1200), 0.036, 0.175, 0.200)),
- )
- # Табл. 6.6: коэффициент влияния плотности заряжания
- PSI_PATRON = 1.10 # обычные патроны
- PSI_ROSSYP = 1.00 # россыпные ВВ
- # Табл. 6.7: (f_min, f_max, omega_min, omega_max) — снизу вверх по крепости
- OMEGA_ROWS = (
- (2, 4, 0.6, 0.8),
- (4, 6, 0.8, 1.0),
- (6, 8, 1.0, 1.4),
- (8, 10, 1.4, 1.6),
- (10, 14, 1.6, 1.8),
- (14, 18, 1.8, 1.9),
- (18, 20, 1.9, 2.0),
- )
- # Табл. 6.8: коэффициент зажима по площади сечения
- def k_z(S):
- if S < 20:
- return 0.7
- if S <= 50:
- return 0.8
- return 0.9
- # Табл. 6.10: расчётная плотность породы по крепости (снизу вверх)
- RHO_ROWS = (
- (2, 3, 2100),
- (4, 6, 2500),
- (7, 9, 2750),
- (10, 14, 2900),
- (15, 10**9, 3000),
- )
- # Табл. 6.11: расстояния отбойных/подошвенных шпуров в долях л.н.с. w0
- A_OTB = (0.90, 0.95) # между шпурами в ряду (и рядами — принимаем одинаковыми)
- A_POD = (0.70, 0.90)
- # Табл. 6.12: расстояние между контурными шпурами, м; строки по f, колонки по трещиноватости
- A_K_ROWS = (
- (2, 3, 0.6, 0.7, 0.6),
- (4, 6, 0.5, 0.6, 0.7),
- (7, 9, 0.4, 0.5, 0.6),
- (10, 12, 0.3, 0.4, 0.5),
- )
- # Табл. 6.13: коэффициент сближения контурных зарядов
- M_ROWS = ((2, 3, 1.0), (4, 6, 0.9), (7, 9, 0.8), (10, 14, 0.7), (15, 20, 0.6))
- # Табл. 6.14: коэффициент заполнения шпура (снизу вверх)
- KZAP_ROWS = (
- (2, 3, 0.50, 0.55),
- (4, 6, 0.60, 0.65),
- (7, 9, 0.65, 0.70),
- (10, 14, 0.70, 0.75),
- (15, 20, 0.75, 0.80),
- )
- # Табл. 6.15: коэффициент концентрации контурных зарядов, кг/м
- KK_ROWS = ((2, 3, 0.25), (4, 6, 0.30), (7, 9, 0.35), (10, 14, 0.40), (15, 20, 0.45))
- # Табл. 6.1: вертикальный клиновой вруб (f_min, f_max, N_вр диапазон) — снизу вверх
- VRUB_ROWS = (
- (2, 6, 4, 6),
- (6, 8, 4, 6),
- (8, 10, 6, 8),
- (10, 15, 6, 8),
- (15, 20, 6, 8),
- )
- def rup(x, n=2):
- """Математическое округление (половина — вверх), в отличие от round()."""
- p = 10 ** n
- return floor(x * p + 0.5) / p
- def pick(rows, f):
- """Первая строка (снизу вверх), в диапазон f которой попадает f."""
- for row in rows:
- if row[0] <= f <= row[1]:
- return row
- return rows[-1]
- def pick_vv(f):
- for (fmin, fmax), vv in VV_BY_F:
- if fmin <= f <= fmax:
- return vv
- return VV_BY_F[0][1]
- # Варианты исходных данных: (f, S, В, Р, l_k, l_зах)
- VARIANTS = {
- 1: (5, 16.56, 4.60, 14.51, 2.7, 2.5),
- 2: (9, 19.20, 5.05, 15.56, 3.5, 3.0),
- 3: (10, 21.90, 5.81, 17.19, 4.0, 3.5),
- 4: (13, 6.40, 2.17, 7.05, 4.1, 4.0),
- 5: (6, 7.92, 2.77, 1.20, 3.0, 2.5),
- 6: (8, 14.17, 4.53, 12.55, 3.5, 3.0),
- 7: (4, 24.46, 5.81, 17.53, 2.7, 2.5),
- 8: (7, 5.60, 2.00, 8.26, 0.0, 3.0),
- 9: (8, 14.09, 4.20, 13.56, 3.5, 3.0),
- 10: (11, 20.40, 5.29, 15.60, 4.2, 4.0),
- 11: (5, 104.94, 10.60, 33.80, 3.5, 3.0),
- 12: (7, 106.44, 11.36, 34.00, 3.8, 3.5),
- 13: (3, 24.46, 5.81, 17.53, 2.5, 2.0),
- 14: (8, 19.20, 5.05, 15.56, 3.7, 3.5),
- 15: (5, 23.40, 5.10, 19.40, 3.5, 3.0),
- 16: (12, 21.18, 5.87, 17.20, 4.2, 4.0),
- 17: (4, 22.26, 5.30, 16.44, 2.7, 2.5),
- 18: (7, 14.40, 3.70, 11.68, 3.5, 3.0),
- 19: (5, 44.54, 6.30, 40.20, 3.5, 3.0),
- 20: (10, 16.56, 4.60, 14.60, 4.0, 3.5),
- }
- # ---------------------------------------------------------------- расчёт
- def compute(f, S, B, P, l_k, l_zah, crack_col=1, n_vr=None, S_vr=None,
- psi=PSI_PATRON, vv=None, rho_vv=None, omega=None, a_o=None, a_p=None,
- a_k=None, k_zap=None, round_patrons=True):
- """Формулы (6.1)-(6.17). Неизвестные коэффициенты подбираются из таблиц:
- диапазоны берутся со средним значением, k_зап и N_вр — с верхним.
- crack_col: 0 монолитные, 1 слаботрещиноватые, 2 сильнотрещиноватые."""
- out = {}
- # --- выбор ВВ и коэффициентов
- if vv is None:
- vv = pick_vv(f)
- name, e, rho_range, d, l_pat, m_pat = vv
- if rho_vv is None:
- rho_vv = sum(rho_range) / 2
- if omega is None:
- _, _, w_min, w_max = pick(OMEGA_ROWS, f)
- omega = (w_min + w_max) / 2
- rho = pick(RHO_ROWS, f)[2]
- m = pick(M_ROWS, f)[2]
- k_k = pick(KK_ROWS, f)[2]
- if k_zap is None:
- k_zap = pick(KZAP_ROWS, f)[3] # верх диапазона
- k_y = 1.0 # патронированные ВВ
- if a_k is None:
- a_k = pick(A_K_ROWS, f)[2 + crack_col]
- if n_vr is None:
- n_vr = pick(VRUB_ROWS, f)[3] # верх диапазона числа шпуров
- if S_vr is None:
- S_vr = 0.19 * n_vr # по схеме вруба (8 шпуров ~ 1,5 м2)
- # --- 1) средний удельный расход ВВ, формула (6.1)
- q_c = rup((0.3 * sqrt(f) + 2 / sqrt(S)) * e * psi * omega)
- # --- 2) л.н.с. отбойных шпуров, формула (6.2)
- w0 = rup(52 * k_z(S) * d * sqrt(rho_vv / (rho * e * omega)))
- # --- 3) расстояния между шпурами
- if a_o is None:
- a_o = rup(A_OTB[0] * w0) # ~0,9 w0
- if a_p is None:
- a_p = rup(0.8 * w0) # ~0,8 w0 из диапазона 0,7...0,9
- # --- 4) количество шпуров
- N_k = floor(P / a_k + 1 + 0.5) # округление до ближайшего
- W_k = rup(a_k / m)
- S_k = rup((N_k - 1) * a_k * W_k)
- N_p = floor(B / a_p + 1 + 0.5)
- S_p = rup(w0 * B)
- S_o = rup(S - (S_k + S_p + S_vr))
- N_o = ceil(1.27 * q_c * S_o / (d**2 * k_zap * rho_vv * k_y)) # вверх
- N = N_k + N_p + N_o + n_vr
- # --- 5) к.и.ш. и глубина шпуров
- eta = l_zah / l_k if l_k else None
- l_vr = 1.1 * l_k
- # --- 6) расход ВВ на цикл, формулы (6.10)-(6.17)
- Q = rup(q_c * S * l_zah)
- q_k = l_k * k_k
- if round_patrons:
- q_k = floor(q_k / m_pat + 0.5) * m_pat # целое число патронов
- Q_k = q_k * N_k
- q_vr = 1.2 * (Q - Q_k) / (N - N_k)
- if round_patrons:
- q_vr = floor(q_vr / m_pat + 0.5) * m_pat
- Q_vr = q_vr * n_vr
- q_op = (Q - (Q_k + Q_vr)) / (N - (N_k + n_vr))
- if round_patrons:
- q_op = floor(q_op / m_pat + 0.5) * m_pat
- Q_op = q_op * (N_o + N_p)
- Q_vv = Q_k + Q_op + Q_vr
- out["ВВ"] = f"{name} (e={e}, ρвв={rho_vv:.0f})"
- out.update({
- "коэф.": f"ψ={psi}, ω={omega:g}, ρ={rho}, m={m:g}, kк={k_k:g}, kзап={k_zap:g}",
- "1) qc": round(q_c, 3), "2) w0": round(w0, 3),
- "3) ао": a_o, "3) ап": a_p, "3) ак": a_k,
- "4) Nк": N_k, "4) Wк": round(W_k, 3), "4) Sк": round(S_k, 2),
- "4) Nп": N_p, "4) Sп": round(S_p, 2), "4) Nвр": n_vr, "4) Sвр": round(S_vr, 2),
- "4) Sо": round(S_o, 2), "4) Nо": N_o, "4) N": N,
- "5) η": "—" if eta is None else round(eta, 3), "5) lвр": round(l_vr, 2),
- "6) Q": round(Q, 2), "6) qк": round(q_k, 3), "6) Qк": round(Q_k, 2),
- "6) qвр": round(q_vr, 3), "6) Qвр": round(Q_vr, 2),
- "6) qоп": round(q_op, 3), "6) Qоп": round(Q_op, 2), "6) Qвв": round(Q_vv, 2),
- "патр.": f"по {round(q_k/m_pat)}-{round(q_vr/m_pat)}-{round(q_op/m_pat)} шт · {m_pat*1000:.0f} г",
- })
- return out
- def report(title, res):
- print(f"\n=== {title} ===")
- for k, val in res.items():
- print(f" {k:10} = {val}")
- if __name__ == "__main__":
- import sys
- if len(sys.argv) > 1 and sys.argv[1].isdigit():
- n = int(sys.argv[1])
- f, S, B, P, l_k, l_zah = VARIANTS[n]
- res = compute(f, S, B, P, l_k, l_zah)
- if n == 6:
- # принятые в отчёте решения: слаботрещиноватые породы,
- # усиленный вруб 8 шпуров (верх диапазона 8...10), Sвр = 1,5 м2,
- # округлённые расстояния ао = 0,6 м, ап = 0,55 м, ак = 0,5 м
- res = compute(f, S, B, P, l_k, l_zah, n_vr=8, S_vr=1.5,
- a_o=0.60, a_p=0.55)
- report(f"Вариант {n}: f={f}, S={S}, В={B}, Р={P}, lк={l_k}, lзах={l_zah}", res)
- elif len(sys.argv) > 1 and sys.argv[1] == "all":
- cols = ["1) qc", "2) w0", "4) Nк", "4) Nп", "4) Nо", "4) Nвр", "4) N", "6) Qвв"]
- hdr = "N " + " ".join(f"{c.split(') ')[1]:>8}" for c in cols)
- print(hdr)
- for n, (f, S, B, P, l_k, l_zah) in VARIANTS.items():
- res = compute(f, S, B, P, l_k, l_zah)
- print(f"{n:<3}" + " ".join(f"{res[c]:>8}" for c in cols))
- else:
- # Пример методички: f=5, S=23,4, В=5,1, Р=19,4, lк=3,5, lзах=3
- # (аммонит 6ЖВ, e=1, ρвв=1100, ω=0,9; Nвр=8, Sвр=1,5 по условию примера)
- report("Пример методички (по формулам)", compute(
- 5, 23.4, 5.1, 19.4, 3.5, 3.0, n_vr=8, S_vr=1.5,
- a_o=0.8, a_p=0.7, a_k=0.6, omega=0.9))
|