Fix two physics bugs the user caught: unbounded field and ignored current limits
1. Iron saturation now in the dynamics (was the "13 Tesla" bug). Flux linkage lambda(x,I) = L_air*I + L_iron*overlap(x)*g(I) with g(I)=I_sat*tanh(I/I_sat) saturating at the current where iron reaches B_sat. Both the circuit back-EMF (dlambda/dx) and the force (coenergy, dW'/dx) derive from the SAME lambda, so energy stays conserved (0.025% error) AND the field caps at B_sat instead of running to 13 T. Reduces to the old 0.5*I^2*dL/dx in the low-current limit. On the config that reported 60% efficiency / 11.6 T, it now gives 40% / 1.90 T. 2. Switch surge-current limit is now a hard feasibility constraint: a config whose peak discharge current exceeds the switch's pulse rating (continuous * surge factor per device kind) is infeasible -- otherwise the optimizer "wins" with configs that vaporize their own thyristor (e.g. 119 A through a 12 A BT151). Capacitor current stays a warning (electrolytics tolerate pulses; DB has continuous not pulse ratings). Regression tests added for both (field cap near saturation, energy conservation under strong discharge). 87 tests pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,14 +17,15 @@ DB = ComponentDatabase.load()
|
||||
def _feasible_config() -> CoilgunConfig:
|
||||
wire = next(w for w in DB.wires if w.part_id == "cu-petv2-1.0mm")
|
||||
capacitor = next(c for c in DB.capacitors if c.part_number == "cap-470uf-400v")
|
||||
switch = next(s for s in DB.switches if s.part_number == "IRFP250PBF")
|
||||
# мощный ключ (180А, surge ~720А) — конфигурация с реальным пиковым током
|
||||
switch = next(s for s in DB.switches if s.part_number == "IRFP4468PBF")
|
||||
sensor = next(s for s in DB.sensors if s.part_number == "TCST2103")
|
||||
steel = next(m for m in DB.projectile_materials if m.name == "Ст3 (конструкционная сталь)")
|
||||
|
||||
projectile = ProjectileConfig(material=steel, diameter_m=0.008, length_m=0.02)
|
||||
stage = StageConfig(
|
||||
wire=wire, capacitor=capacitor, switch=switch, sensor=sensor, tube_od_m=0.01,
|
||||
turns_per_layer=20, layers=4, sensor_to_coil_distance_m=0.02, charge_voltage_v=350.0,
|
||||
turns_per_layer=20, layers=4, sensor_to_coil_distance_m=0.02, charge_voltage_v=200.0,
|
||||
)
|
||||
return CoilgunConfig(
|
||||
stages=[stage, stage], inter_stage_gaps_m=[0.05], projectile=projectile,
|
||||
|
||||
Reference in New Issue
Block a user