ok , oto symulacja , pozdr
@karmelsss @Squad40i4
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle
import matplotlib.animation as animation
# ==================== PARAMETRY SYMULACJI ====================
ISKANDER_WARHEAD_TNT = 0.6 # ton TNT (średnio ~600 kg)
NITRO_CHEM_STOCK = 800 # szacunkowe tony TNT na stanie (konserwatywnie)
DOMINO_MULTIPLIER = 8 # efekt domina - ile razy więcej od pojedynczego uderzenia
# Dla 3 rakiet
total_iskanders = 3
direct_tnt = total_iskanders * ISKANDER_WARHEAD_TNT
total_tnt = direct_tnt * DOMINO_MULTIPLIER NITRO_CHEM_STOCK * 0.7 # 70% zakładu detonuje
print(f"=== SYMULACJA ATAKU 3x ISKANDER NA NITRO-CHEM ===\n")
print(f"Bezpośredni ładunek: {direct_tnt:.1f} t TNT")
print(f"Z efektem domina: ~{total_tnt:.0f} ton TNT")
print(f"Porównanie: ~{total_tnt/1:.0f}x większa niż Bejrut 2020\n")
# Promienie zniszczeń (przybliżone wzory na podstawie skalowania blast wave)
def blast_radius(tnt_tons, overpressure_kpa):
# Bardzo uproszczony model (scaled distance)
return 8 * (tnt_tons ** 0.33) * (200 / overpressure_kpa) ** 0.33
r_total = blast_radius(total_tnt, 20) # ~20 kPa - ciężkie uszkodzenia
r_severe = blast_radius(total_tnt, 50) # 50 kPa - zawalenia
r_lethal = blast_radius(total_tnt, 140) # śmiertelne ciśnienie
print(f"Promień całkowitego zniszczenia: ~{r_total:.1f} km")
print(f"Promień ciężkich uszkodzeń: ~{r_severe:.1f} km")
print(f"Promień śmiertelny: ~{r_lethal:.1f} km")
# ==================== WIZUALIZACJA ====================
fig, ax = plt.subplots(figsize=(12, 10))
ax.set_facecolor('darkblue')
plt.title('SYMULACJA 3x ISKANDER → NITRO-CHEM BYDGOSZCZ\n(~' f'{total_tnt:.0f}' ' ton TNT)',
fontsize=16, color='red', pad=20)
# Mapa bazowa (przybliżenie)
ax.set_xlim(-15, 15)
ax.set_ylim(-15, 15)
ax.grid(True, alpha=0.3, color='white')
# Centrum Nitro-Chem
center = (0, 0)
ax.plot(0, 0, 'ro', markersize=12, label='Nitro-Chem')
# Kręgi zniszczeń
for r, color, label, alpha in [
(r_total, 'red', f'Całkowite zniszczenie ({r_total:.1f} km)', 0.4),
(r_severe, 'orange', f'Ciężkie uszkodzenia ({r_severe:.1f} km)', 0.35),
(r_lethal, 'yellow', f'Śmiertelne ciśnienie ({r_lethal:.1f} km)', 0.25)
]:
circle = Circle(center, r, color=color, alpha=alpha, fill=True, label=label)
ax.add_patch(circle)
circle2 = Circle(center, r, color=color, alpha=0.8, fill=False, linewidth=2)
ax.add_patch(circle2)
# Iskandery
for i in range(total_iskanders):
angle = i * 120
x = np.cos(np.radians(angle)) * 8
y = np.sin(np.radians(angle)) * 8
ax.plot(x, y, 'x', color='lime', markersize=12, markeredgewidth=3, label='Iskander' if i==0 else "")
# Tekst z liczbami
plt.text(-14, 13, f'3 × Iskander\n{total_tnt:.0f} ton TNT', fontsize=14, color='white', bbox=dict(facecolor='red', alpha=0.7))
plt.xlabel('km')
plt.ylabel('km')
plt.legend(loc='upper right')
plt.tight_layout()
# Animacja wybuchu (prosta)
def animate(frame):
for coll in ax.collections[:]:
if isinstance(coll, Circle) and coll.get_alpha() > 0.1:
coll.set_alpha(coll.get_alpha() * 0.97)
return ax.collections
ani = animation.FuncAnimation(fig, animate, frames=60, interval=80, repeat=True)
plt.show()