Version:

springchain.gms : Equilibrium of System with Piecewise Linear Springs

**Description**

This model finds the shape of a hanging chain consisting of N springs and N-1 nodes. Each spring buckles under compression and each node has a weight hanging from it. The springs are assumed weightless. The goal is to minimize the potential energy of the system. We use rotated quadratic cone constraints to model the extension of each spring.

**Small Model of Type :** QCP

**Category :** GAMS Model library

**Main file :** springchain.gms

```
$title Equilibrium of System with Piecewise Linear Springs (SPRINGCHAIN,SEQ=431)
$onText
This model finds the shape of a hanging chain consisting of
N springs and N-1 nodes. Each spring buckles under compression and each
node has a weight hanging from it. The springs are assumed
weightless. The goal is to minimize the potential energy of the
system.
We use rotated quadratic cone constraints to model the extension
of each spring.
M. Lobo, L. Vandenberghe, S. Boyd, and H. Lebret,
Applications of second-order cone programming, Linear Algebra and its
Applications, 284:193-228, November 1998, Special Issue on Linear Algebra
in Control, Signals and Image Processing.
$offText
* Number of chainlinks
$if not set N $set N 10
$eval NM1 %N%-1
Set n "spring index" /n0*n%N%/;
Scalars
a_x "x coordinate of beginning node" / 0/
a_y "y coordinate of beginning node" / 0/
b_x "x coordinate of end node" / 2/
b_y "y coordinate of end node" / -1/
L0 "rest length of each spring" / [2*sqrt(sqr(a_x-b_x) + sqr(a_y-b_y))/%N%]/
g "acceleration due to gravity" / 9.8/
k "stiffness of springs" /100/;
Parameters
m(n) "mass of each hanging node" /n1*n%NM1% 1/;
Variables
obj
x(n) "x-coordinates of nodes"
y(n) "y-coordinates of nodes"
delta_x(n)
delta_y(n)
unit;
Positive variable
t_L0(n)
t(n) "extension of each spring"
v;
Equations
pot_energy
delta_x_eq(n)
delta_y_eq(n)
link_L0(n)
link_up(n)
cone_eq;
pot_energy.. obj =E= sum(n$[ord(n)>1 and ord(n)<card(n)], m[n]*g*y[n]) + k*v;
delta_x_eq(n).. delta_x(n) =E= x[n] - x[n-1];
delta_y_eq(n).. delta_y(n) =E= y[n] - y[n-1];
link_L0(n).. t_L0[n] =E= L0 + t[n];
link_up(n)$[ord(n)>1]..
sqr(t_L0[n]) =G= sqr(delta_x[n]) + sqr(delta_y[n]);
cone_eq.. 2*v*unit =G= sum(n$[ord(n)>1], sqr(t[n]));
Model spring /all/;
x.L(n) = ( (ord(n)-1)/%N% )*b_x + (ord(n)/%N%)*a_x;
y.L(n) = ( (ord(n)-1)/%N% )*b_y + (ord(n)/%N%)*a_y;
x.FX['n0'] = a_x;
y.FX['n0'] = a_y;
x.FX['n%N%'] = b_x;
y.FX['n%N%'] = b_y;
unit.fx = 1;
Solve spring using qcp minimizing obj;
```