spring.gms : Coil Compression String Design

**Description**

Coil compression spring design problem, finds minimum volume of wire for the production of a coil compression spring

**Reference**

- Sandgren, E, Nonlinear Integer and Discrete Programming in Mechanical Design Optimization. Journal of Mechanical Design 112, 2 (1990), 223-229.

**Small Model of Type :** MINLP

**Category :** GAMS Model library

**Main file :** spring.gms

$title Coil Compression String Design (SPRING,SEQ=206) $Ontext Coil compression spring design problem, finds minimum volume of wire for the production of a coil compression spring Sangren, E, Nonlinear Integer and Discrete Programming in Mechanical Design Optimization. Journal of Mechanical Design, Trans. ASME 112 (1990), 223-229. $Offtext Set i possible wire types / g-1 * g-11 /; Parameters b(i) Allowable wire diameters (in) / g-1 0.207 g-2 0.225 g-3 0.244 g-4 0.263 g-5 0.283 g-6 0.307 g-7 0.331 g-8 0.362 g-9 0.394 g-10 0.4375 g-11 0.500 / Pload preload (lb) / 300 / Pmax max working load (lb) / 1000 / delm max deflection (in) / 6 / delw deflection from preload (in) / 1.25 / lmax max free length of spring (in) / 14 / coilmax max coil diameter (in) / 3 / pi pi / 3.141592654 / S max shear stress / 189e3 / G shear modulus of material / 11.5e6 / variables coil coil diameter wire wire diameter del deflection N number of coils C constant K constant y(i) wire choice volume binary variable y; integer variable n; Equations voldef definition of total volume of coil spring defC, defK, shear, defdel, freel, CoilWidth, defWire, selectWire; voldef.. volume =e= (N+2)/2*PI*coil*wire**2; DefC.. C =e= coil/wire; DefK.. K =e= (4*C - 1) / (4*C - 4) + 0.615 / C; shear.. 8*Pmax/PI*K*C/wire**2 =l= S; Defdel.. del =e= 8*N/G*power(C,3)/wire; freel.. Pmax*del + 1.05*(N+2)*wire =l= lmax; CoilWidth.. coil + wire =l= coilmax; DefWire.. wire =e= SUM(i, b(i)*y(i)); SelectWire.. SUM(i, y(i)) =e= 1; model spring / all /; * set some bounds del.up = delm/Pload; del.lo = delw/(Pmax - Pload); wire.lo = smin(i, b(i)); c.lo = 1.1; coil.lo = 2*wire.lo; n.lo = 1; * Starting point y.l(i) = 1/card(i); wire.l = SUM(i, b(i)*y.l(i)); coil.l = coilmax - wire.l; c.l = coil.l/wire.l; solve spring using minlp minimizing volume;