laba3.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # -*- coding: utf-8 -*-
  2. """
  3. Лаба 3. Конструирование тоннельных обделок сводчатого очертания.
  4. Расчёт по методике (шаги 1–13), SymPy.
  5. Все длины в мм, углы выводятся в градусах.
  6. """
  7. from sympy import Rational, sin, cos, asin, deg, rad, N, nsimplify
  8. # ---------------------------------------------------------------- справочные данные
  9. # Табл. 1: ширина проезжей части Г (м) по длине тоннеля и категории дороги
  10. G_TABLE = {
  11. ("до 300", "I-II"): 9.0,
  12. ("до 300", "III"): 8.5,
  13. ("до 300", "IV"): 8.0,
  14. ("более 300", "I-II"): 8.5,
  15. ("более 300", "III"): 8.0,
  16. ("более 300", "IV"): 7.0,
  17. }
  18. # Табл. 7: замковое сечение hз (см) — диапазоны; строка = категория дороги
  19. # (в скобках у габарита — значение Г для тоннелей длиной более 300 м той же категории)
  20. HZ_TABLE = {
  21. "I-II": [(90, 85), (80, 75), (75, 70), (65, 60), (60, 55), (50, 45), 40], # Г-9 (8,5)
  22. "III": [(85, 80), (75, 70), (70, 60), (60, 55), (55, 50), 40, 40], # Г-8,5 (8)
  23. "IV": [(80, 75), (70, 65), (60, 55), (55, 50), (50, 45), 40, 40], # Г-8 (7)
  24. }
  25. # Табл. 7: множители к hз для пяты свода / стены / обреза фундамента по группам крепости
  26. def mult_group(f):
  27. if f <= 3:
  28. return {"hп": (1.4, 1.3), "hст": (1.6, 1.5), "hо": (2.0, 1.8)}
  29. if f <= 6:
  30. return {"hп": (1.3, 1.1), "hст": (1.5, 1.3), "hо": (1.8, 1.6)}
  31. return {"hп": (1, 1), "hст": (1.1, 1.0), "hо": (1.5, 1.5)}
  32. # Варианты для самостоятельной работы: (длина, категория, свод, порода, f)
  33. VARIANTS = {
  34. 1: ("до 300", "I-II", "пологий", "скальная", 4),
  35. 2: ("до 300", "III", "подъемистый", "скальная", 4),
  36. 3: ("до 300", "I-II", "пологий", "скальная", 8),
  37. 4: ("более 300", "III", "подъемистый", "слабая", 2),
  38. 5: ("до 300", "I-II", "пологий", "скальная", 6),
  39. 6: ("более 300", "III", "подъемистый", "слабая", 3),
  40. 7: ("до 300", "I-II", "пологий", "слабая", 3),
  41. 8: ("до 300", "I-II", "пологий", "скальная", 7),
  42. 9: ("до 300", "I-II", "пологий", "скальная", 5),
  43. 10: ("до 300", "III", "подъемистый", "скальная", 6),
  44. 11: ("до 300", "I-II", "пологий", "слабая", 2),
  45. 12: ("до 300", "I-II", "пологий", "слабая", 1),
  46. 13: ("более 300", "III", "подъемистый", "скальная", 4),
  47. 14: ("более 300", "III", "подъемистый", "слабая", 1),
  48. 15: ("более 300", "I-II", "пологий", "скальная", 9),
  49. 16: ("до 300", "IV", "подъемистый", "скальная", 4),
  50. 17: ("до 300", "IV", "подъемистый", "скальная", 7),
  51. 18: ("более 300", "III", "подъемистый", "скальная", 7),
  52. 19: ("более 300", "I-II", "подъемистый", "слабая", 2),
  53. 20: ("до 300", "I-II", "пологий", "слабая", 1),
  54. }
  55. PASSAGE = 750 # служебный проход П, мм
  56. STRIP = 500 # защитная полоса ЗП, мм
  57. I_CROSS = 0.02 # поперечный уклон проезжей части, 20 промилле
  58. # ---------------------------------------------------------------- расчёт
  59. def compute(length="до 300", category="I-II", vault="пологий", rock="скальная", f=4,
  60. beta=None, hz=None, hp=None, dz=None, db=None, round_deg=True):
  61. """Шаги 1–13 методики. Неизвестные параметры подбираются из таблиц по умолчанию
  62. (диапазоны берутся с верхним значением, как в примере методички)."""
  63. out = {}
  64. # --- исходные данные по таблицам
  65. G = Rational(int(G_TABLE[(length, category)] * 1000)) # ширина проезжей части, мм
  66. if dz is None:
  67. dz = 150 if rock == "слабая" else 100 # зазор: слабая 15 см, скальная 10 см
  68. dz = Rational(dz)
  69. if db is None:
  70. db = 200 if (vault == "пологий" and rock == "скальная") else 0 # бермы — только пологий свод на скальной
  71. db = Rational(db)
  72. # --- 1) пролёт в свету
  73. if category in ("I-II", "I или II"):
  74. l0 = G + 2 * PASSAGE + 2 * dz + 2 * db
  75. else:
  76. l0 = G + PASSAGE + STRIP + 2 * dz
  77. # --- 2) отношение пролёта к стреле подъёма
  78. if beta is None:
  79. beta = Rational(3) if vault == "пологий" else Rational(9, 4) # пологий 2,5–4; подъемистый 2,1–2,4
  80. # --- 3) стрела подъёма в свету
  81. f0 = l0 / beta
  82. # --- 4) радиус внутреннего очертания свода
  83. r0 = f0 * (4 + beta**2) / 8
  84. # --- 5) предварительный угол наклона пяты свода
  85. sin_phi_pr = l0 / (2 * r0)
  86. phi_pr = N(deg(asin(sin_phi_pr)))
  87. phi_pr_use = round(float(phi_pr)) if round_deg else float(phi_pr)
  88. # --- 6) сечения обделки по табл. 7
  89. hz_row = HZ_TABLE[category]
  90. hz_range = hz_row[min(f, 7) - 1]
  91. if hz is None:
  92. hz = hz_range[0] if isinstance(hz_range, tuple) else hz_range # верх диапазона, см
  93. hz = Rational(hz * 10) # -> мм
  94. grp = mult_group(f)
  95. if hp is None:
  96. hp = round(grp["hп"][0] * float(hz)) # верх диапазона множителя
  97. hp = Rational(hp)
  98. # --- 7) предварительные осевые стрела и пролёт
  99. f_pr = f0 + Rational(1, 2) * hz - Rational(1, 2) * hp * cos(rad(phi_pr_use))
  100. l_pr = l0 + hp * sin(rad(phi_pr_use))
  101. # --- 8) уточнённый угол пяты
  102. sin_phi = 4 * f_pr * l_pr / (4 * f_pr**2 + l_pr**2)
  103. phi = N(deg(asin(sin_phi)))
  104. phi_use = round(float(phi)) if round_deg else float(phi)
  105. # --- 9) окончательные осевые стрела и пролёт
  106. f_ = f0 + Rational(1, 2) * hz - Rational(1, 2) * hp * cos(rad(phi_use))
  107. l_ = l0 + hp * sin(rad(phi_use))
  108. # --- 10) расчётный (осевой) радиус свода
  109. r = Rational(1, 2) * l_ / sin(rad(phi_use))
  110. # --- 11) стрела и пролёт наружного очертания
  111. f1 = f_ + Rational(1, 2) * hz - Rational(1, 2) * hp * cos(rad(phi_use))
  112. l1 = l_ + hp * sin(rad(phi_use))
  113. # --- 12) радиус наружного очертания
  114. r1 = (4 * f1**2 + l1**2) / (8 * f1)
  115. # --- 13) сточный треугольник по оси проезжей части
  116. h_t = Rational(1, 2) * G * Rational(int(I_CROSS * 1000), 1000)
  117. # сечения по табл. 7 (для оформления)
  118. hст = round(grp["hст"][0] * float(hz))
  119. hо = round(grp["hо"][0] * float(hz))
  120. hл = round(0.8 * float(hz))
  121. def v(x):
  122. return round(float(N(x)), 1)
  123. out["Г"] = float(G); out["П"] = PASSAGE; out["δз"] = int(dz); out["δб"] = int(db)
  124. out.update({
  125. "1) l₀": v(l0), "2) β": float(beta), "3) f₀": v(f0), "4) r₀": v(r0),
  126. "5) sinφпр": round(float(sin_phi_pr), 4), "5) φпр": phi_pr_use,
  127. "6) hз,мм": float(hz), "6) hп,мм": float(hp), "6) hст,мм": hст, "6) hо,мм": hо, "6) hл,мм": hл,
  128. "7) fпр": v(f_pr), "7) lпр": v(l_pr),
  129. "8) sinφ": round(float(sin_phi), 4), "8) φ": phi_use,
  130. "9) f": v(f_), "9) l": v(l_),
  131. "10) r": v(r),
  132. "11) f₁": v(f1), "11) l₁": v(l1),
  133. "12) r₁": v(r1),
  134. "13) hт": v(h_t),
  135. })
  136. return out
  137. def report(title, res):
  138. print(f"\n=== {title} ===")
  139. for k, val in res.items():
  140. print(f" {k:14} = {val}")
  141. if __name__ == "__main__":
  142. import sys
  143. if len(sys.argv) > 1 and sys.argv[1] == "all":
  144. cols = ["1) l₀", "3) f₀", "4) r₀", "5) φпр", "6) hз,мм", "6) hп,мм",
  145. "8) φ", "9) f", "9) l", "10) r", "11) f₁", "11) l₁", "12) r₁", "13) hт"]
  146. hdr = "N " + " ".join(f"{c.split(') ')[1]:>9}" for c in cols)
  147. print(hdr)
  148. for n, (length, cat, vault, rock, f) in VARIANTS.items():
  149. res = compute(length, cat, vault, rock, f)
  150. print(f"{n:<3}" + " ".join(f"{res[c]:>9}" for c in cols))
  151. elif len(sys.argv) > 1 and sys.argv[1].isdigit():
  152. n = int(sys.argv[1])
  153. length, cat, vault, rock, f = VARIANTS[n]
  154. report(f"Вариант {n}: {length}, {cat}, {vault} свод, {rock} порода, f={f}",
  155. compute(length, cat, vault, rock, f))
  156. else:
  157. # Проверка на примере методички (до 300, I–II, пологий, скальная, f=4;
  158. # в примере методички hп = 1,4·hз = 910 мм, β = 3)
  159. report("Пример методички", compute(
  160. length="до 300", category="I-II", vault="пологий", rock="скальная", f=4,
  161. beta=3, hz=65, hp=910, dz=100, db=200))