00001 /* 00002 * This file is part of ACADO Toolkit. 00003 * 00004 * ACADO Toolkit -- A Toolkit for Automatic Control and Dynamic Optimization. 00005 * Copyright (C) 2008-2014 by Boris Houska, Hans Joachim Ferreau, 00006 * Milan Vukov, Rien Quirynen, KU Leuven. 00007 * Developed within the Optimization in Engineering Center (OPTEC) 00008 * under supervision of Moritz Diehl. All rights reserved. 00009 * 00010 * ACADO Toolkit is free software; you can redistribute it and/or 00011 * modify it under the terms of the GNU Lesser General Public 00012 * License as published by the Free Software Foundation; either 00013 * version 3 of the License, or (at your option) any later version. 00014 * 00015 * ACADO Toolkit is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 * Lesser General Public License for more details. 00019 * 00020 * You should have received a copy of the GNU Lesser General Public 00021 * License along with ACADO Toolkit; if not, write to the Free Software 00022 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00023 * 00024 */ 00025 00026 00034 #include <acado_optimal_control.hpp> 00035 #include <acado_gnuplot.hpp> 00036 00037 using namespace std; 00038 00039 USING_NAMESPACE_ACADO 00040 00041 int main( ) 00042 { 00043 // Parameters 00044 double h_hw = 10; // water level 00045 double A_hw = 1.0; // amplitude of the waves 00046 double T_hw = 5.0; // duration of a wave 00047 double rho = 1000; // density of water 00048 double A = 1.0; // bottom area of the buoy 00049 double m = 100; // mass of the buoy 00050 double g = 9.81; // gravitational constant 00051 00052 // Free varameter 00053 double a = 1.0; // take to be constant here 00054 00055 // Variables 00056 DifferentialState h; // Position of the buoy 00057 DifferentialState v; // Velocity of the buoy 00058 DifferentialState w; // Produced wave energy 00059 TIME t; 00060 00061 // Differential equation 00062 DifferentialEquation f; 00063 00064 // Height of the wave 00065 IntermediateState hw; 00066 hw = h_hw + A_hw*sin(2*M_PI*t/T_hw); 00067 f << dot(h) == v; 00068 f << dot(v) == rho*A*(hw-h)/m - g - a*v; 00069 f << dot(w) == a*v*v; 00070 00071 // Define an initial value: 00072 // ------------------------ 00073 DVector xStart( 3 ); 00074 xStart(0) = h_hw - 2.0*A_hw; 00075 xStart(1) = 0.0; 00076 xStart(2) = 0.0; 00077 00078 Grid timeHorizon( 0.0,25.0 ); 00079 00080 // DEFINE AN INTEGRATOR: 00081 // --------------------- 00082 00083 IntegrationAlgorithm intAlg; 00084 00085 intAlg.addStage( f, timeHorizon, INT_RK45 ); 00086 00087 intAlg.set( INTEGRATOR_PRINTLEVEL, MEDIUM ); 00088 intAlg.set( PLOT_RESOLUTION, HIGH ); 00089 intAlg.set( FREEZE_INTEGRATOR, NO ); 00090 00091 GnuplotWindow window; 00092 window.addSubplot( h ); 00093 window.addSubplot( v ); 00094 window.addSubplot( w ); 00095 00096 intAlg << window; 00097 00098 // START THE INTEGRATION: 00099 // ---------------------- 00100 00101 intAlg.integrate( timeHorizon, xStart ); 00102 00103 return 0; 00104 } 00105 00106 00107