Difference between revisions of "Goddart's rocket problem (Bocop)"
From mintOC
FelixMueller (Talk | contribs) (Created page with "Code for Goddart's rocket problem in Bocop belongs here. Category: Bocop") |
|||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | + | This is a [[:Category: Bocop | Bocop]] implementation of [[Goddart's rocket problem]]. The .def, .constants and .bounds files can be obtained through defining the problems dimensions in the GUI. The .tpp files need to be edited separately. | |
+ | == Problem.def == | ||
+ | <source lang="text"> | ||
+ | # This file defines all dimensions and parameters | ||
+ | # values for your problem : | ||
+ | |||
+ | # Initial and final time : | ||
+ | time.free string final | ||
+ | time.initial double 0 | ||
+ | time.final double 1 | ||
+ | |||
+ | # Dimensions : | ||
+ | state.dimension integer 3 | ||
+ | control.dimension integer 1 | ||
+ | algebraic.dimension integer 0 | ||
+ | parameter.dimension integer 1 | ||
+ | constant.dimension integer 6 | ||
+ | boundarycond.dimension integer 4 | ||
+ | constraint.dimension integer 1 | ||
+ | |||
+ | # Discretization : | ||
+ | discretization.steps integer 100 | ||
+ | discretization.method string gauss | ||
+ | |||
+ | # Optimization : | ||
+ | optimization.type string batch | ||
+ | batch.type integer 0 | ||
+ | batch.index integer 5 | ||
+ | batch.nrange integer 3 | ||
+ | batch.lowerbound double 0.3 | ||
+ | batch.upperbound double 0.9 | ||
+ | batch.directory string Batch-C | ||
+ | |||
+ | # Initialization : | ||
+ | initialization.type string from_init_file | ||
+ | initialization.file string none | ||
+ | |||
+ | # Parameter identification : | ||
+ | paramid.type string false | ||
+ | paramid.separator string , | ||
+ | paramid.file string no_directory | ||
+ | paramid.dimension integer 0 | ||
+ | |||
+ | # Names : | ||
+ | state.0 string position | ||
+ | state.1 string speed | ||
+ | state.2 string mass | ||
+ | control.0 string acceleration_u | ||
+ | parameter.0 string finaltime | ||
+ | boundarycond.0 string r(0) | ||
+ | boundarycond.1 string v(0) | ||
+ | boundarycond.2 string m(0) | ||
+ | boundarycond.3 string r(f) | ||
+ | constraint.0 string drag_minus_C | ||
+ | constant.0 string Tmax | ||
+ | constant.1 string A | ||
+ | constant.2 string k | ||
+ | constant.3 string r0 | ||
+ | constant.4 string b | ||
+ | constant.5 string C | ||
+ | |||
+ | # Solution file : | ||
+ | solution.file string problem.sol | ||
+ | |||
+ | # Iteration output frequency : | ||
+ | iteration.output.frequency integer 0 | ||
+ | </source> | ||
+ | |||
+ | == Problem.constants == | ||
+ | <source lang="text"> | ||
+ | # This file contains the values of the constants of your problem. | ||
+ | # Number of constants used in your problem : | ||
+ | 6 | ||
+ | |||
+ | # Values of the constants : | ||
+ | 3.5 | ||
+ | 310 | ||
+ | 500 | ||
+ | 1 | ||
+ | 7 | ||
+ | 0.6 | ||
+ | |||
+ | </source> | ||
+ | |||
+ | == Problem.bounds == | ||
+ | <source lang="text"> | ||
+ | # This file contains all the bounds of your problem. | ||
+ | # Bounds are stored in standard format : | ||
+ | # [lower bound] [upper bound] [type of bound] | ||
+ | |||
+ | # Dimensions (i&f conditions, y, u, z, p, path constraints) : | ||
+ | 4 3 1 0 1 1 | ||
+ | |||
+ | # Bounds for the initial and final conditions : | ||
+ | 1 1 equal | ||
+ | 0 0 equal | ||
+ | 1 1 equal | ||
+ | 1.01 2e+020 lower | ||
+ | |||
+ | # Bounds for the state variables : | ||
+ | >0:1:0 1 2e+020 lower | ||
+ | >1:1:1 0 2e+020 lower | ||
+ | >2:1:2 0 2e+020 lower | ||
+ | |||
+ | # Bounds for the control variables : | ||
+ | 0 1 both | ||
+ | |||
+ | # Bounds for the algebraic variables : | ||
+ | |||
+ | # Bounds for the optimization parameters : | ||
+ | 0 2e+020 lower | ||
+ | |||
+ | # Bounds for the path constraints : | ||
+ | -2e+020 0 upper | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == criterion.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "header_criterion" | ||
+ | { | ||
+ | // CRITERION FOR GODDARD PROBLEM | ||
+ | |||
+ | // MAXIMIZE FINAL MASS | ||
+ | criterion = -final_state[2]; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == dynamics.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "header_dynamics" | ||
+ | { | ||
+ | // DYNAMICS FOR GODDARD PROBLEM | ||
+ | // dr/dt = v | ||
+ | // dv/dt = (Thrust(u) - Drag(r,v)) / m - grav(r) | ||
+ | // dm/dt = -b*|u| | ||
+ | |||
+ | double Tmax = constants[0]; | ||
+ | double A = constants[1]; | ||
+ | double k = constants[2]; | ||
+ | double r0 = constants[3]; | ||
+ | double b = constants[4]; | ||
+ | |||
+ | Tdouble r = state[0]; | ||
+ | Tdouble v = state[1]; | ||
+ | Tdouble m = state[2]; | ||
+ | |||
+ | state_dynamics[0] = v; | ||
+ | state_dynamics[1] = (thrust(control[0],Tmax) - drag(r,v,A,k,r0)) / m - grav(r); | ||
+ | state_dynamics[2] = - b * control[0]; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == boundarycond.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "header_boundarycond" | ||
+ | { | ||
+ | // INITIAL CONDITIONS FOR GODDARD PROBLEM | ||
+ | // r0 = 1 v0 = 0 m0 = 1 | ||
+ | // MODELED AS 1 <= r0 <= 1, etc | ||
+ | boundary_conditions[0] = initial_state[0]; | ||
+ | boundary_conditions[1] = initial_state[1]; | ||
+ | boundary_conditions[2] = initial_state[2]; | ||
+ | |||
+ | // FINAL CONDITIONS FOR GODDARD PROBLEM | ||
+ | // rf >= 1.01 MODELED AS 1.01 <= rf | ||
+ | boundary_conditions[3] = final_state[0]; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == pathcond.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "header_pathcond" | ||
+ | { | ||
+ | // CONSTRAINT ON MAX DRAG FOR GODDARD PROBLEM | ||
+ | // Drag <= C ie Drag - C <= 0 | ||
+ | |||
+ | double A = constants[1]; | ||
+ | double k = constants[2]; | ||
+ | double r0 = constants[3]; | ||
+ | double C = constants[5]; | ||
+ | |||
+ | Tdouble r = state[0]; | ||
+ | Tdouble v = state[1]; | ||
+ | |||
+ | path_constraints[0] = drag(r,v,A,k,r0) - C; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == dependencies.tpp == | ||
+ | The dependencies file is only needed if you use additional functions like the three following. | ||
+ | <source lang="cpp"> | ||
+ | #include "./grav.tpp" | ||
+ | #include "./drag.tpp" | ||
+ | #include "./thrust.tpp" | ||
+ | </source> | ||
+ | |||
+ | == drag.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "adolc/adolc.h" | ||
+ | #include "adolc/adouble.h" | ||
+ | #include <cmath> | ||
+ | |||
+ | // FUNCTION FOR GODDARD DRAG | ||
+ | // drag = 310 v^2 exp (-500(r-1)) | ||
+ | |||
+ | // Arguments: | ||
+ | // r: radius | ||
+ | // v: velocity | ||
+ | |||
+ | template<class Tdouble> Tdouble drag(Tdouble r, Tdouble v, double A, double k, double r0) | ||
+ | { | ||
+ | |||
+ | Tdouble drag; | ||
+ | drag = A * v * v * exp(-k*(fabs(r)-r0)); | ||
+ | return drag; | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == grav.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "adolc/adolc.h" | ||
+ | #include "adolc/adouble.h" | ||
+ | #include <cmath> | ||
+ | |||
+ | // FUNCTION FOR GRAVITY | ||
+ | // g = 1 / r^2 | ||
+ | |||
+ | // Arguments: | ||
+ | // r: radius | ||
+ | |||
+ | template<class Tdouble> Tdouble grav(Tdouble r) | ||
+ | { | ||
+ | |||
+ | Tdouble grav; | ||
+ | grav = 1e0 / r / r; | ||
+ | return grav; | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == thrust.tpp == | ||
+ | <source lang="cpp"> | ||
+ | #include "adolc/adolc.h" | ||
+ | #include "adolc/adouble.h" | ||
+ | #include <cmath> | ||
+ | |||
+ | // FUNCTION FOR THRUST (GODDARD) | ||
+ | // T = u * Tmax | ||
+ | |||
+ | // Arguments: | ||
+ | // r: radius | ||
+ | |||
+ | template<class Tdouble> Tdouble thrust(Tdouble u, double Tmax) | ||
+ | { | ||
+ | Tdouble thrust; | ||
+ | thrust = u * Tmax; | ||
+ | return thrust; | ||
+ | } | ||
+ | |||
+ | </source> | ||
[[Category: Bocop]] | [[Category: Bocop]] |
Latest revision as of 17:56, 1 February 2016
This is a Bocop implementation of Goddart's rocket problem. The .def, .constants and .bounds files can be obtained through defining the problems dimensions in the GUI. The .tpp files need to be edited separately.
Contents
Problem.def
# This file defines all dimensions and parameters # values for your problem : # Initial and final time : time.free string final time.initial double 0 time.final double 1 # Dimensions : state.dimension integer 3 control.dimension integer 1 algebraic.dimension integer 0 parameter.dimension integer 1 constant.dimension integer 6 boundarycond.dimension integer 4 constraint.dimension integer 1 # Discretization : discretization.steps integer 100 discretization.method string gauss # Optimization : optimization.type string batch batch.type integer 0 batch.index integer 5 batch.nrange integer 3 batch.lowerbound double 0.3 batch.upperbound double 0.9 batch.directory string Batch-C # Initialization : initialization.type string from_init_file initialization.file string none # Parameter identification : paramid.type string false paramid.separator string , paramid.file string no_directory paramid.dimension integer 0 # Names : state.0 string position state.1 string speed state.2 string mass control.0 string acceleration_u parameter.0 string finaltime boundarycond.0 string r(0) boundarycond.1 string v(0) boundarycond.2 string m(0) boundarycond.3 string r(f) constraint.0 string drag_minus_C constant.0 string Tmax constant.1 string A constant.2 string k constant.3 string r0 constant.4 string b constant.5 string C # Solution file : solution.file string problem.sol # Iteration output frequency : iteration.output.frequency integer 0
Problem.constants
# This file contains the values of the constants of your problem. # Number of constants used in your problem : 6 # Values of the constants : 3.5 310 500 1 7 0.6
Problem.bounds
# This file contains all the bounds of your problem. # Bounds are stored in standard format : # [lower bound] [upper bound] [type of bound] # Dimensions (i&f conditions, y, u, z, p, path constraints) : 4 3 1 0 1 1 # Bounds for the initial and final conditions : 1 1 equal 0 0 equal 1 1 equal 1.01 2e+020 lower # Bounds for the state variables : >0:1:0 1 2e+020 lower >1:1:1 0 2e+020 lower >2:1:2 0 2e+020 lower # Bounds for the control variables : 0 1 both # Bounds for the algebraic variables : # Bounds for the optimization parameters : 0 2e+020 lower # Bounds for the path constraints : -2e+020 0 upper
criterion.tpp
#include "header_criterion" { // CRITERION FOR GODDARD PROBLEM // MAXIMIZE FINAL MASS criterion = -final_state[2]; }
dynamics.tpp
#include "header_dynamics" { // DYNAMICS FOR GODDARD PROBLEM // dr/dt = v // dv/dt = (Thrust(u) - Drag(r,v)) / m - grav(r) // dm/dt = -b*|u| double Tmax = constants[0]; double A = constants[1]; double k = constants[2]; double r0 = constants[3]; double b = constants[4]; Tdouble r = state[0]; Tdouble v = state[1]; Tdouble m = state[2]; state_dynamics[0] = v; state_dynamics[1] = (thrust(control[0],Tmax) - drag(r,v,A,k,r0)) / m - grav(r); state_dynamics[2] = - b * control[0]; }
boundarycond.tpp
#include "header_boundarycond" { // INITIAL CONDITIONS FOR GODDARD PROBLEM // r0 = 1 v0 = 0 m0 = 1 // MODELED AS 1 <= r0 <= 1, etc boundary_conditions[0] = initial_state[0]; boundary_conditions[1] = initial_state[1]; boundary_conditions[2] = initial_state[2]; // FINAL CONDITIONS FOR GODDARD PROBLEM // rf >= 1.01 MODELED AS 1.01 <= rf boundary_conditions[3] = final_state[0]; }
pathcond.tpp
#include "header_pathcond" { // CONSTRAINT ON MAX DRAG FOR GODDARD PROBLEM // Drag <= C ie Drag - C <= 0 double A = constants[1]; double k = constants[2]; double r0 = constants[3]; double C = constants[5]; Tdouble r = state[0]; Tdouble v = state[1]; path_constraints[0] = drag(r,v,A,k,r0) - C; }
dependencies.tpp
The dependencies file is only needed if you use additional functions like the three following.
#include "./grav.tpp" #include "./drag.tpp" #include "./thrust.tpp"
drag.tpp
#include "adolc/adolc.h" #include "adolc/adouble.h" #include <cmath> // FUNCTION FOR GODDARD DRAG // drag = 310 v^2 exp (-500(r-1)) // Arguments: // r: radius // v: velocity template<class Tdouble> Tdouble drag(Tdouble r, Tdouble v, double A, double k, double r0) { Tdouble drag; drag = A * v * v * exp(-k*(fabs(r)-r0)); return drag; }
grav.tpp
#include "adolc/adolc.h" #include "adolc/adouble.h" #include <cmath> // FUNCTION FOR GRAVITY // g = 1 / r^2 // Arguments: // r: radius template<class Tdouble> Tdouble grav(Tdouble r) { Tdouble grav; grav = 1e0 / r / r; return grav; }
thrust.tpp
#include "adolc/adolc.h" #include "adolc/adouble.h" #include <cmath> // FUNCTION FOR THRUST (GODDARD) // T = u * Tmax // Arguments: // r: radius template<class Tdouble> Tdouble thrust(Tdouble u, double Tmax) { Tdouble thrust; thrust = u * Tmax; return thrust; }