Goddart's rocket problem (Bocop)

From mintOC
Revision as of 18:50, 31 January 2016 by FelixMueller (Talk | contribs)

Jump to: navigation, search

This is a Bocop implementation of Goddart's rocket problem.

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

#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;
}