| |||||||||||||
Determine chain shape Description Find the shape of a hanging chain by minimising its potential energy.
The problem is formulated as a QCQP problem (linear objective, convex quadratic constraints). Further explanation of this example:
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
catenary_graph.mos (!********************************************************************* Mosel NL examples ================= file catenary_graph.mos ``````````````````````` Find the shape of a hanging chain by minimising its potential energy QCQP problem (linear objective, convex quadratic constraints) Based on AMPL model catenary.mod Source: http://www.orfe.princeton.edu/~rvdb/ampl/nlmodels/catenary/ - Graphical representation of results - (c) 2008 Fair Issac Corporation author: S. Heipcke, May 2008, rev. Sep. 2017 *********************************************************************!) model "catenary" uses "mmxnlp", "mmsvg" parameters N = 100 ! Number of chainlinks L = 1 ! Difference in x-coordinates of endlinks H = 2*L/N ! Length of each link A = 0.5 ! Height of start point, value in [-1,1] B = 0.1 ! Height of end point, value in [-1,1] end-parameters declarations RN = 0..N x: array(RN) of mpvar ! x-coordinates of endpoints of chainlinks y: array(RN) of mpvar ! y-coordinates of endpoints of chainlinks end-declarations forall(i in RN) x(i) is_free forall(i in RN) y(i) is_free ! Objective: minimise the potential energy potential_energy:= sum(j in RN | j>0) (y(j-1)+y(j))/2 ! Bounds: positions of endpoints ! Left anchor x(0) = 0; y(0) = A ! Right anchor x(N) = L; y(N) = B ! Constraints: positions of chainlinks forall(j in RN | j>0) Link(j):= (x(j)-x(j-1))^2+(y(j)-y(j-1))^2 <= H^2 ! Setting start values forall(j in RN) setinitval(x(j), j*L/N) forall(j in RN) setinitval(y(j), 0) setparam("XPRS_verbose", true) minimise(potential_energy) writeln("Solution: ", getobjval) forall(j in RN) writeln(strfmt(getsol(x(j)),10,5), " ", strfmt(getsol(y(j)),10,5)) ! **** Display the solution as user graph **** ! Set the size of the displayed graph svgsetgraphscale(400/L) svgsetgraphlabels("x","y") ! Draw the chain links svgaddgroup("S", "Solution") svgaddline(sum(j in RN) [x(j).sol, y(j).sol]) svgsave("catenary.svg") svgrefresh svgwaitclose("Close browser window to terminate model execution.", 1) end-model | |||||||||||||
© Copyright 2024 Fair Isaac Corporation. |