chain.gms : Hanging Chain COPS 2.0 #3
Find the chain (of uniform density) of length L suspended between two
points with minimal potential energy.
This model is from the COPS benchmarking suite.
See http://www-unix.mcs.anl.gov/~more/cops/.
The number of intervals for the discretization can be specified using
the command line parameter --nh. COPS performance tests have been
reported for nh = 50, 100, 200, 400
References:
- Dolan, E D, and More, J J, Benchmarking Optimization Software with COPS. Tech. rep., Mathematics and Computer Science Division, 2000.
- Cesari, L, Optimization - Theory and Applications. Springer Verlag, 1983.
Large Model of Type: NLP
$Title Hanging Chain COPS 2.0 #3 (CHAIN,SEQ=231)
$ontext
Find the chain (of uniform density) of length L suspended between two
points with minimal potential energy.
This model is from the COPS benchmarking suite.
See http://www-unix.mcs.anl.gov/~more/cops/.
The number of intervals for the discretization can be specified using
the command line parameter --nh. COPS performance tests have been
reported for nh = 50, 100, 200, 400
Dolan, E D, and More, J J, Benchmarking Optimization
Software with COPS. Tech. rep., Mathematics and Computer
Science Division, 2000.
Cesari, L, Optimization - Theory and Applications. Springer
Verlag, 1983.
$offtext
$if set n $set nh %n%
$if not set nh $set nh 50
set nh /i0 * i%nh%/;
alias(nh,i);
scalars L length of the suspended chain / 4 /
a height of the chain at t=0 (left) / 1 /
b height of the chain at t=1 (left) / 3 /
tf ODEs defined in [0 tf] / 1 /
h uniform interval length
n number of subintervals
tmin;
if (b>a, tmin = 0.25 else tmin = 0.75);
n = card(nh) - 1;
h = tf/n;
variables
x(i) height of the chain
u(i) derivative of x
energy potential energy
equations obj, x_eqn(i), length_eqn ;
obj.. energy =e=
0.5*h*sum(nh(i+1), x(i)*sqrt(1+sqr(u(i))) + x(i+1)*sqrt(1+sqr(u(i+1))));
x_eqn(i+1).. x(i+1) =e= x(i) + 0.5*h*(u(i)+u(i+1));
length_eqn.. 0.5*h*sum(nh(i+1), sqrt(1+sqr(u(i))) + sqrt(1+sqr(u(i+1)))) =e= L;
x.fx('i0') = a;
x.fx('i%nh%') = b;
x.l(i) = 4*abs(b-a)*((ord(i)-1)/n)*(0.5*((ord(i)-1)/n) - tmin) + a;
u.l(i) = 4*abs(b-a)*(((ord(i)-1)/n) - tmin);
model chain /all/;
$if set workspace chain.workspace = %workspace%;
solve chain using nlp minimizing energy;