├── Convex ├── chord.png └── melbourne_temps.txt ├── README.md ├── Optimizing Code with JuMP.ipynb └── Rocket Control with JuMP - JuliaCon 2015.ipynb /Convex/chord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JuliaOpt/JuliaCon-2015/master/Convex/chord.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JuliaCon-2015 2 | 3 | ### Required packages 4 | 5 | ```julia 6 | Pkg.add("JuMP") 7 | Pkg.add("Convex") 8 | Pkg.add("Cbc") 9 | Pkg.add("Ipopt") 10 | Pkg.add("SCS") 11 | ``` 12 | -------------------------------------------------------------------------------- /Optimizing Code with JuMP.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Optimizing Code with JuMP\n", 8 | "\n", 9 | "Many linear algebra operations, like matrix-matrix multiply, can be written fairly simply as nested loops. However if this was literally translated into machine code then the performance you would obtain would be a fraction of what is possible. The reason is that modern CPUs are complex things, capable of running multiple instructions at a time with deep \"pipelines\" to take account of parallelism on a small scale.\n", 10 | "\n", 11 | "In this notebook we will develop a model to determine the optimal scheduling for a sequence of instructions so that the CPU can pipeline the operations to perform a calculation as fast as possible." 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "## Four-element dot product\n", 19 | "\n", 20 | "Consider a function that calculates the dot products of two four-element vectors. We will specify the **directed acyclic graph (DAG)** of operations that need to be performed, and then we will optimize the scheduling of the operations. For this function we will use the DAG\n", 21 | "\n", 22 | "```\n", 23 | "[-----] [-----] \n", 24 | "[ A ] [ E ] MUL A E --\\\n", 25 | "[-----] [-----] ADD --\\\n", 26 | "[ B ] [ F ] MUL B F --/ \\\n", 27 | "[-----] .* [-----] = ADD\n", 28 | "[ C ] [ G ] MUL C G --\\ /\n", 29 | "[-----] [-----] ADD --/\n", 30 | "[ D ] [ H ] MUL D H --/\n", 31 | "[-----] [-----] \n", 32 | "```\n", 33 | "\n", 34 | "From this we can see that, on a very \"parallel\" machine, all the MULs can be performed in parallel. Two of the ADDs can then be done together, but the final ADD can only run after everything else is done. The length of time for each operation can vary. For example, MUL might take 2 units of time, while ADD only takes 1.\n", 35 | "\n", 36 | "On a real machine we have some constraints. For this problem we will consider a CPU with the following restrictions and properties:\n", 37 | "* Only one operation can start at a time\n", 38 | "* ADD and MUL both take three units of time to run\n", 39 | "* Two ADDs and two MULs can be done at time" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## Modeling as an binary optimization problem\n", 47 | "\n", 48 | "We can pose this scheduling problem as a binary linear optimization problem. We will first fix a maximum time $T$, and create a binary variable for each of the operations $i$ and times $t$. If this variable has value 1 then we say that the operation starts at time $t$" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": { 55 | "collapsed": false 56 | }, 57 | "outputs": [], 58 | "source": [ 59 | "# Create our list of operations\n", 60 | "ops = [:MUL_AE, :MUL_BF, :MUL_CG, :MUL_DH, :ADD_ABEF, :ADD_CDGH, :ADD_ALL]\n", 61 | "# Max possible finishing time\n", 62 | "T = 20\n", 63 | "# Length of an instruction\n", 64 | "L = 3\n", 65 | "# Max instructions running at a time\n", 66 | "C = 2\n", 67 | "\n", 68 | "# Lets optimize!\n", 69 | "using JuMP\n", 70 | "\n", 71 | "#using Gurobi\n", 72 | "#m = Model(solver=GurobiSolver())\n", 73 | "m = Model()\n", 74 | "\n", 75 | "@defVar(m, startat[op=ops, t=1:T], Bin);" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "We can immediately add some constraints on `startat` that have nothing to do with the dependency graph." 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": null, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# Each operation should start once, and once only\n", 94 | "for op in ops\n", 95 | " @addConstraint(m, sum{startat[op,t], t=1:T} == 1)\n", 96 | "end\n", 97 | "\n", 98 | "# At most one operation can start at each time\n", 99 | "for t in 1:T\n", 100 | " @addConstraint(m, sum{startat[op,t], op=ops} <= 1)\n", 101 | "end\n", 102 | "\n", 103 | "# There will be multiple possible solutions, but lets\n", 104 | "# pin it down by fixing that the first MUL starts at\n", 105 | "# time 1\n", 106 | "@addConstraint(m, startat[:MUL_AE,1] == 1);" 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "metadata": {}, 112 | "source": [ 113 | "Implementing precedence constraints is a little more tricky. Lets consider `ADD_ABEF`, which can only start after `MUL_AE` and `MUL_BF` have completed. Say we start `MUL_AE` at time 1, which will be done by time 4, and we start `MUL_BF` at time 2, which will be done by time 5. We can thus start the add at time 5 or later, or from another perspective, we cannot start the add unless both of the MULs were started at least 3 time units beforehand. We capture the \"at least\" by taking a sum over `start` for those operations across time, and enforce the relationship with a less-than-or-equal-to constraint." 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": null, 119 | "metadata": { 120 | "collapsed": false 121 | }, 122 | "outputs": [], 123 | "source": [ 124 | "# For each possible starting time for the dependent operations\n", 125 | "for t in 1:T-L\n", 126 | " # ADD_ABEF cannot start until MUL_AE and MUL_BF finish\n", 127 | " @addConstraint(m, startat[:ADD_ABEF,t] <= sum{startat[:MUL_AE,s], s=1:t-L})\n", 128 | " @addConstraint(m, startat[:ADD_ABEF,t] <= sum{startat[:MUL_BF,s], s=1:t-L})\n", 129 | " # ADD_CDGH cannot start until MUL_CG and MUL_DH finish\n", 130 | " @addConstraint(m, startat[:ADD_CDGH,t] <= sum{startat[:MUL_CG,s], s=1:t-L})\n", 131 | " @addConstraint(m, startat[:ADD_CDGH,t] <= sum{startat[:MUL_DH,s], s=1:t-L})\n", 132 | " # ADD_ALL cannot start until ADD_ABEF and ADD_CDGH finish\n", 133 | " @addConstraint(m, startat[:ADD_ALL,t] <= sum{startat[:ADD_ABEF,s], s=1:t-L})\n", 134 | " @addConstraint(m, startat[:ADD_ALL,t] <= sum{startat[:ADD_CDGH,s], s=1:t-L})\n", 135 | "end" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "metadata": {}, 141 | "source": [ 142 | "We'll try to start the last operation as soon as possible. We can do that by creating a penalty proportional to the start time, i.e. the start time itself. Then lets try solving the model with what we've got!" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": { 149 | "collapsed": false, 150 | "scrolled": true 151 | }, 152 | "outputs": [], 153 | "source": [ 154 | "@setObjective(m, Min, sum{t*startat[:ADD_ALL,t],t=1:T})\n", 155 | "\n", 156 | "status = solve(m)\n", 157 | "@show status\n", 158 | "function pretty(op)\n", 159 | " println(op)\n", 160 | " for t in 1:T\n", 161 | " if iround(getValue(startat[op,t])) == 1\n", 162 | " print(\"S\")\n", 163 | " else\n", 164 | " print(\"_\")\n", 165 | " end\n", 166 | " end\n", 167 | " println()\n", 168 | "end\n", 169 | "map(pretty, ops);" 170 | ] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": {}, 175 | "source": [ 176 | "We can see that the dependency is being respected, but we haven't modeled the other important constraint that we cannot run more than 2 MUL and 2 ADD at a time. Because of our problem we don't need to worry about the ADD as that never occurs, but we'll model it anyway for completeness.\n", 177 | "\n", 178 | "There are a few approaches we could use, but we'll address this by introducing a new variable `running` that will be 1 if an operation is still running at time $t$. To do so we'll need to link `start` and `running`, but the constraint limiting the number of things run is simple." 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": null, 184 | "metadata": { 185 | "collapsed": false 186 | }, 187 | "outputs": [], 188 | "source": [ 189 | "@defVar(m, running[op=ops,t=1:T], Bin)\n", 190 | "\n", 191 | "# Link running to startat\n", 192 | "for op in ops\n", 193 | " # For each possible start time\n", 194 | " for t in 1:T-L+1\n", 195 | " # For the L units of time including that start time\n", 196 | " for s in t:t+L-1\n", 197 | " @addConstraint(m, running[op,s] >= startat[op,t])\n", 198 | " end\n", 199 | " end\n", 200 | "end\n", 201 | "\n", 202 | "# Can't do more than a certain number of ops at a time\n", 203 | "mul_ops = ops[1:4]\n", 204 | "add_ops = ops[5:7]\n", 205 | "for t in 1:T\n", 206 | " # Multiplies\n", 207 | " @addConstraint(m, sum{running[op,t],op=mul_ops} <= C)\n", 208 | " # Adds\n", 209 | " @addConstraint(m, sum{running[op,t],op=add_ops} <= C)\n", 210 | "end" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": null, 216 | "metadata": { 217 | "collapsed": false 218 | }, 219 | "outputs": [], 220 | "source": [ 221 | "status = solve(m)\n", 222 | "@show status\n", 223 | "function pretty2(op)\n", 224 | " print(rpad(op,10,\" \"))\n", 225 | " for t in 1:T\n", 226 | " if iround(getValue(startat[op,t])) == 1\n", 227 | " print(\"S\")\n", 228 | " elseif iround(getValue(running[op,t])) == 1\n", 229 | " print(\"R\")\n", 230 | " else\n", 231 | " print(\"_\")\n", 232 | " end\n", 233 | " end\n", 234 | " println()\n", 235 | "end\n", 236 | "map(pretty2, ops);" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": {}, 242 | "source": [ 243 | "Depending on your solver, you may get different solutions. When I tried earlier, I got\n", 244 | "```\n", 245 | "MUL_AE SRR___________________________\n", 246 | "MUL_BF _SRR__________________________\n", 247 | "MUL_CG ____SRR_______________________\n", 248 | "MUL_DH ___SRR________________________\n", 249 | "ADD_ABEF ____RRSRR_____________________\n", 250 | "ADD_CDGH ____RRRSRR____________________\n", 251 | "ADD_ALL __________SRR_________________\n", 252 | "```\n", 253 | "Which is odd, because there are some `R` before the `S`. Have no fear: its simply because there is no reason not to set it 1, as we are not constrained at that time, and because solvers are very literal like that. We could fix that by either adding more constraints, or adding a small objective term to discourage setting `running` to 1 if it isn't needed:" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": null, 259 | "metadata": { 260 | "collapsed": false 261 | }, 262 | "outputs": [], 263 | "source": [ 264 | "@setObjective(m, Min, sum{t*startat[:ADD_ALL,t],t=1:T} + 1e-5*sum(running))\n", 265 | "status = solve(m)\n", 266 | "@show status\n", 267 | "map(pretty2, ops);" 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "## Extension: Matrix-Vector Product" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": null, 280 | "metadata": { 281 | "collapsed": false 282 | }, 283 | "outputs": [], 284 | "source": [ 285 | "# We are building kernel for 4x4 matrix * vector product, i.e.\n", 286 | "# [a11 a12 a13 a14] [x1]\n", 287 | "# [a21 a22 a23 a24] [x2] = A x\n", 288 | "# [a31 a32 a33 a34] [x3]\n", 289 | "# [a41 a42 a43 a44] [x4]\n", 290 | "# First, define an operation primitive\n", 291 | "immutable Operation\n", 292 | " name::String # User-friendly name for the operation\n", 293 | " optype::Symbol # Type of operation (:ADD,:MUL,:NOOP)\n", 294 | " # Operations that must complete before this operation starts\n", 295 | " depends::Vector \n", 296 | "end\n", 297 | "\n", 298 | "# Each element of the result vector is a dot product\n", 299 | "# between a row of A and the vector x\n", 300 | "function make_dot_product(prefix)\n", 301 | " Operation(prefix*\"ADDFINAL\", :ADD, [\n", 302 | " Operation(prefix*\"ADD1\", :ADD, [\n", 303 | " Operation(prefix*\"MUL1\", :MUL, []),\n", 304 | " Operation(prefix*\"MUL2\", :MUL, [])\n", 305 | " ]),\n", 306 | " Operation(prefix*\"ADD2\", :ADD, [\n", 307 | " Operation(prefix*\"MUL3\", :MUL, []),\n", 308 | " Operation(prefix*\"MUL4\", :MUL, [])\n", 309 | " ])\n", 310 | " ])\n", 311 | "end\n", 312 | "final = Operation(\"MATVEC\",:NOOP,[\n", 313 | "# make_dot_product(\"ROW1\"),\n", 314 | "# make_dot_product(\"ROW2\"),\n", 315 | " make_dot_product(\"ROW3\"),\n", 316 | " make_dot_product(\"ROW4\")\n", 317 | "])\n", 318 | "\n", 319 | "# Collect all the operations into a vector so we\n", 320 | "# can index over them easier\n", 321 | "ops = Operation[]\n", 322 | "function collect_ops(op)\n", 323 | " push!(ops, op)\n", 324 | " map(collect_ops, op.depends)\n", 325 | "end\n", 326 | "collect_ops(final)\n", 327 | "@show length(ops)\n", 328 | "\n", 329 | "# Build model\n", 330 | "using JuMP\n", 331 | "#using Gurobi\n", 332 | "#m = Model(solver=GurobiSolver())\n", 333 | "using Cbc\n", 334 | "m = Model(solver=CbcSolver(seconds=180))\n", 335 | "T = 40\n", 336 | "L = 3\n", 337 | "C = 2\n", 338 | "@defVar(m, startat[op=ops,t=1:T], Bin)\n", 339 | "@defVar(m, running[op=ops,t=1:T], Bin)\n", 340 | "# Run all operations\n", 341 | "for op in ops\n", 342 | " @addConstraint(m, sum{startat[op,t], t=1:T} == 1)\n", 343 | "end\n", 344 | "# At most one operation can start at each time\n", 345 | "for t in 1:T\n", 346 | " @addConstraint(m, sum{startat[op,t], op=ops} <= 1)\n", 347 | "end\n", 348 | "# For each possible starting time for the dependent operations\n", 349 | "for t in 1:T-L\n", 350 | " # For each operation\n", 351 | " for op in ops\n", 352 | " for before_op in op.depends\n", 353 | " @addConstraint(m, startat[op,t] <= \n", 354 | " sum{startat[before_op,s], s=1:t-L})\n", 355 | " end\n", 356 | " end\n", 357 | "end\n", 358 | "# Link running to startat\n", 359 | "for op in ops\n", 360 | " # For each possible start time\n", 361 | " for t in 1:T-L+1\n", 362 | " # For the L units of time including that start time\n", 363 | " for s in t:t+L-1\n", 364 | " @addConstraint(m, running[op,s] >= startat[op,t])\n", 365 | " end\n", 366 | " end\n", 367 | "end\n", 368 | "# Can't do more than a certain number of ops at a time\n", 369 | "add_ops = filter(op->op.optype==:ADD, ops)\n", 370 | "mul_ops = filter(op->op.optype==:MUL, ops)\n", 371 | "for t in 1:T\n", 372 | " # Multiplies\n", 373 | " @addConstraint(m, sum{running[op,t],op=mul_ops} <= C)\n", 374 | " # Adds\n", 375 | " @addConstraint(m, sum{running[op,t],op=add_ops} <= C)\n", 376 | "end\n", 377 | "# Prioritize finish time\n", 378 | "@setObjective(m, Min, sum{t*startat[final,t],t=1:T} + 1e-5*sum(running))\n", 379 | "# How big is the problem?\n", 380 | "@show MathProgBase.numvar(m)\n", 381 | "@show MathProgBase.numconstr(m)\n", 382 | "# Solve it\n", 383 | "@time status = solve(m)\n", 384 | "@show status" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "execution_count": null, 390 | "metadata": { 391 | "collapsed": false 392 | }, 393 | "outputs": [], 394 | "source": [ 395 | "# Display it\n", 396 | "function pretty_matvec(op)\n", 397 | " print(rpad(op.name,15,\" \"))\n", 398 | " for t in 1:T\n", 399 | " if iround(getValue(startat[op,t])) == 1\n", 400 | " print(\"S\")\n", 401 | " elseif iround(getValue(running[op,t])) == 1\n", 402 | " print(\"R\")\n", 403 | " else\n", 404 | " print(\"_\")\n", 405 | " end\n", 406 | " end\n", 407 | " println()\n", 408 | "end\n", 409 | "map(pretty_matvec, ops);" 410 | ] 411 | } 412 | ], 413 | "metadata": { 414 | "kernelspec": { 415 | "display_name": "Julia 0.3.7", 416 | "language": "julia", 417 | "name": "julia 0.3" 418 | }, 419 | "language_info": { 420 | "name": "julia", 421 | "version": "0.3.7" 422 | } 423 | }, 424 | "nbformat": 4, 425 | "nbformat_minor": 0 426 | } 427 | -------------------------------------------------------------------------------- /Convex/melbourne_temps.txt: -------------------------------------------------------------------------------- 1 | 20.7 2 | 17.9 3 | 18.8 4 | 14.6 5 | 15.8 6 | 15.8 7 | 15.8 8 | 17.4 9 | 21.8 10 | 20 11 | 16.2 12 | 13.3 13 | 16.7 14 | 21.5 15 | 25 16 | 20.7 17 | 20.6 18 | 24.8 19 | 17.7 20 | 15.5 21 | 18.2 22 | 12.1 23 | 14.4 24 | 16 25 | 16.5 26 | 18.7 27 | 19.4 28 | 17.2 29 | 15.5 30 | 15.1 31 | 15.4 32 | 15.3 33 | 18.8 34 | 21.9 35 | 19.9 36 | 16.6 37 | 16.8 38 | 14.6 39 | 17.1 40 | 25 41 | 15 42 | 13.7 43 | 13.9 44 | 18.3 45 | 22 46 | 22.1 47 | 21.2 48 | 18.4 49 | 16.6 50 | 16.1 51 | 15.7 52 | 16.6 53 | 16.5 54 | 14.4 55 | 14.4 56 | 18.5 57 | 16.9 58 | 17.5 59 | 21.2 60 | 17.8 61 | 18.6 62 | 17 63 | 16 64 | 13.3 65 | 14.3 66 | 11.4 67 | 16.3 68 | 16.1 69 | 11.8 70 | 12.2 71 | 14.7 72 | 11.8 73 | 11.3 74 | 10.6 75 | 11.7 76 | 14.2 77 | 11.2 78 | 16.9 79 | 16.7 80 | 8.1 81 | 8 82 | 8.8 83 | 13.4 84 | 10.9 85 | 13.4 86 | 11 87 | 15 88 | 15.7 89 | 14.5 90 | 15.8 91 | 16.7 92 | 16.8 93 | 17.5 94 | 17.1 95 | 18.1 96 | 16.6 97 | 10 98 | 14.9 99 | 15.9 100 | 13 101 | 7.6 102 | 11.5 103 | 13.5 104 | 13 105 | 13.3 106 | 12.1 107 | 12.4 108 | 13.2 109 | 13.8 110 | 10.6 111 | 9 112 | 10 113 | 9.8 114 | 11.5 115 | 8.9 116 | 7.4 117 | 9.9 118 | 9.3 119 | 9.9 120 | 7.4 121 | 8.6 122 | 11.9 123 | 14 124 | 8.6 125 | 10 126 | 13.5 127 | 12 128 | 10.5 129 | 10.7 130 | 8.1 131 | 10.1 132 | 10.6 133 | 5.3 134 | 6.6 135 | 8.5 136 | 11.2 137 | 9.8 138 | 5.9 139 | 3.2 140 | 2.1 141 | 3.4 142 | 5.4 143 | 9.6 144 | 11.5 145 | 12.3 146 | 12.6 147 | 11 148 | 11.2 149 | 11.4 150 | 11.8 151 | 12.8 152 | 11.6 153 | 10.6 154 | 9.8 155 | 11.2 156 | 5.7 157 | 7.1 158 | 2.5 159 | 3.5 160 | 4.6 161 | 11 162 | 5.7 163 | 7.7 164 | 10.4 165 | 11.4 166 | 9.2 167 | 6.1 168 | 2.7 169 | 4.3 170 | 6.3 171 | 3.8 172 | 4.4 173 | 7.1 174 | 4.8 175 | 5.8 176 | 6.2 177 | 7.3 178 | 9.2 179 | 10.2 180 | 9.5 181 | 9.5 182 | 10.7 183 | 10 184 | 6.5 185 | 7 186 | 7.4 187 | 8.1 188 | 6.6 189 | 8.3 190 | 8.9 191 | 4.6 192 | 6.8 193 | 5.7 194 | 6.1 195 | 7 196 | 7.2 197 | 6.3 198 | 8.8 199 | 5 200 | 7.4 201 | 10.1 202 | 12 203 | 9 204 | 8.9 205 | 9.8 206 | 9 207 | 9.2 208 | 7.7 209 | 8 210 | 6.1 211 | 3.5 212 | 3.2 213 | 5.7 214 | 7.7 215 | 9 216 | 10 217 | 6.2 218 | 6.9 219 | 6.5 220 | 6.8 221 | 7 222 | 5.2 223 | 3 224 | 5.6 225 | 7.9 226 | 9 227 | 8.6 228 | 10.3 229 | 10.5 230 | 7.6 231 | 9.7 232 | 12.5 233 | 7.4 234 | 7.9 235 | 3.9 236 | 6.6 237 | 4.6 238 | 7 239 | 6 240 | 5.5 241 | 8.1 242 | 5.5 243 | 6.2 244 | 8 245 | 10.3 246 | 9.8 247 | 9.6 248 | 8.5 249 | 7.5 250 | 11.2 251 | 14.6 252 | 11.7 253 | 7.8 254 | 12.3 255 | 10.1 256 | 11.5 257 | 7.3 258 | 10.9 259 | 14.1 260 | 10.7 261 | 16.9 262 | 10.5 263 | 6.5 264 | 11 265 | 6.3 266 | 10.5 267 | 7.2 268 | 7.6 269 | 10.7 270 | 7.8 271 | 9.6 272 | 11.4 273 | 12.4 274 | 8.9 275 | 13.2 276 | 8.6 277 | 6.2 278 | 11.4 279 | 13.2 280 | 14.3 281 | 7.3 282 | 12.9 283 | 7.8 284 | 6.2 285 | 5.6 286 | 10 287 | 13.3 288 | 8.3 289 | 10.2 290 | 8.6 291 | 7.3 292 | 10.4 293 | 11.2 294 | 13.2 295 | 11.4 296 | 9.1 297 | 6.6 298 | 8.4 299 | 9.7 300 | 13.2 301 | 12.5 302 | 11 303 | 11 304 | 11.7 305 | 9.2 306 | 11.5 307 | 13.6 308 | 13.7 309 | 10.4 310 | 11.5 311 | 7.6 312 | 9.6 313 | 14.2 314 | 15.7 315 | 10.5 316 | 10.5 317 | 9.7 318 | 9.5 319 | 11.3 320 | 8.9 321 | 9.4 322 | 11.9 323 | 11.7 324 | 13.4 325 | 12.6 326 | 10.1 327 | 15.8 328 | 13.6 329 | 11.9 330 | 9.9 331 | 12.6 332 | 17.8 333 | 15 334 | 13.6 335 | 13.4 336 | 10.5 337 | 14.2 338 | 11.5 339 | 13 340 | 15 341 | 14.7 342 | 12.6 343 | 12.5 344 | 13.5 345 | 14.8 346 | 17.2 347 | 9.7 348 | 12.1 349 | 12.8 350 | 11.2 351 | 16.4 352 | 15.6 353 | 13.3 354 | 11 355 | 11.1 356 | 15 357 | 12.8 358 | 15 359 | 14.2 360 | 14 361 | 15.5 362 | 13.3 363 | 15.6 364 | 15.2 365 | 17.4 366 | 17 367 | 15 368 | 13.5 369 | 15.2 370 | 13 371 | 12.5 372 | 14.1 373 | 14.8 374 | 16.2 375 | 15.8 376 | 19.1 377 | 22.2 378 | 15.9 379 | 13 380 | 14.1 381 | 15.8 382 | 24 383 | 18 384 | 19.7 385 | 25.2 386 | 20.5 387 | 19.3 388 | 15.8 389 | 17 390 | 18.4 391 | 13.3 392 | 14.6 393 | 12.5 394 | 17 395 | 17.1 396 | 14 397 | 14.6 398 | 13.3 399 | 14.8 400 | 15.1 401 | 13.1 402 | 13.6 403 | 19.5 404 | 22.7 405 | 17.2 406 | 13.5 407 | 15.4 408 | 17 409 | 19.2 410 | 22.8 411 | 26.3 412 | 18.2 413 | 17 414 | 14.8 415 | 12.8 416 | 15.5 417 | 15.6 418 | 13.1 419 | 15.2 420 | 14.1 421 | 12.5 422 | 14.6 423 | 10.4 424 | 13.9 425 | 11.9 426 | 13.5 427 | 9.8 428 | 14 429 | 21.5 430 | 19.5 431 | 16.7 432 | 19.1 433 | 11 434 | 9 435 | 10 436 | 14.6 437 | 12.5 438 | 17.2 439 | 19.2 440 | 22.2 441 | 15.7 442 | 14.2 443 | 9.8 444 | 14 445 | 17.5 446 | 20.7 447 | 15.6 448 | 13.2 449 | 14.5 450 | 16.8 451 | 17.2 452 | 13.4 453 | 14.2 454 | 14.3 455 | 10.2 456 | 10.4 457 | 12.3 458 | 11.9 459 | 11.2 460 | 8.5 461 | 12 462 | 12.4 463 | 12.9 464 | 10.1 465 | 15 466 | 13.6 467 | 12.4 468 | 13.6 469 | 16.1 470 | 19.5 471 | 14.2 472 | 9.3 473 | 10.1 474 | 7.4 475 | 8.6 476 | 7.8 477 | 9.1 478 | 13 479 | 16.5 480 | 12.9 481 | 6.9 482 | 6.9 483 | 8.7 484 | 10 485 | 10.8 486 | 7.5 487 | 6.3 488 | 11.9 489 | 13.8 490 | 11.8 491 | 11 492 | 10.1 493 | 8.5 494 | 5.5 495 | 7.6 496 | 8.7 497 | 10.8 498 | 11.2 499 | 9.1 500 | 3.7 501 | 4.6 502 | 6.6 503 | 13.2 504 | 15.2 505 | 7.6 506 | 8.4 507 | 6 508 | 8.3 509 | 8.6 510 | 11.1 511 | 12.1 512 | 12.9 513 | 14 514 | 12.5 515 | 11.5 516 | 7 517 | 7.1 518 | 9 519 | 3.1 520 | 2.5 521 | 0 522 | 1.6 523 | 2.6 524 | 5.7 525 | 2.3 526 | 4.5 527 | 8.2 528 | 6.9 529 | 7.3 530 | 6 531 | 7.3 532 | 7.6 533 | 8 534 | 8 535 | 6.8 536 | 7.3 537 | 6.2 538 | 6.9 539 | 8.9 540 | 4 541 | 1.3 542 | 0.8 543 | 4.3 544 | 7.3 545 | 7.7 546 | 9 547 | 4.2 548 | 1.6 549 | 2.6 550 | 3.4 551 | 3.9 552 | 7 553 | 7.8 554 | 5.3 555 | 2.4 556 | 2.8 557 | 4 558 | 7.5 559 | 7.8 560 | 5.6 561 | 3.3 562 | 5 563 | 3.7 564 | 3.9 565 | 5.2 566 | -0.2 567 | -0.8 568 | 0.9 569 | 3.5 570 | 6.6 571 | 9.5 572 | 9 573 | 3.5 574 | 4.5 575 | 5.7 576 | 5.6 577 | 7.1 578 | 9.7 579 | 8.3 580 | 9.1 581 | 2.8 582 | 2.2 583 | 4.5 584 | 3.8 585 | 3.8 586 | 6.2 587 | 11.5 588 | 10.2 589 | 7.9 590 | 9 591 | 9.5 592 | 6 593 | 8.2 594 | 9.2 595 | 4.3 596 | 6.6 597 | 9.4 598 | 13.2 599 | 6.6 600 | 5.1 601 | 12.1 602 | 11.2 603 | 8.5 604 | 4.6 605 | 7 606 | 14.2 607 | 12.7 608 | 7.6 609 | 4 610 | 10 611 | 10.5 612 | 5 613 | 4.5 614 | 8.2 615 | 4.3 616 | 9.8 617 | 5.8 618 | 5 619 | 8.5 620 | 9 621 | 3.6 622 | 6.7 623 | 6.7 624 | 10.1 625 | 15 626 | 8.9 627 | 5.7 628 | 4.2 629 | 4 630 | 5.3 631 | 6.3 632 | 8.5 633 | 11.5 634 | 7.7 635 | 9.2 636 | 7.8 637 | 6.3 638 | 6.3 639 | 8.6 640 | 6.1 641 | 13.2 642 | 9.9 643 | 4.7 644 | 5.8 645 | 14.9 646 | 10.7 647 | 8.6 648 | 9.4 649 | 5.7 650 | 10.9 651 | 13.1 652 | 10.4 653 | 8.2 654 | 9.8 655 | 7.5 656 | 5.8 657 | 9.8 658 | 7.9 659 | 8.7 660 | 10 661 | 10.6 662 | 8 663 | 10.2 664 | 15.1 665 | 13.9 666 | 9.2 667 | 9 668 | 13.2 669 | 7 670 | 10.6 671 | 6.9 672 | 9.5 673 | 12.5 674 | 13.6 675 | 17.7 676 | 16 677 | 11.3 678 | 10.5 679 | 14.4 680 | 10.3 681 | 9 682 | 11.1 683 | 14.5 684 | 18 685 | 12.8 686 | 10.7 687 | 9.1 688 | 8.7 689 | 12.4 690 | 12.6 691 | 10.3 692 | 13.7 693 | 16 694 | 15.8 695 | 12.1 696 | 12.5 697 | 12.2 698 | 13.7 699 | 16.1 700 | 15.5 701 | 10.3 702 | 10.5 703 | 11 704 | 11.9 705 | 13 706 | 12.2 707 | 10.6 708 | 13 709 | 13 710 | 12.2 711 | 12.6 712 | 18.7 713 | 15.2 714 | 15.3 715 | 13.9 716 | 15.8 717 | 13 718 | 13 719 | 13.7 720 | 12 721 | 10.8 722 | 15.6 723 | 15.3 724 | 13.9 725 | 13 726 | 15.3 727 | 16.3 728 | 15.8 729 | 17.7 730 | 16.3 731 | 18.4 732 | 15 733 | 10.9 734 | 11.4 735 | 14.8 736 | 12.1 737 | 12.8 738 | 16.2 739 | 15.5 740 | 13 741 | 10.5 742 | 9.1 743 | 10.5 744 | 11.8 745 | 12.7 746 | 12.7 747 | 11.5 748 | 13.8 749 | 13.3 750 | 11.6 751 | 15.4 752 | 12.4 753 | 16.9 754 | 14.7 755 | 10.6 756 | 15.6 757 | 10.7 758 | 12.6 759 | 13.8 760 | 14.3 761 | 14 762 | 18.1 763 | 17.3 764 | 13 765 | 16 766 | 14.9 767 | 16.2 768 | 20.3 769 | 22.5 770 | 17.2 771 | 15.9 772 | 16.8 773 | 13.8 774 | 12.8 775 | 14 776 | 17.5 777 | 21.5 778 | 16.8 779 | 13.6 780 | 14.5 781 | 14.2 782 | 15.7 783 | 19.7 784 | 17.4 785 | 14.4 786 | 16.9 787 | 19.1 788 | 20.4 789 | 20.1 790 | 19.9 791 | 22 792 | 20.5 793 | 22.1 794 | 20.6 795 | 15 796 | 20.6 797 | 21.5 798 | 16.2 799 | 14.1 800 | 14.5 801 | 21.1 802 | 15.9 803 | 15.2 804 | 13.1 805 | 13.2 806 | 12.5 807 | 15.2 808 | 17.6 809 | 15.5 810 | 16.7 811 | 16.3 812 | 15.1 813 | 12.7 814 | 10 815 | 11.4 816 | 12.6 817 | 10.7 818 | 10 819 | 13.9 820 | 13.4 821 | 12.5 822 | 12.8 823 | 7.8 824 | 11.1 825 | 10.7 826 | 7.1 827 | 6.7 828 | 5.7 829 | 9.1 830 | 15.2 831 | 15.5 832 | 11.1 833 | 11.7 834 | 11.5 835 | 9.8 836 | 6.2 837 | 6.7 838 | 7.5 839 | 8.8 840 | 8 841 | 10.4 842 | 14.5 843 | 16.5 844 | 14.1 845 | 10.5 846 | 12.6 847 | 13 848 | 8.7 849 | 10.1 850 | 12 851 | 12.5 852 | 13.5 853 | 13.7 854 | 13.5 855 | 10.7 856 | 13 857 | 11.6 858 | 13 859 | 11.2 860 | 13.5 861 | 12.9 862 | 6.8 863 | 10 864 | 14.5 865 | 11.7 866 | 6.7 867 | 4.6 868 | 4.9 869 | 7.4 870 | 8.3 871 | 7.5 872 | 6.2 873 | 7.8 874 | 13.2 875 | 11.9 876 | 6.5 877 | 8.3 878 | 12.1 879 | 9.3 880 | 7.5 881 | 9.3 882 | 11 883 | 10.8 884 | 5.3 885 | 7.6 886 | 5.6 887 | 7.2 888 | 9.6 889 | 7 890 | 8.3 891 | 7.8 892 | 4.7 893 | 6.8 894 | 7.2 895 | 8.3 896 | 9.5 897 | 4.7 898 | 3 899 | 1.5 900 | 2.5 901 | 6.2 902 | 11.6 903 | 6.6 904 | 6.6 905 | 8 906 | 7.9 907 | 3.3 908 | 3.9 909 | 6 910 | 4 911 | 5.5 912 | 8.5 913 | 9.8 914 | 9.5 915 | 7.2 916 | 8.1 917 | 8 918 | 8.5 919 | 8.8 920 | 8.3 921 | 2.4 922 | 4.9 923 | 5.9 924 | 6.7 925 | 8.4 926 | 6.5 927 | 7.9 928 | 4.1 929 | 5.4 930 | 7.5 931 | 3.9 932 | 2.5 933 | 5.3 934 | 6.6 935 | 0 936 | 0.7 937 | 7.6 938 | 12.3 939 | 9.2 940 | 9.6 941 | 9.5 942 | 10 943 | 7.7 944 | 8 945 | 8.3 946 | 8.3 947 | 4.5 948 | 6.5 949 | 9.4 950 | 9.4 951 | 10.5 952 | 10.7 953 | 9.9 954 | 7.6 955 | 5.8 956 | 8.5 957 | 13.8 958 | 14.3 959 | 8.3 960 | 5.3 961 | 3 962 | 5.2 963 | 10.3 964 | 11.1 965 | 10.5 966 | 9 967 | 13 968 | 6.4 969 | 8.4 970 | 6.7 971 | 8.3 972 | 11.2 973 | 10 974 | 10.1 975 | 10.6 976 | 10.9 977 | 5.7 978 | 9.5 979 | 10.4 980 | 11.1 981 | 12.2 982 | 10.6 983 | 8.8 984 | 9.2 985 | 5.5 986 | 7.1 987 | 6.5 988 | 4.3 989 | 5 990 | 11.2 991 | 7.5 992 | 12 993 | 13.6 994 | 8.3 995 | 8.5 996 | 12.9 997 | 7.7 998 | 7.6 999 | 3.5 1000 | 10.4 1001 | 15.4 1002 | 10.6 1003 | 9.6 1004 | 9.3 1005 | 13.9 1006 | 7.7 1007 | 9.5 1008 | 7.6 1009 | 6.9 1010 | 6.8 1011 | 5.8 1012 | 6 1013 | 8.3 1014 | 9.1 1015 | 12.5 1016 | 13.2 1017 | 16.2 1018 | 12.5 1019 | 11.8 1020 | 10.6 1021 | 10 1022 | 12.2 1023 | 8.9 1024 | 10.3 1025 | 7.5 1026 | 11.6 1027 | 12.6 1028 | 12.9 1029 | 11.7 1030 | 14 1031 | 12.3 1032 | 9 1033 | 9.2 1034 | 9.8 1035 | 11.8 1036 | 10.6 1037 | 12.6 1038 | 11 1039 | 8.2 1040 | 7.5 1041 | 13.6 1042 | 14.8 1043 | 10.9 1044 | 7.7 1045 | 10.2 1046 | 10.8 1047 | 10.8 1048 | 12.5 1049 | 13.2 1050 | 8.7 1051 | 5.7 1052 | 9.8 1053 | 7.3 1054 | 10.8 1055 | 10 1056 | 16.2 1057 | 15 1058 | 14.5 1059 | 15.9 1060 | 14.9 1061 | 14.2 1062 | 15.8 1063 | 17.2 1064 | 17.6 1065 | 12.1 1066 | 11.4 1067 | 13 1068 | 13.2 1069 | 12 1070 | 15.3 1071 | 12.7 1072 | 12.1 1073 | 13.8 1074 | 10.9 1075 | 12 1076 | 16.5 1077 | 15 1078 | 11.2 1079 | 13.9 1080 | 15 1081 | 14.8 1082 | 15 1083 | 13.3 1084 | 20.4 1085 | 18 1086 | 12.2 1087 | 16.7 1088 | 13.8 1089 | 17.5 1090 | 15 1091 | 13.9 1092 | 11.1 1093 | 16.1 1094 | 20.4 1095 | 18 1096 | 19.5 1097 | 17.1 1098 | 17.1 1099 | 12 1100 | 11 1101 | 16.3 1102 | 16.1 1103 | 13 1104 | 13.4 1105 | 15.2 1106 | 12.5 1107 | 14.3 1108 | 16.5 1109 | 18.6 1110 | 18 1111 | 18.2 1112 | 11.4 1113 | 11.9 1114 | 12.2 1115 | 14.8 1116 | 13.1 1117 | 12.7 1118 | 10.5 1119 | 13.8 1120 | 18.8 1121 | 13.9 1122 | 11.2 1123 | 10.6 1124 | 14.7 1125 | 13.1 1126 | 12.1 1127 | 14.7 1128 | 11.1 1129 | 13 1130 | 15.6 1131 | 14.2 1132 | 15.5 1133 | 18 1134 | 15 1135 | 15.9 1136 | 15.5 1137 | 15.8 1138 | 16.6 1139 | 13.6 1140 | 13.8 1141 | 14.6 1142 | 15.6 1143 | 16.6 1144 | 14.3 1145 | 16.3 1146 | 18.9 1147 | 18.7 1148 | 14.5 1149 | 16.5 1150 | 14.1 1151 | 13.5 1152 | 11.7 1153 | 15.1 1154 | 11.2 1155 | 12.6 1156 | 8.8 1157 | 10.5 1158 | 12.1 1159 | 14.5 1160 | 19.5 1161 | 14 1162 | 13.8 1163 | 10.5 1164 | 13.8 1165 | 11.4 1166 | 15.6 1167 | 11.1 1168 | 12.1 1169 | 14.2 1170 | 10.9 1171 | 14.2 1172 | 13.8 1173 | 15.1 1174 | 14 1175 | 12.1 1176 | 13.8 1177 | 16.6 1178 | 17.8 1179 | 9.4 1180 | 10.2 1181 | 7.4 1182 | 8.7 1183 | 14 1184 | 15.3 1185 | 11.1 1186 | 9.7 1187 | 10.3 1188 | 9.2 1189 | 8.2 1190 | 9.7 1191 | 12.4 1192 | 12.5 1193 | 9 1194 | 9.7 1195 | 10.1 1196 | 11.2 1197 | 12 1198 | 11.1 1199 | 10.8 1200 | 12.8 1201 | 9.8 1202 | 13.7 1203 | 11 1204 | 13.2 1205 | 13 1206 | 10.2 1207 | 13.2 1208 | 9.3 1209 | 11.1 1210 | 10.3 1211 | 8.7 1212 | 11.7 1213 | 12.5 1214 | 6.5 1215 | 9.6 1216 | 13.8 1217 | 14.7 1218 | 9.1 1219 | 4.8 1220 | 3.3 1221 | 3.5 1222 | 5.7 1223 | 5.5 1224 | 7 1225 | 9.5 1226 | 9.9 1227 | 4.9 1228 | 6.3 1229 | 4.8 1230 | 6.2 1231 | 7.1 1232 | 7.5 1233 | 9.4 1234 | 8.7 1235 | 9.5 1236 | 12.1 1237 | 9.5 1238 | 9.3 1239 | 8.5 1240 | 8 1241 | 9.8 1242 | 6.2 1243 | 7.3 1244 | 10.9 1245 | 10 1246 | 8.7 1247 | 9 1248 | 10.8 1249 | 12.4 1250 | 7.2 1251 | 7.2 1252 | 11.1 1253 | 9.3 1254 | 10.1 1255 | 3.9 1256 | 5 1257 | 8.2 1258 | 2.8 1259 | 4.3 1260 | 8.1 1261 | 11.1 1262 | 4.7 1263 | 5.3 1264 | 10 1265 | 5.6 1266 | 2.2 1267 | 7.1 1268 | 8.3 1269 | 8.6 1270 | 10.1 1271 | 8.3 1272 | 7.2 1273 | 7.7 1274 | 7.8 1275 | 9.1 1276 | 9.4 1277 | 7.8 1278 | 2.6 1279 | 2.4 1280 | 3.9 1281 | 1.3 1282 | 2.1 1283 | 7.4 1284 | 7.2 1285 | 8.8 1286 | 8.9 1287 | 8.8 1288 | 8 1289 | 0.7 1290 | -0.1 1291 | 0.9 1292 | 7.8 1293 | 7.2 1294 | 8 1295 | 4.6 1296 | 5.2 1297 | 5.8 1298 | 6.8 1299 | 8.1 1300 | 7.5 1301 | 5.4 1302 | 4.6 1303 | 6.4 1304 | 9.7 1305 | 7 1306 | 10 1307 | 10.6 1308 | 11.5 1309 | 10.2 1310 | 11.1 1311 | 11 1312 | 8.9 1313 | 9.9 1314 | 11.7 1315 | 11.6 1316 | 9 1317 | 6.3 1318 | 8.7 1319 | 8.5 1320 | 8.5 1321 | 8 1322 | 6 1323 | 8 1324 | 8.5 1325 | 7.7 1326 | 8.4 1327 | 9 1328 | 8.3 1329 | 6.8 1330 | 9.3 1331 | 6.7 1332 | 9 1333 | 7.3 1334 | 6.3 1335 | 7.9 1336 | 5.2 1337 | 9 1338 | 11.3 1339 | 9.2 1340 | 11.3 1341 | 7 1342 | 8 1343 | 4.6 1344 | 8.5 1345 | 9.5 1346 | 9.4 1347 | 10.5 1348 | 9.7 1349 | 4.9 1350 | 8 1351 | 5.8 1352 | 5.5 1353 | 10.9 1354 | 11.7 1355 | 9.2 1356 | 8.9 1357 | 11.3 1358 | 8.6 1359 | 6.2 1360 | 6.6 1361 | 9.1 1362 | 6.1 1363 | 7.5 1364 | 10.7 1365 | 6.3 1366 | 5.5 1367 | 6.7 1368 | 4.2 1369 | 11.3 1370 | 16.3 1371 | 10.5 1372 | 10.3 1373 | 7.9 1374 | 7.7 1375 | 16 1376 | 14.6 1377 | 12.5 1378 | 8.1 1379 | 12.2 1380 | 17.2 1381 | 9.4 1382 | 8.7 1383 | 5.9 1384 | 4.8 1385 | 7.4 1386 | 9.4 1387 | 9.7 1388 | 9.9 1389 | 6.5 1390 | 9.8 1391 | 18.2 1392 | 11.3 1393 | 9.1 1394 | 9.6 1395 | 13.5 1396 | 10.7 1397 | 10 1398 | 8.5 1399 | 12.6 1400 | 16.6 1401 | 11.6 1402 | 12.2 1403 | 11.2 1404 | 9.2 1405 | 9.9 1406 | 11.9 1407 | 15.6 1408 | 19 1409 | 12.8 1410 | 12.2 1411 | 12 1412 | 11.1 1413 | 11.8 1414 | 7.6 1415 | 13 1416 | 12.7 1417 | 16 1418 | 14.8 1419 | 14.2 1420 | 10 1421 | 8.8 1422 | 11.6 1423 | 8.6 1424 | 14.6 1425 | 24.3 1426 | 11.6 1427 | 10.8 1428 | 12 1429 | 11 1430 | 12.6 1431 | 10.8 1432 | 9.1 1433 | 11 1434 | 13 1435 | 12.8 1436 | 9.9 1437 | 11.6 1438 | 10.5 1439 | 15.9 1440 | 12.2 1441 | 13 1442 | 12.5 1443 | 12.5 1444 | 11.4 1445 | 12.1 1446 | 16.8 1447 | 12.1 1448 | 11.3 1449 | 10.4 1450 | 14.2 1451 | 11.4 1452 | 13.7 1453 | 16.5 1454 | 12.8 1455 | 12.2 1456 | 12 1457 | 12.6 1458 | 16 1459 | 16.4 1460 | 13.3 1461 | 15.2 1462 | 13.1 1463 | 12.7 1464 | 14.6 1465 | 11 1466 | 13.2 1467 | 12.2 1468 | 14.4 1469 | 13.7 1470 | 14.5 1471 | 14.1 1472 | 14.4 1473 | 19.7 1474 | 16.5 1475 | 15.9 1476 | 11.8 1477 | 12 1478 | 11.4 1479 | 14.4 1480 | 12.4 1481 | 15.1 1482 | 15.6 1483 | 15.2 1484 | 12.8 1485 | 13.3 1486 | 17.5 1487 | 15.4 1488 | 13.5 1489 | 16.7 1490 | 15.2 1491 | 14.9 1492 | 10.2 1493 | 13.6 1494 | 19 1495 | 15.7 1496 | 18 1497 | 14.8 1498 | 13.9 1499 | 13 1500 | 15.3 1501 | 14.3 1502 | 15.6 1503 | 16 1504 | 14.9 1505 | 11.1 1506 | 14.8 1507 | 13 1508 | 12.2 1509 | 10.9 1510 | 14.6 1511 | 16.6 1512 | 18.1 1513 | 13.4 1514 | 10.3 1515 | 13.6 1516 | 13.8 1517 | 10.3 1518 | 11 1519 | 14.3 1520 | 15.5 1521 | 14.7 1522 | 12.7 1523 | 10.7 1524 | 12.6 1525 | 9.8 1526 | 13.2 1527 | 15.2 1528 | 16.6 1529 | 21 1530 | 22.4 1531 | 17 1532 | 21.7 1533 | 21.4 1534 | 18.6 1535 | 16.2 1536 | 16.8 1537 | 17 1538 | 18.4 1539 | 17.2 1540 | 18.4 1541 | 18.8 1542 | 16.5 1543 | 13.3 1544 | 12.2 1545 | 11.3 1546 | 13.8 1547 | 16.6 1548 | 14 1549 | 14.3 1550 | 16.4 1551 | 11.9 1552 | 15.7 1553 | 17.6 1554 | 17.5 1555 | 15.9 1556 | 16.2 1557 | 16 1558 | 15.9 1559 | 16.2 1560 | 16.2 1561 | 19.5 1562 | 18.2 1563 | 21.8 1564 | 15.1 1565 | 11 1566 | 8.1 1567 | 9.5 1568 | 9.3 1569 | 10.6 1570 | 6.3 1571 | 8.6 1572 | 6.8 1573 | 8.7 1574 | 8.4 1575 | 9.3 1576 | 10 1577 | 10.5 1578 | 12 1579 | 10.1 1580 | 9.4 1581 | 10.1 1582 | 8 1583 | 10.6 1584 | 13.6 1585 | 15.4 1586 | 9 1587 | 10.4 1588 | 11 1589 | 12.1 1590 | 13.4 1591 | 11.3 1592 | 6.7 1593 | 9.8 1594 | 10.8 1595 | 7.8 1596 | 4.5 1597 | 7.6 1598 | 6.9 1599 | 7.5 1600 | 8.5 1601 | 5.5 1602 | 9.5 1603 | 7.3 1604 | 5.4 1605 | 5.5 1606 | 8.1 1607 | 11.2 1608 | 13.4 1609 | 11.6 1610 | 10.1 1611 | 4.3 1612 | 5.5 1613 | 4.4 1614 | 5.9 1615 | 5.7 1616 | 8.2 1617 | 8.2 1618 | 4.2 1619 | 6.5 1620 | 10 1621 | 8.8 1622 | 6.6 1623 | 7.8 1624 | 10.1 1625 | 7.1 1626 | 7.7 1627 | 8.5 1628 | 7.3 1629 | 6.9 1630 | 8.4 1631 | 7.1 1632 | 6.3 1633 | 0.6 1634 | 1.6 1635 | 7 1636 | 8.3 1637 | 8 1638 | 10.2 1639 | 10.6 1640 | 10.4 1641 | 11.6 1642 | 11 1643 | 10.7 1644 | 7.3 1645 | 4.2 1646 | 4.7 1647 | 5.6 1648 | 7.7 1649 | 7.5 1650 | 4.9 1651 | 5.9 1652 | 7.8 1653 | 5.8 1654 | 7 1655 | 8.4 1656 | 6.2 1657 | 7.5 1658 | 4.8 1659 | 3.3 1660 | 3.2 1661 | 7 1662 | 8.4 1663 | 0.3 1664 | 0.3 1665 | 2.1 1666 | 8.5 1667 | 1.4 1668 | 4.1 1669 | 10.3 1670 | 6.6 1671 | 6.1 1672 | 7 1673 | 5.1 1674 | 6.3 1675 | 6.9 1676 | 11.4 1677 | 10.4 1678 | 10.3 1679 | 9.2 1680 | 7.2 1681 | 7.5 1682 | 4 1683 | 5.6 1684 | 6.7 1685 | 8.4 1686 | 11 1687 | 8.4 1688 | 8.8 1689 | 8.6 1690 | 8.3 1691 | 4 1692 | 3.6 1693 | 5.7 1694 | 10.6 1695 | 6.9 1696 | 10 1697 | 9.8 1698 | 7.2 1699 | 10.5 1700 | 3.6 1701 | 5.3 1702 | 8.4 1703 | 10.3 1704 | 7.9 1705 | 8.5 1706 | 7.9 1707 | 8 1708 | 9.8 1709 | 6.7 1710 | 4.8 1711 | 9.9 1712 | 12.8 1713 | 10.9 1714 | 11.7 1715 | 11.7 1716 | 11 1717 | 8.2 1718 | 7.5 1719 | 5.4 1720 | 7.2 1721 | 9.7 1722 | 8.4 1723 | 9 1724 | 8.7 1725 | 6.6 1726 | 11.6 1727 | 13.1 1728 | 6.7 1729 | 6.5 1730 | 7.7 1731 | 8.7 1732 | 7.2 1733 | 10.5 1734 | 8.6 1735 | 7.2 1736 | 11.4 1737 | 16.2 1738 | 6.1 1739 | 9.6 1740 | 11.1 1741 | 13.6 1742 | 10.7 1743 | 14.7 1744 | 11.6 1745 | 7.3 1746 | 8 1747 | 9.6 1748 | 16 1749 | 15.1 1750 | 12.8 1751 | 6.2 1752 | 7.1 1753 | 8.4 1754 | 10 1755 | 12.7 1756 | 10 1757 | 10.2 1758 | 6.5 1759 | 9.2 1760 | 11.9 1761 | 14.7 1762 | 11.4 1763 | 6.8 1764 | 7.4 1765 | 11.2 1766 | 9.2 1767 | 12.6 1768 | 16 1769 | 17.1 1770 | 15.3 1771 | 13.3 1772 | 15.4 1773 | 13.2 1774 | 14.4 1775 | 14 1776 | 15.5 1777 | 21 1778 | 10 1779 | 9.6 1780 | 12 1781 | 12.2 1782 | 11.3 1783 | 13.2 1784 | 10.5 1785 | 10.1 1786 | 8.8 1787 | 13.7 1788 | 16.2 1789 | 16 1790 | 14 1791 | 13.7 1792 | 12.5 1793 | 12.8 1794 | 12.3 1795 | 15.2 1796 | 15 1797 | 16.4 1798 | 16.1 1799 | 14.6 1800 | 18.2 1801 | 16.4 1802 | 16.6 1803 | 14.7 1804 | 15.8 1805 | 14.1 1806 | 13.5 1807 | 13.6 1808 | 13.7 1809 | 13.6 1810 | 12.1 1811 | 12.7 1812 | 13.3 1813 | 14.2 1814 | 15 1815 | 13.7 1816 | 12 1817 | 13.1 1818 | 13.2 1819 | 13.3 1820 | 11.5 1821 | 10.8 1822 | 12 1823 | 16.3 1824 | 14.4 1825 | 12.9 1826 | 13.8 1827 | 10.6 1828 | 12.6 1829 | 13.7 1830 | 12.6 1831 | 13.1 1832 | 15.4 1833 | 11.9 1834 | 13.8 1835 | 14.4 1836 | 15.2 1837 | 12.5 1838 | 12.2 1839 | 16.1 1840 | 14.6 1841 | 11.6 1842 | 13.1 1843 | 12.8 1844 | 15.2 1845 | 13.8 1846 | 15 1847 | 13.5 1848 | 11.8 1849 | 15.3 1850 | 13.5 1851 | 15.3 1852 | 13.8 1853 | 15.8 1854 | 17.4 1855 | 15.3 1856 | 14.6 1857 | 14.8 1858 | 10.7 1859 | 11.6 1860 | 13.6 1861 | 14.4 1862 | 11.8 1863 | 15.8 1864 | 16 1865 | 11.8 1866 | 14.5 1867 | 10.7 1868 | 14.2 1869 | 19.5 1870 | 21.4 1871 | 17.9 1872 | 17.4 1873 | 12.7 1874 | 13.8 1875 | 14 1876 | 15 1877 | 14.5 1878 | 13.1 1879 | 11.4 1880 | 12.5 1881 | 12 1882 | 13.4 1883 | 14.4 1884 | 17.7 1885 | 13.9 1886 | 13.3 1887 | 14.6 1888 | 16.4 1889 | 16.8 1890 | 20 1891 | 12.5 1892 | 12.7 1893 | 11.7 1894 | 12.7 1895 | 8.6 1896 | 11.9 1897 | 16 1898 | 15.2 1899 | 13.4 1900 | 11.6 1901 | 11.1 1902 | 15.6 1903 | 17 1904 | 18.5 1905 | 17.4 1906 | 16.5 1907 | 16.2 1908 | 16.1 1909 | 13.2 1910 | 18 1911 | 12.8 1912 | 11.7 1913 | 16.7 1914 | 15.6 1915 | 10.2 1916 | 10.3 1917 | 15 1918 | 18 1919 | 13.8 1920 | 10.5 1921 | 11.8 1922 | 7.2 1923 | 11.6 1924 | 7.4 1925 | 14.2 1926 | 12.2 1927 | 9 1928 | 12.3 1929 | 19.7 1930 | 12.8 1931 | 12.4 1932 | 12 1933 | 12 1934 | 11.1 1935 | 12.7 1936 | 14.2 1937 | 11.6 1938 | 12 1939 | 11.5 1940 | 8.3 1941 | 10.5 1942 | 9 1943 | 6.9 1944 | 9.4 1945 | 11.1 1946 | 9.1 1947 | 7.7 1948 | 10 1949 | 10.4 1950 | 8 1951 | 9.8 1952 | 12.4 1953 | 12.9 1954 | 12.3 1955 | 6.9 1956 | 10.5 1957 | 11 1958 | 9.7 1959 | 11.1 1960 | 11.5 1961 | 13.4 1962 | 10.9 1963 | 12 1964 | 12.1 1965 | 10.4 1966 | 10 1967 | 9.6 1968 | 11.3 1969 | 8.5 1970 | 6.3 1971 | 8.2 1972 | 10.7 1973 | 10.3 1974 | 9.5 1975 | 10.9 1976 | 10.9 1977 | 4.3 1978 | 5.2 1979 | 11 1980 | 11.6 1981 | 10.6 1982 | 9.4 1983 | 10 1984 | 9.6 1985 | 9.5 1986 | 9.7 1987 | 9.6 1988 | 7 1989 | 7 1990 | 6.8 1991 | 6.9 1992 | 8 1993 | 7.6 1994 | 8.6 1995 | 5.7 1996 | 5.5 1997 | 5.7 1998 | 5.7 1999 | 6.6 2000 | 6 2001 | 6.9 2002 | 7.7 2003 | 8 2004 | 3.9 2005 | 0.8 2006 | 2.8 2007 | 8 2008 | 9.8 2009 | 11.4 2010 | 8.6 2011 | 5.2 2012 | 6.6 2013 | 5.7 2014 | 4.6 2015 | 5.8 2016 | 7 2017 | 4.8 2018 | 4.4 2019 | 4.4 2020 | 7.9 2021 | 10.6 2022 | 5 2023 | 7.6 2024 | 9.2 2025 | 9.7 2026 | 8.8 2027 | 6.8 2028 | 9.4 2029 | 11 2030 | 2.5 2031 | 2.1 2032 | 5.4 2033 | 6.2 2034 | 7.8 2035 | 7.4 2036 | 9.3 2037 | 9.3 2038 | 9.5 2039 | 8.5 2040 | 10 2041 | 7.7 2042 | 9.3 2043 | 9.1 2044 | 3.5 2045 | 3.6 2046 | 2.5 2047 | 1.7 2048 | 2.7 2049 | 2.9 2050 | 5.3 2051 | 7.7 2052 | 9.1 2053 | 9.4 2054 | 7.3 2055 | 8.4 2056 | 9.2 2057 | 6.6 2058 | 9.7 2059 | 12.4 2060 | 10.2 2061 | 5.9 2062 | 7.1 2063 | 7.5 2064 | 9.7 2065 | 12.2 2066 | 5.6 2067 | 5.4 2068 | 8.3 2069 | 10.6 2070 | 9.1 2071 | 11.3 2072 | 10.9 2073 | 8.9 2074 | 6.3 2075 | 9 2076 | 6.1 2077 | 9.1 2078 | 9.6 2079 | 6 2080 | 10 2081 | 11 2082 | 6.2 2083 | 8.3 2084 | 11.3 2085 | 11.3 2086 | 6.7 2087 | 6.6 2088 | 11.4 2089 | 6.9 2090 | 10.6 2091 | 8.6 2092 | 11.3 2093 | 12.5 2094 | 9.9 2095 | 6.9 2096 | 5.5 2097 | 7.8 2098 | 11 2099 | 16.2 2100 | 9.9 2101 | 8.7 2102 | 10.5 2103 | 12.2 2104 | 10.6 2105 | 8.3 2106 | 5.5 2107 | 9 2108 | 6.4 2109 | 7.2 2110 | 12.9 2111 | 12 2112 | 7.3 2113 | 9.7 2114 | 8.4 2115 | 14.7 2116 | 9.5 2117 | 7.9 2118 | 6.8 2119 | 12.6 2120 | 5.2 2121 | 7.5 2122 | 8.7 2123 | 7.6 2124 | 9 2125 | 7.2 2126 | 10.7 2127 | 13.1 2128 | 13.9 2129 | 10.8 2130 | 10.4 2131 | 9.1 2132 | 16 2133 | 21 2134 | 16.2 2135 | 8.6 2136 | 9.2 2137 | 12.5 2138 | 9.7 2139 | 12.5 2140 | 10.3 2141 | 12 2142 | 11 2143 | 14.8 2144 | 15 2145 | 15.3 2146 | 10.3 2147 | 10.7 2148 | 10.5 2149 | 8.9 2150 | 8.1 2151 | 11.5 2152 | 12.8 2153 | 9.1 2154 | 14.6 2155 | 11.6 2156 | 11.2 2157 | 12.6 2158 | 7.5 2159 | 11 2160 | 14.5 2161 | 18.5 2162 | 15.4 2163 | 13.1 2164 | 16.3 2165 | 20.2 2166 | 11.5 2167 | 12.4 2168 | 10.9 2169 | 12.7 2170 | 12.2 2171 | 12.4 2172 | 9.8 2173 | 8.5 2174 | 14.7 2175 | 12 2176 | 10.3 2177 | 11 2178 | 10.2 2179 | 12.6 2180 | 11.6 2181 | 9.7 2182 | 13.4 2183 | 10.5 2184 | 14.7 2185 | 14.6 2186 | 14.2 2187 | 13.2 2188 | 11.7 2189 | 17.2 2190 | 12.3 2191 | 13.8 2192 | 15.3 2193 | 15.6 2194 | 16.2 2195 | 16.3 2196 | 16.8 2197 | 11 2198 | 8.5 2199 | 13.2 2200 | 13 2201 | 12.4 2202 | 13 2203 | 16.6 2204 | 12 2205 | 12.4 2206 | 15 2207 | 11.8 2208 | 11.6 2209 | 12.2 2210 | 13.7 2211 | 11.2 2212 | 12.4 2213 | 11.5 2214 | 13.8 2215 | 15.7 2216 | 12.9 2217 | 11.5 2218 | 11 2219 | 12.7 2220 | 14.9 2221 | 16.5 2222 | 12.8 2223 | 12.7 2224 | 12.7 2225 | 11.6 2226 | 13.3 2227 | 15.2 2228 | 16.4 2229 | 11.9 2230 | 15.1 2231 | 10.6 2232 | 13.6 2233 | 12.1 2234 | 16 2235 | 16.8 2236 | 16.6 2237 | 15.6 2238 | 15.2 2239 | 17.7 2240 | 21 2241 | 13.4 2242 | 10.5 2243 | 9.5 2244 | 12 2245 | 10.4 2246 | 11.5 2247 | 13.2 2248 | 15 2249 | 14.1 2250 | 12.4 2251 | 13.4 2252 | 12.5 2253 | 14.3 2254 | 17.6 2255 | 10.4 2256 | 9.9 2257 | 10.2 2258 | 11.3 2259 | 9.5 2260 | 11.8 2261 | 11.5 2262 | 10.5 2263 | 10.8 2264 | 13 2265 | 18.5 2266 | 18.7 2267 | 15 2268 | 13 2269 | 11.3 2270 | 13 2271 | 13.3 2272 | 11 2273 | 10.3 2274 | 13 2275 | 12.3 2276 | 15.6 2277 | 10.2 2278 | 10.8 2279 | 12 2280 | 13.3 2281 | 11.7 2282 | 12.5 2283 | 13.7 2284 | 14.9 2285 | 20.2 2286 | 16.3 2287 | 13.9 2288 | 10.1 2289 | 7.3 2290 | 14 2291 | 17.7 2292 | 16.3 2293 | 10.6 2294 | 9.7 2295 | 7.8 2296 | 10.4 2297 | 10.4 2298 | 14.1 2299 | 7.1 2300 | 8.1 2301 | 7.8 2302 | 10.6 2303 | 9.1 2304 | 9 2305 | 11.9 2306 | 17.1 2307 | 16.8 2308 | 13.5 2309 | 11.6 2310 | 7 2311 | 9.7 2312 | 9.9 2313 | 11.2 2314 | 11.3 2315 | 11.8 2316 | 9.9 2317 | 7.1 2318 | 9.6 2319 | 9.8 2320 | 10.6 2321 | 12.8 2322 | 16.5 2323 | 11.7 2324 | 12.3 2325 | 12.2 2326 | 11.8 2327 | 10.7 2328 | 10.2 2329 | 10 2330 | 8.3 2331 | 6.6 2332 | 9.5 2333 | 12.3 2334 | 7.6 2335 | 9.3 2336 | 5 2337 | 4.3 2338 | 6.4 2339 | 10.8 2340 | 7.8 2341 | 8.5 2342 | 9.7 2343 | 10 2344 | 11 2345 | 10.2 2346 | 6.6 2347 | 6.1 2348 | 5.9 2349 | 8.9 2350 | 13 2351 | 12.6 2352 | 5.4 2353 | 6 2354 | 7.8 2355 | 9 2356 | 4.2 2357 | 3 2358 | 4.5 2359 | 6.2 2360 | 11.9 2361 | 11.8 2362 | 9.4 2363 | 9.6 2364 | 9.4 2365 | 7 2366 | 8.9 2367 | 9.3 2368 | 6.8 2369 | 7.5 2370 | 8 2371 | 8.3 2372 | 2.7 2373 | 3.9 2374 | 4.1 2375 | 5 2376 | 5.8 2377 | 4.4 2378 | 4.1 2379 | 5.8 2380 | 9.1 2381 | 7.9 2382 | 5 2383 | 2.8 2384 | 4.7 2385 | 8.9 2386 | 5.4 2387 | 7.1 2388 | 9 2389 | 9.4 2390 | 6.3 2391 | 7 2392 | 6.4 2393 | 6.7 2394 | 1.5 2395 | 2.9 2396 | 4.8 2397 | 6.3 2398 | 5.7 2399 | 7 2400 | 8.8 2401 | 8.7 2402 | 9 2403 | 9.6 2404 | 8 2405 | 8.4 2406 | 8.1 2407 | 9 2408 | 5.3 2409 | 8.9 2410 | 8.7 2411 | 4.9 2412 | 7 2413 | 7.5 2414 | 7 2415 | 9.1 2416 | 11.8 2417 | 9.9 2418 | 5.6 2419 | 4.2 2420 | 4.3 2421 | 8 2422 | 5.1 2423 | 9.4 2424 | 9.1 2425 | 9.7 2426 | 10.6 2427 | 8.6 2428 | 10.1 2429 | 11 2430 | 9.7 2431 | 5 2432 | 6.1 2433 | 5.4 2434 | 5.8 2435 | 7.3 2436 | 6.3 2437 | 4.8 2438 | 7.6 2439 | 8.1 2440 | 9.5 2441 | 10.3 2442 | 7 2443 | 9 2444 | 10.2 2445 | 6.8 2446 | 9.3 2447 | 9.8 2448 | 10.7 2449 | 7.8 2450 | 9.2 2451 | 15 2452 | 7.8 2453 | 5.3 2454 | 9.5 2455 | 7.6 2456 | 14 2457 | 14.9 2458 | 14.9 2459 | 19.2 2460 | 17 2461 | 13 2462 | 11.2 2463 | 9.5 2464 | 10.3 2465 | 9.3 2466 | 11.3 2467 | 6.5 2468 | 12 2469 | 8.3 2470 | 8.7 2471 | 8.7 2472 | 10.2 2473 | 6.9 2474 | 4.9 2475 | 10 2476 | 7.6 2477 | 14.5 2478 | 13.2 2479 | 9.9 2480 | 10.1 2481 | 11.3 2482 | 10.4 2483 | 10.9 2484 | 9.2 2485 | 10.5 2486 | 11.4 2487 | 13.5 2488 | 9.8 2489 | 13.1 2490 | 9.7 2491 | 11.4 2492 | 9.9 2493 | 14.4 2494 | 19 2495 | 23 2496 | 15.4 2497 | 9.6 2498 | 10.8 2499 | 12.1 2500 | 11 2501 | 12.6 2502 | 14.7 2503 | 11.1 2504 | 10.1 2505 | 11.4 2506 | 13 2507 | 11.9 2508 | 9.5 2509 | 13.5 2510 | 15.2 2511 | 18.4 2512 | 24.1 2513 | 14.1 2514 | 10.7 2515 | 8.7 2516 | 13.3 2517 | 11.6 2518 | 9.9 2519 | 10.8 2520 | 11.5 2521 | 10 2522 | 13.9 2523 | 13.6 2524 | 11.9 2525 | 11.1 2526 | 8.2 2527 | 9.4 2528 | 12.7 2529 | 11.6 2530 | 11 2531 | 11.3 2532 | 13.4 2533 | 14.9 2534 | 15.2 2535 | 13.9 2536 | 15 2537 | 16.2 2538 | 17.7 2539 | 20.5 2540 | 14.7 2541 | 12.5 2542 | 10.9 2543 | 12.8 2544 | 12.7 2545 | 11.2 2546 | 11.4 2547 | 11.2 2548 | 12.1 2549 | 12.7 2550 | 16.2 2551 | 14.2 2552 | 14.3 2553 | 13.3 2554 | 16.7 2555 | 15.3 2556 | 14.3 2557 | 13.5 2558 | 15 2559 | 13.6 2560 | 15.2 2561 | 17 2562 | 18.7 2563 | 16.5 2564 | 17.4 2565 | 18.3 2566 | 18.3 2567 | 22.4 2568 | 21.4 2569 | 20.9 2570 | 17.6 2571 | 15.5 2572 | 16.6 2573 | 16.2 2574 | 15.6 2575 | 14.5 2576 | 14 2577 | 15.6 2578 | 12.3 2579 | 11.6 2580 | 12.6 2581 | 14.9 2582 | 17.3 2583 | 21.4 2584 | 23.4 2585 | 14.4 2586 | 14.1 2587 | 15 2588 | 14.5 2589 | 15.1 2590 | 13.9 2591 | 13.4 2592 | 9.2 2593 | 12.5 2594 | 15.1 2595 | 12.1 2596 | 14.5 2597 | 16.3 2598 | 16.5 2599 | 14.9 2600 | 13.2 2601 | 11.8 2602 | 13.6 2603 | 16.2 2604 | 14.1 2605 | 13.5 2606 | 15 2607 | 14.8 2608 | 16.2 2609 | 16.2 2610 | 13.3 2611 | 15.3 2612 | 18.4 2613 | 16.2 2614 | 12.4 2615 | 15.6 2616 | 14.9 2617 | 14.8 2618 | 12.7 2619 | 14.2 2620 | 16.8 2621 | 16.7 2622 | 16.2 2623 | 14.5 2624 | 10 2625 | 12.6 2626 | 11.9 2627 | 11.8 2628 | 13.4 2629 | 14.5 2630 | 15.7 2631 | 15.3 2632 | 13.9 2633 | 13.7 2634 | 15.1 2635 | 15.6 2636 | 14.4 2637 | 13.9 2638 | 16.2 2639 | 16.7 2640 | 15.5 2641 | 16.4 2642 | 17.5 2643 | 18.2 2644 | 16.1 2645 | 16.5 2646 | 14.6 2647 | 16.4 2648 | 13.6 2649 | 15.9 2650 | 11.9 2651 | 14.7 2652 | 9.4 2653 | 6.6 2654 | 7.9 2655 | 11 2656 | 15.7 2657 | 15.2 2658 | 15.9 2659 | 10.6 2660 | 8.3 2661 | 8.6 2662 | 12.7 2663 | 10.5 2664 | 12 2665 | 11.1 2666 | 13 2667 | 12.4 2668 | 13.3 2669 | 15.9 2670 | 12 2671 | 13.7 2672 | 17.6 2673 | 14.3 2674 | 13.7 2675 | 15.2 2676 | 14.5 2677 | 14.9 2678 | 15.5 2679 | 16.4 2680 | 14.5 2681 | 12.6 2682 | 13.6 2683 | 11.2 2684 | 11 2685 | 12 2686 | 6.8 2687 | 10.6 2688 | 13.1 2689 | 13.5 2690 | 11.7 2691 | 13.2 2692 | 12 2693 | 10.4 2694 | 10 2695 | 8.2 2696 | 9.4 2697 | 10.3 2698 | 8.1 2699 | 8.7 2700 | 12.6 2701 | 10.9 2702 | 8.7 2703 | 9.3 2704 | 6.3 2705 | 7.8 2706 | 10 2707 | 11 2708 | 11.1 2709 | 12.6 2710 | 10.2 2711 | 11.1 2712 | 8.7 2713 | 9.5 2714 | 9.7 2715 | 8.2 2716 | 5 2717 | 6.5 2718 | 12.1 2719 | 8.9 2720 | 6.1 2721 | 2.8 2722 | 3.7 2723 | 6.8 2724 | 6.6 2725 | 7 2726 | 7.3 2727 | 7.9 2728 | 10.6 2729 | 8.1 2730 | 6.7 2731 | 8 2732 | 10 2733 | 6.7 2734 | 9.4 2735 | 9.3 2736 | 6 2737 | 5.8 2738 | 4.9 2739 | 5 2740 | 8.4 2741 | 12.3 2742 | 13 2743 | 11.4 2744 | 6.8 2745 | 7.6 2746 | 12.4 2747 | 7.1 2748 | 7.5 2749 | 10 2750 | 5.3 2751 | 6.3 2752 | 8 2753 | 8.3 2754 | 9.3 2755 | 9.5 2756 | 5.6 2757 | 7 2758 | 8.5 2759 | 8.5 2760 | 8.2 2761 | 8.5 2762 | 9.6 2763 | 9.7 2764 | 7.1 2765 | 8.4 2766 | 9.2 2767 | 9.8 2768 | 8.1 2769 | 9.4 2770 | 10 2771 | 5.1 2772 | 6.7 2773 | 6.9 2774 | 6.8 2775 | 8.6 2776 | 9.1 2777 | 3.9 2778 | 4.8 2779 | 8.4 2780 | 11.6 2781 | 12.1 2782 | 12.4 2783 | 10 2784 | 10.1 2785 | 9.7 2786 | 11.7 2787 | 7.9 2788 | 8.6 2789 | 7.7 2790 | 5.8 2791 | 8.7 2792 | 10.6 2793 | 6.7 2794 | 8.8 2795 | 9.7 2796 | 9 2797 | 11.8 2798 | 15.2 2799 | 10 2800 | 10.5 2801 | 5.5 2802 | 9.4 2803 | 8.8 2804 | 5.3 2805 | 13 2806 | 15.2 2807 | 13.2 2808 | 11.5 2809 | 6.8 2810 | 4.7 2811 | 5.2 2812 | 6.8 2813 | 10.7 2814 | 10.1 2815 | 10 2816 | 9.8 2817 | 5.5 2818 | 13.5 2819 | 16.6 2820 | 8.4 2821 | 8.2 2822 | 11.1 2823 | 10.8 2824 | 8.8 2825 | 10.8 2826 | 8.7 2827 | 12.4 2828 | 9 2829 | 13.5 2830 | 14.7 2831 | 10.9 2832 | 8.5 2833 | 6 2834 | 12.7 2835 | 11.1 2836 | 8.7 2837 | 12.3 2838 | 13.3 2839 | 5.6 2840 | 13.7 2841 | 8.5 2842 | 11.2 2843 | 8.7 2844 | 11.7 2845 | 12.5 2846 | 8.2 2847 | 15.6 2848 | 10.3 2849 | 11.4 2850 | 9.7 2851 | 6.3 2852 | 14.3 2853 | 11.3 2854 | 7.3 2855 | 12.8 2856 | 11.9 2857 | 14.3 2858 | 11.6 2859 | 13.2 2860 | 15.5 2861 | 14.1 2862 | 9.5 2863 | 7.2 2864 | 11.8 2865 | 16.8 2866 | 12.5 2867 | 9.4 2868 | 11.9 2869 | 10.3 2870 | 16.9 2871 | 17.5 2872 | 7.5 2873 | 8.6 2874 | 11.1 2875 | 11.5 2876 | 10.7 2877 | 15.7 2878 | 12.8 2879 | 13 2880 | 12.9 2881 | 14.3 2882 | 13.7 2883 | 12.1 2884 | 11.9 2885 | 11.8 2886 | 11.4 2887 | 10.3 2888 | 11.7 2889 | 12 2890 | 17.4 2891 | 16.8 2892 | 16.2 2893 | 13 2894 | 12.5 2895 | 12.4 2896 | 16.1 2897 | 20.2 2898 | 14.3 2899 | 11 2900 | 14.4 2901 | 15.7 2902 | 19.7 2903 | 20.7 2904 | 23.9 2905 | 16.6 2906 | 17.5 2907 | 14.9 2908 | 13.6 2909 | 11.9 2910 | 15.2 2911 | 17.3 2912 | 19.8 2913 | 15.8 2914 | 9.5 2915 | 12.9 2916 | 12.9 2917 | 14.8 2918 | 14.1 2919 | 14.3 2920 | 17.4 2921 | 18.5 2922 | 16.8 2923 | 11.5 2924 | 9.5 2925 | 12.2 2926 | 15.7 2927 | 16.3 2928 | 13.6 2929 | 12.6 2930 | 13.8 2931 | 12.1 2932 | 13.4 2933 | 17.3 2934 | 19.4 2935 | 16.6 2936 | 13.9 2937 | 13.1 2938 | 16 2939 | 14.5 2940 | 15 2941 | 12.6 2942 | 12.5 2943 | 15.2 2944 | 16.2 2945 | 16.5 2946 | 20.1 2947 | 20.6 2948 | 16.9 2949 | 16.5 2950 | 16.1 2951 | 14.4 2952 | 16.3 2953 | 15.7 2954 | 14.2 2955 | 13.2 2956 | 16.8 2957 | 18.5 2958 | 16.7 2959 | 15.3 2960 | 15.9 2961 | 15.2 2962 | 17.5 2963 | 18.3 2964 | 19.4 2965 | 19.4 2966 | 19.5 2967 | 20.5 2968 | 15.7 2969 | 15 2970 | 16.1 2971 | 14.3 2972 | 13 2973 | 16.2 2974 | 17.7 2975 | 13.2 2976 | 15.8 2977 | 18.5 2978 | 20.4 2979 | 22 2980 | 19.7 2981 | 19.6 2982 | 20.3 2983 | 18.3 2984 | 18.9 2985 | 20.3 2986 | 21.4 2987 | 18.3 2988 | 17.8 2989 | 17.7 2990 | 12.8 2991 | 15.1 2992 | 15 2993 | 14.8 2994 | 12 2995 | 12.5 2996 | 15 2997 | 17.1 2998 | 17.3 2999 | 16.9 3000 | 16.5 3001 | 13.6 3002 | 13.2 3003 | 9.4 3004 | 9.5 3005 | 11.8 3006 | 10.4 3007 | 9.7 3008 | 12.6 3009 | 13.3 3010 | 15.1 3011 | 14.2 3012 | 14.2 3013 | 19.2 3014 | 12.6 3015 | 14.2 3016 | 11.9 3017 | 13.9 3018 | 13.5 3019 | 15.3 3020 | 13.9 3021 | 14 3022 | 12.9 3023 | 8.5 3024 | 11.4 3025 | 10.9 3026 | 12 3027 | 8.6 3028 | 9 3029 | 9.6 3030 | 10.2 3031 | 9.8 3032 | 8.3 3033 | 11 3034 | 11.9 3035 | 14 3036 | 15.8 3037 | 14.5 3038 | 13.2 3039 | 14.2 3040 | 14.6 3041 | 11.8 3042 | 14.4 3043 | 10.4 3044 | 10.3 3045 | 10.8 3046 | 10.5 3047 | 9.5 3048 | 12.5 3049 | 13.7 3050 | 12.7 3051 | 11.9 3052 | 11.4 3053 | 9.7 3054 | 8.3 3055 | 8.1 3056 | 11.7 3057 | 11.6 3058 | 7.4 3059 | 5.2 3060 | 11 3061 | 9.5 3062 | 9.2 3063 | 10.7 3064 | 9 3065 | 10.2 3066 | 10.3 3067 | 12.1 3068 | 13.2 3069 | 6.6 3070 | 2.3 3071 | 1.4 3072 | 2.1 3073 | 6.6 3074 | 8.9 3075 | 7.8 3076 | 9 3077 | 10.3 3078 | 7.9 3079 | 7.2 3080 | 8.6 3081 | 8.8 3082 | 6.2 3083 | 9.5 3084 | 10.2 3085 | 9.7 3086 | 11.2 3087 | 10.2 3088 | 10.1 3089 | 8.1 3090 | 6.6 3091 | 5 3092 | 4.7 3093 | 5.3 3094 | 4.5 3095 | 2.3 3096 | 1.4 3097 | 0.5 3098 | 2.4 3099 | 8 3100 | 6 3101 | 7.1 3102 | 9.7 3103 | 6.9 3104 | 5.3 3105 | 7 3106 | 6.2 3107 | 7 3108 | 9.7 3109 | 8 3110 | 8.5 3111 | 7.1 3112 | 7.5 3113 | 3.3 3114 | 1.8 3115 | 2.6 3116 | 5.3 3117 | 5.8 3118 | 5.8 3119 | 7.2 3120 | 5.3 3121 | 1.6 3122 | 3.1 3123 | 5.3 3124 | 7.7 3125 | 4.2 3126 | 5.5 3127 | 9 3128 | 11.2 3129 | 8 3130 | 7.6 3131 | 3.7 3132 | 7.5 3133 | 8.1 3134 | 8.4 3135 | 7.1 3136 | 7.6 3137 | 7.6 3138 | 5.6 3139 | 7 3140 | 10.5 3141 | 7.3 3142 | 7.8 3143 | 5.8 3144 | 3.8 3145 | 5.8 3146 | 6.7 3147 | 6.6 3148 | 6.6 3149 | 9 3150 | 8.1 3151 | 5.1 3152 | 8.6 3153 | 7 3154 | 5.5 3155 | 7.4 3156 | 6.2 3157 | 4.2 3158 | 6.3 3159 | 7 3160 | 4 3161 | 8 3162 | 8.8 3163 | 8.8 3164 | 6.1 3165 | 8.6 3166 | 8.9 3167 | 7.8 3168 | 5 3169 | 7 3170 | 13.3 3171 | 7.9 3172 | 7.5 3173 | 8.3 3174 | 7.2 3175 | 6.5 3176 | 8.9 3177 | 7.4 3178 | 9.9 3179 | 9.3 3180 | 10.6 3181 | 8.6 3182 | 7.2 3183 | 12.6 3184 | 7.8 3185 | 6.3 3186 | 9.2 3187 | 5.8 3188 | 9 3189 | 5 3190 | 11.9 3191 | 13.4 3192 | 10.5 3193 | 6.2 3194 | 5.1 3195 | 9.5 3196 | 11.7 3197 | 9.2 3198 | 7.3 3199 | 9.7 3200 | 9.4 3201 | 10 3202 | 10.9 3203 | 11 3204 | 10.9 3205 | 8 3206 | 11.2 3207 | 7.5 3208 | 7.2 3209 | 13.2 3210 | 12.9 3211 | 9.4 3212 | 10.2 3213 | 9.5 3214 | 12.4 3215 | 10.2 3216 | 13.4 3217 | 11.6 3218 | 8 3219 | 9 3220 | 9.3 3221 | 13.5 3222 | 8 3223 | 8.1 3224 | 10 3225 | 8.5 3226 | 12.5 3227 | 15 3228 | 13.3 3229 | 11 3230 | 11.9 3231 | 8.3 3232 | 9.7 3233 | 11.3 3234 | 12.5 3235 | 9.4 3236 | 11.4 3237 | 13.2 3238 | 13.8 3239 | 16 3240 | 10.9 3241 | 11.9 3242 | 12.4 3243 | 13.2 3244 | 15.5 3245 | 21.6 3246 | 14.9 3247 | 14.4 3248 | 12.9 3249 | 13.1 3250 | 14 3251 | 17.9 3252 | 17.7 3253 | 16.3 3254 | 18.3 3255 | 13.7 3256 | 13.3 3257 | 10.6 3258 | 14.1 3259 | 16 3260 | 16.5 3261 | 14.1 3262 | 18.7 3263 | 16.2 3264 | 14.8 3265 | 12.6 3266 | 10.4 3267 | 12.2 3268 | 12.6 3269 | 12.1 3270 | 17.3 3271 | 16.4 3272 | 12.6 3273 | 12.3 3274 | 11.8 3275 | 12 3276 | 12.7 3277 | 16.4 3278 | 16 3279 | 13.3 3280 | 11.7 3281 | 10.4 3282 | 14.4 3283 | 12.7 3284 | 14.8 3285 | 13.3 3286 | 15.6 3287 | 14.5 3288 | 14.3 3289 | 15.3 3290 | 16.4 3291 | 14.8 3292 | 17.4 3293 | 18.8 3294 | 22.1 3295 | 19 3296 | 15.5 3297 | 15.8 3298 | 14.7 3299 | 10.7 3300 | 11.5 3301 | 15 3302 | 14.5 3303 | 14.5 3304 | 13.3 3305 | 14.3 3306 | 14.3 3307 | 20.5 3308 | 15 3309 | 17.1 3310 | 16.9 3311 | 16.9 3312 | 13.6 3313 | 16.4 3314 | 16.1 3315 | 12 3316 | 12.2 3317 | 14.8 3318 | 14.8 3319 | 14.4 3320 | 12.9 3321 | 13.4 3322 | 15.9 3323 | 16.1 3324 | 17.6 3325 | 15.6 3326 | 15 3327 | 13 3328 | 14.1 3329 | 17.3 3330 | 15.7 3331 | 18.6 3332 | 12.7 3333 | 14 3334 | 13.7 3335 | 16.3 3336 | 20 3337 | 17 3338 | 15.2 3339 | 16.5 3340 | 16.5 3341 | 17.3 3342 | 19.1 3343 | 19.3 3344 | 17.3 3345 | 19 3346 | 19.8 3347 | 19.3 3348 | 17.2 3349 | 14.2 3350 | 10.3 3351 | 13 3352 | 15.3 3353 | 15 3354 | 12.1 3355 | 9.2 3356 | 11 3357 | 15 3358 | 11.6 3359 | 11.6 3360 | 15.1 3361 | 15 3362 | 13.6 3363 | 12.5 3364 | 14.3 3365 | 16 3366 | 17.4 3367 | 16.9 3368 | 18 3369 | 20.6 3370 | 14.2 3371 | 10.9 3372 | 11.9 3373 | 13.3 3374 | 15.3 3375 | 14.7 3376 | 11 3377 | 12.2 3378 | 14.2 3379 | 17 3380 | 15.8 3381 | 15.2 3382 | 15.1 3383 | 14.7 3384 | 18.5 3385 | 16.4 3386 | 18.4 3387 | 15.1 3388 | 9.9 3389 | 10.2 3390 | 12.6 3391 | 13.2 3392 | 11.5 3393 | 13.8 3394 | 14.5 3395 | 14.7 3396 | 11.2 3397 | 12.7 3398 | 13.7 3399 | 11.5 3400 | 10.4 3401 | 8.9 3402 | 11.1 3403 | 9.5 3404 | 13 3405 | 13.9 3406 | 12.6 3407 | 14.3 3408 | 16 3409 | 13.3 3410 | 7 3411 | 4.9 3412 | 6.9 3413 | 13.7 3414 | 10.6 3415 | 12.3 3416 | 11.1 3417 | 10.2 3418 | 9.5 3419 | 8.9 3420 | 13.4 3421 | 9.1 3422 | 9.4 3423 | 8.7 3424 | 5.8 3425 | 4.5 3426 | 7.2 3427 | 10 3428 | 10.5 3429 | 10.7 3430 | 8.2 3431 | 6.1 3432 | 4.5 3433 | 6.1 3434 | 9.8 3435 | 9.7 3436 | 8.2 3437 | 8.4 3438 | 8.5 3439 | 10.4 3440 | 6.8 3441 | 6 3442 | 6.6 3443 | 7.8 3444 | 10.3 3445 | 7.2 3446 | 7.4 3447 | 11.4 3448 | 5.4 3449 | 4.4 3450 | 6.4 3451 | 9.3 3452 | 7.7 3453 | 8.1 3454 | 8.3 3455 | 9.1 3456 | 7.7 3457 | 10.6 3458 | 8.2 3459 | 7.9 3460 | 5.2 3461 | 5.9 3462 | 3.7 3463 | 5.6 3464 | 9.4 3465 | 7.4 3466 | 7.3 3467 | 7.7 3468 | 7.7 3469 | 9.3 3470 | 4.4 3471 | 5.7 3472 | 10.2 3473 | 10.2 3474 | 9.3 3475 | 5.4 3476 | 5 3477 | 7.6 3478 | 9.6 3479 | 10.4 3480 | 11.2 3481 | 9.1 3482 | 11.2 3483 | 6.8 3484 | 8.3 3485 | 9.7 3486 | 9.6 3487 | 9.8 3488 | 10.8 3489 | 9.2 3490 | 6.5 3491 | 8.1 3492 | 7.3 3493 | 7.9 3494 | 6 3495 | 5 3496 | 6.8 3497 | 9.8 3498 | 5.7 3499 | 8.6 3500 | 10.6 3501 | 7.8 3502 | 7.7 3503 | 8.6 3504 | 6.5 3505 | 6.9 3506 | 6.4 3507 | 8.5 3508 | 7.8 3509 | 9.3 3510 | 8.4 3511 | 7.8 3512 | 7.4 3513 | 7.7 3514 | 8.9 3515 | 9.7 3516 | 9.9 3517 | 6.1 3518 | 6.6 3519 | 7.6 3520 | 7.4 3521 | 8 3522 | 2.1 3523 | 5.9 3524 | 11.6 3525 | 8.6 3526 | 7.9 3527 | 6 3528 | 9.5 3529 | 8.6 3530 | 7.6 3531 | 10.4 3532 | 10.3 3533 | 7.5 3534 | 3 3535 | 5.3 3536 | 10.5 3537 | 14.6 3538 | 12.6 3539 | 9.8 3540 | 7.2 3541 | 10.1 3542 | 10.4 3543 | 3.7 3544 | 7.3 3545 | 11.6 3546 | 16.3 3547 | 9.6 3548 | 6.8 3549 | 5.2 3550 | 10.6 3551 | 16.3 3552 | 9.8 3553 | 4.6 3554 | 11.1 3555 | 8.7 3556 | 10 3557 | 11.3 3558 | 10.5 3559 | 9.9 3560 | 11 3561 | 14 3562 | 9.2 3563 | 9.8 3564 | 6 3565 | 9.8 3566 | 9.2 3567 | 11.8 3568 | 10.3 3569 | 7.5 3570 | 7.7 3571 | 15.8 3572 | 14.6 3573 | 10.5 3574 | 11.3 3575 | 10.9 3576 | 6.4 3577 | 10.9 3578 | 9 3579 | 10.9 3580 | 12.4 3581 | 11.6 3582 | 13.3 3583 | 14.4 3584 | 18.4 3585 | 13.6 3586 | 14.9 3587 | 14.8 3588 | 15.4 3589 | 11.8 3590 | 13 3591 | 11.1 3592 | 12.5 3593 | 18.3 3594 | 19.2 3595 | 15.4 3596 | 13.1 3597 | 11.5 3598 | 8.6 3599 | 12.6 3600 | 13.8 3601 | 14.6 3602 | 13.2 3603 | 12.3 3604 | 8.8 3605 | 10.7 3606 | 9.9 3607 | 8.3 3608 | 15 3609 | 12.2 3610 | 10.5 3611 | 11.1 3612 | 13 3613 | 12.9 3614 | 8.8 3615 | 14.7 3616 | 14.7 3617 | 12.7 3618 | 13.3 3619 | 13.2 3620 | 16.2 3621 | 17.3 3622 | 20.5 3623 | 20.2 3624 | 19.4 3625 | 15.5 3626 | 14.1 3627 | 11 3628 | 11.1 3629 | 14 3630 | 11.4 3631 | 12.5 3632 | 13.4 3633 | 13.6 3634 | 13.9 3635 | 17.2 3636 | 14.7 3637 | 15.4 3638 | 13.1 3639 | 13.2 3640 | 13.9 3641 | 10 3642 | 12.9 3643 | 14.6 3644 | 14 3645 | 13.6 3646 | 13.5 3647 | 15.7 3648 | 13 3649 | -------------------------------------------------------------------------------- /Rocket Control with JuMP - JuliaCon 2015.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Rocket Control with JuMP\n", 8 | "\n", 9 | "\n", 10 | "\n", 11 | "> Robert Hutchings Goddard was an American engineer, professor, physicist, and inventor who is credited with creating and building the world's first liquid-fueled rocket which he successfully launched on March 16, 1926. Goddard and his team launched 34 rockets between 1926 and 1941, achieving altitudes as high as 2.6 km (1.6 mi) and speeds as high as 885 km/h (550 mph).\n", 12 | "\n", 13 | "*From [Wikipedia](https://en.wikipedia.org/wiki/Robert_H._Goddard)*\n", 14 | "\n", 15 | "*This problem was drawn from the [COPS3](http://www.mcs.anl.gov/~more/cops/cops3.pdf) benchmark.*" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Simple Rocket Flight Model\n", 23 | "\n", 24 | "Before we even talk about optimization, we will create a simple model of a rocket in flight: state variables, controls, and dynamics.\n", 25 | "\n", 26 | "### State variables\n", 27 | "\n", 28 | "We will take a very simplified view and consider everything to be one-dimensional: our rocket will go straight up (and straight down). So our first two state variables that vary across time are \n", 29 | "\n", 30 | "* **velocity**, $v(t)$\n", 31 | "* **altitude**, $h(t)$\n", 32 | "\n", 33 | "Our rocket is burning fuel as it goes, getting lighter and lighter in the process. Therefore we need a third state variable\n", 34 | "\n", 35 | "* **Mass of rocket and remaining fuel**, $m(t)$\n", 36 | "\n", 37 | "We will start at altitude $h_0$, velocity 0, and mass $m_0$. We will define $m_c$ to be fraction of rocket that is the rocket itself. $m(t)$ is thus $\\geq m_c m_0$.\n", 38 | "\n", 39 | "### Control\n", 40 | "\n", 41 | "We will have one control for our rocket: the **thrust** $T(t)$. We will assume that it can be changed rapidly, which is not completely unreasonable for a liquid-fuel rocket. There is however a maximum thrust of $T_{max}$.\n", 42 | "\n", 43 | "### Dynamics\n", 44 | "\n", 45 | "We need to consider what forces act on our rocket other than thrust. The most obvious perhaps is **gravity**\n", 46 | "\n", 47 | "$$g(h) = g_0 \\left( \\frac{h(0)}{h} \\right)^2$$\n", 48 | "\n", 49 | "which is a function of height. The other key force is **drag**\n", 50 | "\n", 51 | "$$D(h,v) = D_c v^2 exp\\left( -h_c \\left( \\frac{h-h(0)}{h(0)} \\right) \\right)$$\n", 52 | "\n", 53 | "which is a complicated function of velocity (squared), height (to adjust for air density), and a drag coefficient $D_c$ determined by the rocket shape.\n", 54 | "\n", 55 | "Given all the above, we can link together everything with three equations to control the dynamics of the rocket:\n", 56 | "\n", 57 | "* **Rate of ascent** $$h^\\prime = v$$\n", 58 | "* **Acceleration** $$v^\\prime = \\frac{T - D(h,v)}{m} - g(h)$$\n", 59 | "* **Rate of mass loss** $$m^\\prime = -\\frac{T}{c}$$\n", 60 | "\n", 61 | "where $c$ is a constant measuring the impulse of the rocket fuel." 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "## Optimization problem\n", 69 | "\n", 70 | "The goal is **maximize the final altitude of our rocket**. The only thing we can change, other than the rocket properties itself, are the way we vary our thrust over time. We will formulate an optimization problem to find the optimal thrust profile.\n", 71 | "\n", 72 | "### Dealing with time\n", 73 | "\n", 74 | "We will use a **discretized model of time**, with a fixed number of time steps, $n$. We will make the time step size $\\Delta t$, and thus the final time $t_f = n \\cdot \\Delta t$, a variable in the problem. We can now write out objective as\n", 75 | "$$\n", 76 | "\\max h(t_f)\n", 77 | "$$\n", 78 | "\n", 79 | "Given this, we now need to discretize our dynamic equations. For example, how do we relate $v(t)$ and $v(t+\\Delta t)$? To do so we will use numerical integration. One simple idea is the \"rectangular rule\", e.g.\n", 80 | "$$\n", 81 | "f(t+\\Delta t) - f(t) = \\Delta t v(t)\n", 82 | "$$\n", 83 | "\n", 84 | "We will use the more accurate but more complicated [trapezoidal rule](http://en.wikipedia.org/wiki/Trapezoidal_rule) (other options are possible!). In particular, in the context our problem we have that\n", 85 | "$$\n", 86 | "f(t+\\Delta t) - f(t) = \\frac{ v(t + \\Delta t) + v(t) }{ 0.5 \\Delta t }\n", 87 | "$$\n", 88 | "\n", 89 | "The three equations that relate the states, controls, and forces correspond to **constraints** in the optimization problem.\n", 90 | "\n", 91 | "### Data\n", 92 | "\n", 93 | "For the purposes of this example we will use dimension free (scaled) parameters. In particular:\n", 94 | "\n", 95 | "* $T_{max} = 3.5 g_0 m_0$\n", 96 | "* $D_c = 0.5 v_c \\frac{m_0}{g_0}$\n", 97 | "* $c = 0.5 (g_0 h_0 )^{0.5}$\n", 98 | "* So $h_0 = m_0 = g_0 = 1$\n", 99 | "* and we choose $h_c = 500$, $m_c = 0.6$, $v_c = 620$\n", 100 | "\n", 101 | "Finally we will use $n$ time steps.\n", 102 | "\n", 103 | "### Initial Solution\n", 104 | "\n", 105 | "We will be using an *interior point* solver. You can think of it as basically a gradient descent inside the space of feasible solutions. We can help out the solver by providing a good initial solution that is not wildly different from the final solution. We'll use the following solution:\n", 106 | "\n", 107 | "* $t_f = n \\Delta t = 1$\n", 108 | "* $h(t) = 1$\n", 109 | "* $v(t) = \\frac{t}{t_f}(1 - \\frac{t}{t_f})$\n", 110 | "* $m(t) = (m_f - m_0)\\frac{t}{t_f} + m_0$" 111 | ] 112 | }, 113 | { 114 | "cell_type": "markdown", 115 | "metadata": {}, 116 | "source": [ 117 | "## Building the model" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 2, 123 | "metadata": { 124 | "collapsed": false 125 | }, 126 | "outputs": [], 127 | "source": [ 128 | "# Load JuMP, and a nonlinear solver Ipopt\n", 129 | "# Other options we have for this problem class\n", 130 | "# is KNITRO.jl, a commercial solver.\n", 131 | "using JuMP, Ipopt" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 13, 137 | "metadata": { 138 | "collapsed": false 139 | }, 140 | "outputs": [ 141 | { 142 | "data": { 143 | "text/latex": [ 144 | "$$ \\begin{alignat*}{1}\\min\\quad & 0\\\\\n", 145 | "\\text{Subject to} \\quad\\end{alignat*}\n", 146 | " $$" 147 | ], 148 | "text/plain": [ 149 | "Feasibility problem with:\n", 150 | " * 0 linear constraints\n", 151 | " * 0 variables\n", 152 | "Solver set to Ipopt" 153 | ] 154 | }, 155 | "execution_count": 13, 156 | "metadata": {}, 157 | "output_type": "execute_result" 158 | } 159 | ], 160 | "source": [ 161 | "# Create JuMP model, using Ipopt as the solver\n", 162 | "#mod = Model(solver=IpoptSolver(print_level=0))\n", 163 | "mod = Model(solver=IpoptSolver())" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 14, 169 | "metadata": { 170 | "collapsed": false 171 | }, 172 | "outputs": [ 173 | { 174 | "data": { 175 | "text/plain": [ 176 | "800" 177 | ] 178 | }, 179 | "execution_count": 14, 180 | "metadata": {}, 181 | "output_type": "execute_result" 182 | } 183 | ], 184 | "source": [ 185 | "# Constants\n", 186 | "# Note that all parameters in the model have been normalized\n", 187 | "# to be dimensionless. See the COPS3 paper for more info.\n", 188 | "h_0 = 1 # Initial height\n", 189 | "v_0 = 0 # Initial velocity\n", 190 | "m_0 = 1 # Initial mass\n", 191 | "g_0 = 1 # Gravity at the surface\n", 192 | "\n", 193 | "# Parameters\n", 194 | "T_c = 3.5 # Used for thrust\n", 195 | "h_c = 500 # Used for drag\n", 196 | "v_c = 620 # Used for drag\n", 197 | "m_c = 0.6 # Fraction of initial mass left at end\n", 198 | "\n", 199 | "# Derived parameters\n", 200 | "c = 0.5*sqrt(g_0*h_0) # Thrust-to-fuel mass\n", 201 | "m_f = m_c*m_0 # Final mass\n", 202 | "D_c = 0.5*v_c*m_0/g_0 # Drag scaling\n", 203 | "T_max = T_c*g_0*m_0 # Maximum thrust\n", 204 | "\n", 205 | "# Time steps\n", 206 | "n = 800" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 15, 212 | "metadata": { 213 | "collapsed": false 214 | }, 215 | "outputs": [], 216 | "source": [ 217 | "# Set up variables and constraints\n", 218 | "\n", 219 | "# Time step with initial guess\n", 220 | "@defVar(mod, Δt ≥ 0, start = 1/n)\n", 221 | "# Store a useful subexpression, \"time of flight\"\n", 222 | "@defNLExpr(t_f, Δt*n)\n", 223 | "\n", 224 | "# State variables\n", 225 | "@defVar(mod, v[0:n] ≥ 0) # Velocity\n", 226 | "@defVar(mod, h[0:n] ≥ h_0) # Height\n", 227 | "@defVar(mod, m_f ≤ m[0:n] ≤ m_0) # Mass\n", 228 | "\n", 229 | "# Control: thrust\n", 230 | "@defVar(mod, 0 ≤ T[0:n] ≤ T_max)\n", 231 | "\n", 232 | "# Provide starting solution\n", 233 | "# Could have done this at same time as @defVar\n", 234 | "for k in 0:n\n", 235 | " setValue(h[k], 1)\n", 236 | " setValue(v[k], (k/n)*(1 - (k/n)))\n", 237 | " setValue(m[k], (m_f - m_0)*(k/n) + m_0)\n", 238 | " setValue(T[k], T_max/2)\n", 239 | "end\n", 240 | "\n", 241 | "# Objective: maximize altitude at end of time of flight\n", 242 | "@setObjective(mod, Max, h[n])\n", 243 | "\n", 244 | "# Initial conditions\n", 245 | "@addConstraint(mod, v[0] == v_0)\n", 246 | "@addConstraint(mod, h[0] == h_0)\n", 247 | "@addConstraint(mod, m[0] == m_0)\n", 248 | "@addConstraint(mod, m[n] == m_f)\n", 249 | "\n", 250 | "# Forces\n", 251 | "# We'll define these as expressions too\n", 252 | "# Wherever they appear, they will effectively be\n", 253 | "# replaced by these longer expressions, keeps them\n", 254 | "# nice and clean\n", 255 | "\n", 256 | "# Drag(h,v) = Dc v^2 exp( -hc * (h - h0) / h0 )\n", 257 | "@defNLExpr(drag[j=0:n], D_c*(v[j]^2)*exp(-h_c*(h[j]-h_0)/h_0))\n", 258 | "# Grav(h) = g0 * (h0 / h)^2\n", 259 | "@defNLExpr(grav[j=0:n], g_0*(h_0/h[j])^2)\n", 260 | "\n", 261 | "# Dynamics\n", 262 | "for j in 1:n\n", 263 | " # h' = v\n", 264 | " # Rectangular integration\n", 265 | " # @addNLConstraint(mod, h[j] == h[j-1] + Δt*v[j-1])\n", 266 | " # Trapezoidal integration\n", 267 | " @addNLConstraint(mod,\n", 268 | " h[j] == h[j-1] + 0.5*Δt*(v[j]+v[j-1]))\n", 269 | "\n", 270 | " # v' = (T-D(h,v))/m - g(h)\n", 271 | " # Rectangular integration\n", 272 | " # @addNLConstraint(mod, v[j] == v[j-1] + Δt*(\n", 273 | " # (T[j-1] - drag[j-1])/m[j-1] - grav[j-1]))\n", 274 | " # Trapezoidal integration\n", 275 | " @addNLConstraint(mod,\n", 276 | " v[j] == v[j-1] + 0.5*Δt*(\n", 277 | " (T[j ] - drag[j ] - m[j ]*grav[j ])/m[j ] +\n", 278 | " (T[j-1] - drag[j-1] - m[j-1]*grav[j-1])/m[j-1] ))\n", 279 | "\n", 280 | " # m' = -T/c\n", 281 | " # Rectangular integration\n", 282 | " # @addNLConstraint(mod, m[j] == m[j-1] - Δt*T[j-1]/c)\n", 283 | " # Trapezoidal integration\n", 284 | " @addNLConstraint(mod,\n", 285 | " m[j] == m[j-1] - 0.5*Δt*(T[j] + T[j-1])/c)\n", 286 | "end" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 16, 292 | "metadata": { 293 | "collapsed": false 294 | }, 295 | "outputs": [ 296 | { 297 | "name": "stdout", 298 | "output_type": "stream", 299 | "text": [ 300 | "Solving...\n", 301 | "This is Ipopt version 3.12.1, running with linear solver mumps.\n", 302 | "NOTE: Other linear solvers might be more efficient (see Ipopt documentation).\n", 303 | "\n", 304 | "Number of nonzeros in equality constraint Jacobian...: 15204\n", 305 | "Number of nonzeros in inequality constraint Jacobian.: 0\n", 306 | "Number of nonzeros in Lagrangian Hessian.............: 48800\n", 307 | "\n", 308 | "Total number of variables............................: 3205\n", 309 | " variables with only lower bounds: 1603\n", 310 | " variables with lower and upper bounds: 1602\n", 311 | " variables with only upper bounds: 0\n", 312 | "Total number of equality constraints.................: 2404\n", 313 | "Total number of inequality constraints...............: 0\n", 314 | " inequality constraints with only lower bounds: 0\n", 315 | " inequality constraints with lower and upper bounds: 0\n", 316 | " inequality constraints with only upper bounds: 0\n", 317 | "\n", 318 | "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", 319 | " 0 -1.0100000e+00 3.50e-02 1.83e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", 320 | " 1 -1.0476357e+00 3.10e-03 7.60e+03 -1.0 2.38e-01 2.0 9.18e-01 9.67e-01f 1\n", 321 | " 2 -1.0330218e+00 1.03e-03 8.61e+04 -1.0 2.31e+00 - 3.71e-01 7.53e-01h 1\n", 322 | " 3 -1.0108102e+00 3.89e-04 1.79e+05 -1.0 1.27e+00 - 1.00e+00 6.40e-01h 1\n", 323 | " 4 -1.0058561e+00 1.58e-04 2.97e+05 -1.0 6.84e-01 - 1.00e+00 9.69e-01h 1\n", 324 | " 5 -1.0078548e+00 9.05e-05 2.16e+05 -1.0 8.08e-01 - 1.00e+00 6.33e-01f 1\n", 325 | " 6 -1.0079653e+00 1.75e-05 4.11e+04 -1.0 4.89e-01 - 1.00e+00 1.00e+00f 1\n", 326 | " 7 -1.0078191e+00 1.38e-06 1.02e+02 -1.0 1.70e-01 - 1.00e+00 1.00e+00f 1\n", 327 | " 8 -1.0078115e+00 3.32e-10 2.15e+02 -1.7 3.11e-03 - 1.00e+00 1.00e+00h 1\n", 328 | " 9 -1.0078157e+00 2.53e-10 4.46e-01 -1.7 1.20e-02 - 1.00e+00 1.00e+00h 1\n", 329 | "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", 330 | " 10 -1.0078162e+00 6.07e-12 1.15e+01 -3.8 4.17e-04 - 1.00e+00 1.00e+00h 1\n", 331 | " 11 -1.0078877e+00 1.06e-07 5.24e-03 -3.8 5.52e-02 - 1.00e+00 1.00e+00f 1\n", 332 | " 12 -1.0078881e+00 2.27e-13 1.65e-06 -3.8 3.09e-04 - 1.00e+00 1.00e+00h 1\n", 333 | " 13 -1.0079601e+00 1.06e-07 2.95e+02 -5.7 5.49e-02 - 9.80e-01 1.00e+00f 1\n", 334 | " 14 -1.0095526e+00 8.48e-05 1.22e+00 -5.7 2.23e+00 - 1.00e+00 9.65e-01h 1\n", 335 | " 15 -1.0112897e+00 5.88e-05 2.95e+00 -5.7 1.78e+00 - 1.00e+00 9.90e-01f 1\n", 336 | " 16 -1.0111071e+00 2.22e-06 2.07e-02 -5.7 7.35e-01 - 1.00e+00 1.00e+00f 1\n", 337 | " 17 -1.0111190e+00 6.83e-09 6.56e-05 -5.7 5.17e-02 - 1.00e+00 1.00e+00h 1\n", 338 | " 18 -1.0111191e+00 4.12e-14 1.20e-09 -5.7 3.56e-04 - 1.00e+00 1.00e+00h 1\n", 339 | " 19 -1.0122683e+00 2.30e-05 2.99e+01 -8.6 8.98e-01 - 7.15e-01 8.77e-01f 1\n", 340 | "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", 341 | " 20 -1.0127029e+00 1.51e-05 8.14e+00 -8.6 8.55e-01 - 7.50e-01 7.80e-01h 1\n", 342 | " 21 -1.0128032e+00 1.01e-05 3.13e+00 -8.6 1.26e+00 - 6.59e-01 7.31e-01h 1\n", 343 | " 22 -1.0128269e+00 5.32e-06 1.22e+00 -8.6 1.40e+00 - 6.46e-01 7.33e-01h 1\n", 344 | " 23 -1.0128326e+00 2.58e-06 3.96e-01 -8.6 1.38e+00 - 6.98e-01 7.71e-01f 1\n", 345 | " 24 -1.0128339e+00 1.13e-06 1.87e-02 -8.6 1.24e+00 - 9.40e-01 8.79e-01f 1\n", 346 | " 25 -1.0128341e+00 2.77e-07 5.12e-05 -8.6 9.73e-01 - 1.00e+00 1.00e+00f 1\n", 347 | " 26 -1.0128341e+00 3.97e-09 1.13e-06 -8.6 2.34e-01 - 1.00e+00 1.00e+00h 1\n", 348 | " 27 -1.0128341e+00 1.03e-10 7.14e-09 -8.6 3.13e-02 - 1.00e+00 1.00e+00h 1\n", 349 | "\n", 350 | "Number of Iterations....: 27\n", 351 | "\n", 352 | " (scaled) (unscaled)\n", 353 | "Objective...............: -1.0128340615485458e+00 -1.0128340615485458e+00\n", 354 | "Dual infeasibility......: 7.1350593378980852e-09 7.1350593378980852e-09\n", 355 | "Constraint violation....: 1.0326103860869296e-10 1.0326103860869296e-10\n", 356 | "Complementarity.........: 2.5081820874400327e-09 2.5081820874400327e-09\n", 357 | "Overall NLP error.......: 7.1350593378980852e-09 7.1350593378980852e-09\n", 358 | "\n", 359 | "\n", 360 | "Number of objective function evaluations = 28\n", 361 | "Number of objective gradient evaluations = 28\n", 362 | "Number of equality constraint evaluations = 28\n", 363 | "Number of inequality constraint evaluations = 0\n", 364 | "Number of equality constraint Jacobian evaluations = 28\n", 365 | "Number of inequality constraint Jacobian evaluations = 0\n", 366 | "Number of Lagrangian Hessian evaluations = 27\n", 367 | "Total CPU secs in IPOPT (w/o function evaluations) = 0.259\n", 368 | "Total CPU secs in NLP function evaluations = 0.265\n", 369 | "\n", 370 | "EXIT: Optimal Solution Found.\n", 371 | "Solver status: Optimal\n", 372 | "Max height: 1.0128340615485458\n" 373 | ] 374 | } 375 | ], 376 | "source": [ 377 | "# Solve for the control and state\n", 378 | "println(\"Solving...\")\n", 379 | "status = solve(mod)\n", 380 | "\n", 381 | "# Display results\n", 382 | "println(\"Solver status: \", status)\n", 383 | "println(\"Max height: \", getObjectiveValue(mod))" 384 | ] 385 | }, 386 | { 387 | "cell_type": "code", 388 | "execution_count": 17, 389 | "metadata": { 390 | "collapsed": false 391 | }, 392 | "outputs": [], 393 | "source": [ 394 | "# Can visualize the state and control variables\n", 395 | "using Gadfly" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 18, 401 | "metadata": { 402 | "collapsed": false 403 | }, 404 | "outputs": [ 405 | { 406 | "data": { 407 | "image/svg+xml": [ 408 | "\n", 409 | "\n", 419 | "\n", 420 | " \n", 421 | " Time (s)\n", 422 | " \n", 423 | " \n", 424 | " 0.00\n", 425 | " 0.05\n", 426 | " 0.10\n", 427 | " 0.15\n", 428 | " 0.20\n", 429 | " \n", 430 | " \n", 431 | " Thrust\n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " 0\n", 459 | " 1\n", 460 | " 2\n", 461 | " 3\n", 462 | " 4\n", 463 | " \n", 464 | "\n", 465 | "\n", 466 | " \n", 467 | " Time (s)\n", 468 | " \n", 469 | " \n", 470 | " 0.00\n", 471 | " 0.05\n", 472 | " 0.10\n", 473 | " 0.15\n", 474 | " 0.20\n", 475 | " \n", 476 | " \n", 477 | " Velocity\n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " 0.00\n", 504 | " 0.05\n", 505 | " 0.10\n", 506 | " 0.15\n", 507 | " \n", 508 | "\n", 509 | "\n", 510 | " \n", 511 | " Time (s)\n", 512 | " \n", 513 | " \n", 514 | " 0.00\n", 515 | " 0.05\n", 516 | " 0.10\n", 517 | " 0.15\n", 518 | " 0.20\n", 519 | " \n", 520 | " \n", 521 | " Mass\n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " 0.6\n", 549 | " 0.7\n", 550 | " 0.8\n", 551 | " 0.9\n", 552 | " 1.0\n", 553 | " \n", 554 | "\n", 555 | "\n", 556 | " \n", 557 | " Time (s)\n", 558 | " \n", 559 | " \n", 560 | " 0.00\n", 561 | " 0.05\n", 562 | " 0.10\n", 563 | " 0.15\n", 564 | " 0.20\n", 565 | " \n", 566 | " \n", 567 | " Altitude\n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " 1.000\n", 594 | " 1.005\n", 595 | " 1.010\n", 596 | " 1.015\n", 597 | " \n", 598 | "\n", 599 | "\n", 600 | "\n", 601 | " \n", 602 | "\n", 604 | " \n", 605 | "\n", 607 | " \n", 608 | "\n", 610 | " \n", 611 | "\n", 613 | "\n" 614 | ], 615 | "text/html": [ 616 | "\n", 617 | "\n", 627 | "\n", 628 | " \n", 629 | " Time (s)\n", 630 | " \n", 631 | " \n", 632 | " 0.00\n", 633 | " 0.05\n", 634 | " 0.10\n", 635 | " 0.15\n", 636 | " 0.20\n", 637 | " \n", 638 | " \n", 639 | " Thrust\n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " 0\n", 667 | " 1\n", 668 | " 2\n", 669 | " 3\n", 670 | " 4\n", 671 | " \n", 672 | "\n", 673 | "\n", 674 | " \n", 675 | " Time (s)\n", 676 | " \n", 677 | " \n", 678 | " 0.00\n", 679 | " 0.05\n", 680 | " 0.10\n", 681 | " 0.15\n", 682 | " 0.20\n", 683 | " \n", 684 | " \n", 685 | " Velocity\n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " 0.00\n", 712 | " 0.05\n", 713 | " 0.10\n", 714 | " 0.15\n", 715 | " \n", 716 | "\n", 717 | "\n", 718 | " \n", 719 | " Time (s)\n", 720 | " \n", 721 | " \n", 722 | " 0.00\n", 723 | " 0.05\n", 724 | " 0.10\n", 725 | " 0.15\n", 726 | " 0.20\n", 727 | " \n", 728 | " \n", 729 | " Mass\n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " 0.6\n", 757 | " 0.7\n", 758 | " 0.8\n", 759 | " 0.9\n", 760 | " 1.0\n", 761 | " \n", 762 | "\n", 763 | "\n", 764 | " \n", 765 | " Time (s)\n", 766 | " \n", 767 | " \n", 768 | " 0.00\n", 769 | " 0.05\n", 770 | " 0.10\n", 771 | " 0.15\n", 772 | " 0.20\n", 773 | " \n", 774 | " \n", 775 | " Altitude\n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " 1.000\n", 802 | " 1.005\n", 803 | " 1.010\n", 804 | " 1.015\n", 805 | " \n", 806 | "\n", 807 | "\n", 808 | "\n", 809 | " \n", 810 | "\n", 812 | " \n", 813 | "\n", 815 | " \n", 816 | "\n", 818 | " \n", 819 | "\n", 821 | "\n" 822 | ], 823 | "text/plain": [ 824 | "SVG(152.39999999999998,152.39999999999998,IOBuffer(data=Uint8[...], readable=true, writable=true, seekable=true, append=false, size=54579, maxsize=Inf, ptr=54580, mark=-1),nothing,\"fig-2a34be1329b044df9921e3cf270e22e3\",0,[],Dict{Type{T<:Top},Union(Nothing,Property{P<:PropertyPrimitive})}(),[ClipPrimitive{Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}}([Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(21.97833333333333,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(5.0,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(71.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(5.0,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(71.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(56.914999999999985,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(21.97833333333333,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(56.914999999999985,MeasureNil(),MeasureNil(),0.0,0.0))])=>\"fig-2a34be1329b044df9921e3cf270e22e3-element-42\",ClipPrimitive{Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}}([Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(20.305,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(81.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(71.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(81.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(71.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(133.11499999999998,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(20.305,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(133.11499999999998,MeasureNil(),MeasureNil(),0.0,0.0))])=>\"fig-2a34be1329b044df9921e3cf270e22e3-element-18\",ClipPrimitive{Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}}([Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(94.83166666666665,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(5.0,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(147.39999999999998,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(5.0,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(147.39999999999998,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(56.914999999999985,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(94.83166666666665,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(56.914999999999985,MeasureNil(),MeasureNil(),0.0,0.0))])=>\"fig-2a34be1329b044df9921e3cf270e22e3-element-30\",ClipPrimitive{Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}}([Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(92.48499999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(81.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(147.39999999999998,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(81.19999999999999,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(147.39999999999998,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(133.11499999999998,MeasureNil(),MeasureNil(),0.0,0.0)),Point{Measure{MeasureNil,MeasureNil},Measure{MeasureNil,MeasureNil}}(Measure{MeasureNil,MeasureNil}(92.48499999999999,MeasureNil(),MeasureNil(),0.0,0.0),Measure{MeasureNil,MeasureNil}(133.11499999999998,MeasureNil(),MeasureNil(),0.0,0.0))])=>\"fig-2a34be1329b044df9921e3cf270e22e3-element-6\"],Set{String}({}),true,false,nothing,true,\"fig-2a34be1329b044df9921e3cf270e22e3-element-48\",false,48,String[\"/Users/idunning/.julia/v0.3/Gadfly/src/gadfly.js\",\"/Users/idunning/.julia/v0.3/Gadfly/src/gadfly.js\",\"/Users/idunning/.julia/v0.3/Gadfly/src/gadfly.js\",\"/Users/idunning/.julia/v0.3/Gadfly/src/gadfly.js\"],(String,String)[(\"Snap.svg\",\"Snap\"),(\"Gadfly\",\"Gadfly\"),(\"Gadfly\",\"Gadfly\"),(\"Gadfly\",\"Gadfly\"),(\"Gadfly\",\"Gadfly\")],String[\"fig.select(\\\"#fig-2a34be1329b044df9921e3cf270e22e3-element-5\\\")\\n .mouseenter(Gadfly.plot_mouseover)\\n.mouseleave(Gadfly.plot_mouseout)\\n.mousewheel(Gadfly.guide_background_scroll)\\n.drag(Gadfly.guide_background_drag_onmove,\\n Gadfly.guide_background_drag_onstart,\\n Gadfly.guide_background_drag_onend)\\n;\",\"fig.select(\\\"#fig-2a34be1329b044df9921e3cf270e22e3-element-17\\\")\\n .mouseenter(Gadfly.plot_mouseover)\\n.mouseleave(Gadfly.plot_mouseout)\\n.mousewheel(Gadfly.guide_background_scroll)\\n.drag(Gadfly.guide_background_drag_onmove,\\n Gadfly.guide_background_drag_onstart,\\n Gadfly.guide_background_drag_onend)\\n;\",\"fig.select(\\\"#fig-2a34be1329b044df9921e3cf270e22e3-element-29\\\")\\n .mouseenter(Gadfly.plot_mouseover)\\n.mouseleave(Gadfly.plot_mouseout)\\n.mousewheel(Gadfly.guide_background_scroll)\\n.drag(Gadfly.guide_background_drag_onmove,\\n Gadfly.guide_background_drag_onstart,\\n Gadfly.guide_background_drag_onend)\\n;\",\"fig.select(\\\"#fig-2a34be1329b044df9921e3cf270e22e3-element-41\\\")\\n .mouseenter(Gadfly.plot_mouseover)\\n.mouseleave(Gadfly.plot_mouseout)\\n.mousewheel(Gadfly.guide_background_scroll)\\n.drag(Gadfly.guide_background_drag_onmove,\\n Gadfly.guide_background_drag_onstart,\\n Gadfly.guide_background_drag_onend)\\n;\"],false,:none)" 825 | ] 826 | }, 827 | "metadata": {}, 828 | "output_type": "display_data" 829 | }, 830 | { 831 | "name": "stderr", 832 | "output_type": "stream", 833 | "text": [ 834 | "WARNING: groupby(xs, keyfunc) should be groupby(keyfunc, xs)\n" 835 | ] 836 | } 837 | ], 838 | "source": [ 839 | "h_plot = plot(x=(0:n)*getValue(Δt),y=getValue(h)[1:n], Geom.line,\n", 840 | " Guide.xlabel(\"Time (s)\"), Guide.ylabel(\"Altitude\"))\n", 841 | "m_plot = plot(x=(0:n)*getValue(Δt),y=getValue(m)[1:n], Geom.line,\n", 842 | " Guide.xlabel(\"Time (s)\"), Guide.ylabel(\"Mass\"))\n", 843 | "v_plot = plot(x=(0:n)*getValue(Δt),y=getValue(v)[1:n], Geom.line,\n", 844 | " Guide.xlabel(\"Time (s)\"), Guide.ylabel(\"Velocity\"))\n", 845 | "T_plot = plot(x=(0:n)*getValue(Δt),y=getValue(T)[1:n], Geom.line,\n", 846 | " Guide.xlabel(\"Time (s)\"), Guide.ylabel(\"Thrust\"))\n", 847 | "draw(SVG(6inch, 6inch), vstack( hstack(h_plot,m_plot),\n", 848 | " hstack(v_plot,T_plot)))" 849 | ] 850 | } 851 | ], 852 | "metadata": { 853 | "kernelspec": { 854 | "display_name": "Julia 0.3.7", 855 | "language": "julia", 856 | "name": "julia 0.3" 857 | }, 858 | "language_info": { 859 | "name": "julia", 860 | "version": "0.3.7" 861 | } 862 | }, 863 | "nbformat": 4, 864 | "nbformat_minor": 0 865 | } 866 | --------------------------------------------------------------------------------