Физика v4: диффузия поля в снаряд (намагничивается только скин-кольцо)
Эволюция на v3 нашла новый обход: «медленная» катушка (600+ витков, ~1мс импульс, 36А) давала КПД 30% — на низкой частоте слабы и Доуэлл, и вихревые, и трение. Неучтённая физика: за импульс поле проникает в сталь лишь на глубину скин-слоя δ=√(2ρ/(ω·μ0·μr)) ~ доли мм; внутренность снаряда не намагничивается и силы не даёт. iron_penetration_fraction = 1-(1-δ/a)² умножает коэффициент заполнения. MODEL_VERSION -> gausse-physics-v4. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,10 +21,11 @@ from gausse.physics.inductance import air_core_inductance_wheeler, winding_geome
|
|||||||
from gausse.sim.coilgun import CoilgunResult, run_coilgun
|
from gausse.sim.coilgun import CoilgunResult, run_coilgun
|
||||||
from gausse.storage.schema import RunRecord
|
from gausse.storage.schema import RunRecord
|
||||||
|
|
||||||
# v3: коэффициент заполнения железа (fill factor) — закрыт эксплойт «тонкий
|
# v4: диффузия поля в снаряд — намагничивается только скин-кольцо глубиной δ,
|
||||||
# снаряд в толстой катушке»; полная формула отражения вихревого контура;
|
# закрыт эксплойт «медленной» катушки (30%). v3: fill factor (эксплойт тонкого
|
||||||
# гард вырожденных катушек. v2: Доуэлл, трение+воздух, импульсные токи ключей.
|
# снаряда), полное отражение вихрей, гард вырожденных катушек. v2: Доуэлл,
|
||||||
MODEL_VERSION = "gausse-physics-v3"
|
# трение+воздух, паспортные импульсные токи ключей.
|
||||||
|
MODEL_VERSION = "gausse-physics-v4"
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@@ -33,6 +33,32 @@ def skin_depth_m(resistivity_ohm_m: float, omega_rad_s: float) -> float:
|
|||||||
return math.sqrt(2.0 * resistivity_ohm_m / (omega_rad_s * MU_0))
|
return math.sqrt(2.0 * resistivity_ohm_m / (omega_rad_s * MU_0))
|
||||||
|
|
||||||
|
|
||||||
|
def iron_penetration_fraction(
|
||||||
|
slug_radius_m: float,
|
||||||
|
slug_resistivity_ohm_m: float,
|
||||||
|
mu_r: float,
|
||||||
|
omega_rad_s: float,
|
||||||
|
) -> float:
|
||||||
|
"""Доля сечения снаряда, реально намагниченная за импульс (диффузия поля).
|
||||||
|
|
||||||
|
Переменное поле проникает в проводящее железо на глубину скин-слоя
|
||||||
|
δ = √(2ρ/(ω·μ₀·μᵣ)) — за миллисекундный импульс у стали это доли
|
||||||
|
миллиметра. Внутренность снаряда не успевает намагнититься и силы не
|
||||||
|
даёт. Работает кольцо глубиной δ: A_eff/A = 1−(1−δ/a)².
|
||||||
|
|
||||||
|
ЧЕСТНО: это одночастотная оценка (ω=1/√(LC)) решения уравнения диффузии,
|
||||||
|
а не само решение; ошибка — десятки процентов. Но без неё модель считала,
|
||||||
|
что намагничивается ВСЁ сечение, и оптимизатор строил «медленные»
|
||||||
|
катушки с нефизично высоким КПД (30%+).
|
||||||
|
"""
|
||||||
|
if omega_rad_s <= 0 or slug_resistivity_ohm_m <= 0 or mu_r < 1 or slug_radius_m <= 0:
|
||||||
|
return 1.0
|
||||||
|
delta = math.sqrt(2.0 * slug_resistivity_ohm_m / (omega_rad_s * MU_0 * mu_r))
|
||||||
|
if delta >= slug_radius_m:
|
||||||
|
return 1.0
|
||||||
|
return 1.0 - (1.0 - delta / slug_radius_m) ** 2
|
||||||
|
|
||||||
|
|
||||||
def dowell_ac_factor(
|
def dowell_ac_factor(
|
||||||
wire_bare_d_m: float,
|
wire_bare_d_m: float,
|
||||||
wire_insulated_d_m: float,
|
wire_insulated_d_m: float,
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from gausse.physics.inductance import (
|
|||||||
effective_permeability,
|
effective_permeability,
|
||||||
winding_geometry,
|
winding_geometry,
|
||||||
)
|
)
|
||||||
from gausse.physics.ac_resistance import dowell_ac_factor
|
from gausse.physics.ac_resistance import dowell_ac_factor, iron_penetration_fraction
|
||||||
from gausse.physics.constants import (
|
from gausse.physics.constants import (
|
||||||
AIR_DENSITY_KG_M3,
|
AIR_DENSITY_KG_M3,
|
||||||
DRAG_COEFF_CYLINDER,
|
DRAG_COEFF_CYLINDER,
|
||||||
@@ -190,8 +190,16 @@ def build_stage_physics(stage: StageConfig, projectile: ProjectileConfig) -> Sta
|
|||||||
char_omega_rad_s=char_omega,
|
char_omega_rad_s=char_omega,
|
||||||
)
|
)
|
||||||
# доля сечения катушки, реально занятая железом (см. inductance.py):
|
# доля сечения катушки, реально занятая железом (см. inductance.py):
|
||||||
# тонкий снаряд в толстой катушке не может усиливать ВЕСЬ поток
|
# тонкий снаряд в толстой катушке не может усиливать ВЕСЬ поток;
|
||||||
|
# и из этого железа за импульс намагничивается только скин-кольцо
|
||||||
|
# глубиной δ (диффузия поля, см. ac_resistance.iron_penetration_fraction)
|
||||||
fill = min((projectile.diameter_m / 2) ** 2 / geometry.mean_radius_m**2, 1.0)
|
fill = min((projectile.diameter_m / 2) ** 2 / geometry.mean_radius_m**2, 1.0)
|
||||||
|
fill *= iron_penetration_fraction(
|
||||||
|
projectile.diameter_m / 2,
|
||||||
|
projectile.material.resistivity_ohm_m,
|
||||||
|
projectile.material.mu_r,
|
||||||
|
char_omega,
|
||||||
|
)
|
||||||
inductance_model = CoilInductanceModel(
|
inductance_model = CoilInductanceModel(
|
||||||
l_air_h=l_air_h,
|
l_air_h=l_air_h,
|
||||||
coil_length_m=geometry.coil_length_m,
|
coil_length_m=geometry.coil_length_m,
|
||||||
|
|||||||
@@ -220,3 +220,19 @@ def test_eddy_reflection_bounded_at_high_frequency():
|
|||||||
r_lo = eddy_reflected_resistance_ohm(**kwargs, char_omega_rad_s=om_lo)
|
r_lo = eddy_reflected_resistance_ohm(**kwargs, char_omega_rad_s=om_lo)
|
||||||
assert r_hi < 0.5 * resistive_approx(om_hi) # высокие ω: ограничена
|
assert r_hi < 0.5 * resistive_approx(om_hi) # высокие ω: ограничена
|
||||||
assert abs(r_lo - resistive_approx(om_lo)) < 0.05 * resistive_approx(om_lo) # низкие: сходится
|
assert abs(r_lo - resistive_approx(om_lo)) < 0.05 * resistive_approx(om_lo) # низкие: сходится
|
||||||
|
|
||||||
|
|
||||||
|
def test_iron_penetration_fraction_limits():
|
||||||
|
"""Диффузия поля: тонкий снаряд/медленный импульс — всё сечение; толстый
|
||||||
|
снаряд на быстром импульсе — только скин-кольцо (эксплойт «30%» закрыт)."""
|
||||||
|
from gausse.physics.ac_resistance import iron_penetration_fraction
|
||||||
|
|
||||||
|
# очень низкая частота: поле успевает пропитать всё сечение
|
||||||
|
assert iron_penetration_fraction(0.005, 1.4e-7, 500.0, 1.0) == 1.0
|
||||||
|
# сталь ⌀9.3мм на ω~1350 рад/с (медленная катушка из эксплойта):
|
||||||
|
# намагничивается лишь внешнее кольцо — заметно меньше половины сечения
|
||||||
|
frac = iron_penetration_fraction(0.00465, 1.4e-7, 500.0, 1350.0)
|
||||||
|
assert 0.02 < frac < 0.5
|
||||||
|
# быстрее импульс -> тоньше кольцо (монотонность по ω)
|
||||||
|
frac_fast = iron_penetration_fraction(0.00465, 1.4e-7, 500.0, 13500.0)
|
||||||
|
assert frac_fast < frac
|
||||||
|
|||||||
Reference in New Issue
Block a user