Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #include <acado/utils/acado_utils.hpp>
00036 #include <acado/symbolic_operator/symbolic_operator.hpp>
00037
00038
00039 double dAtan(double x){
00040 return 1/(1+x*x);
00041 }
00042
00043
00044 double ddAtan(double x){
00045 double v1 = 1+x*x;
00046 return -2*x/v1/v1;
00047 }
00048
00049 BEGIN_NAMESPACE_ACADO
00050
00051
00052 Atan::Atan():UnaryOperator(){
00053 cName = "atan";
00054
00055 fcn = &atan;
00056 dfcn = &dAtan;
00057 ddfcn = &ddAtan;
00058
00059 operatorName = ON_ATAN;
00060
00061 }
00062
00063 Atan::Atan( Operator *_argument ):UnaryOperator(_argument){
00064 cName = "atan";
00065
00066 fcn = &atan;
00067 dfcn = &dAtan;
00068 ddfcn = &ddAtan;
00069
00070 operatorName = ON_ATAN;
00071 }
00072
00073
00074 Atan::Atan( const Atan &arg ):UnaryOperator(arg){
00075 cName = "atan";
00076
00077 fcn = &atan;
00078 dfcn = &dAtan;
00079 ddfcn = &ddAtan;
00080
00081 operatorName = ON_ATAN;
00082 }
00083
00084
00085 Atan::~Atan(){
00086
00087 }
00088
00089
00090 Atan& Atan::operator=( const Atan &arg ){
00091
00092 UnaryOperator::operator=(arg);
00093
00094 return *this;
00095 }
00096
00097
00098 returnValue Atan::evaluate( EvaluationBase *x ){
00099
00100 x->Atan(*argument);
00101 return SUCCESSFUL_RETURN;
00102 }
00103
00104
00105 Operator* Atan::substitute( int index, const Operator *sub ){
00106
00107 return new Atan( argument->substitute( index , sub ) );
00108
00109 }
00110
00111 Operator* Atan::clone() const{
00112
00113 return new Atan(*this);
00114 }
00115
00116 returnValue Atan::initDerivative() {
00117
00118 if( initialized ) return SUCCESSFUL_RETURN;
00119 initialized = BT_TRUE;
00120
00121 derivative = convert2TreeProjection(
00122 new Quotient(
00123 new DoubleConstant( 1.0 , NE_ONE ),
00124 new Addition(
00125 new DoubleConstant( 1.0 , NE_ONE ),
00126 new Power_Int(
00127 argument->clone(),
00128 2
00129 )
00130 )
00131 ));
00132 derivative2 = convert2TreeProjection(
00133 new Product( new DoubleConstant( -2.0 , NE_NEITHER_ONE_NOR_ZERO ),
00134 new Product(
00135 new Power(
00136 new Addition(
00137 new DoubleConstant(1.0 , NE_ONE),
00138 new Power_Int(
00139 argument->clone(),
00140 2
00141 )
00142 ),
00143 new DoubleConstant( -2.0 , NE_NEITHER_ONE_NOR_ZERO )
00144 ),
00145 argument->clone()
00146 )
00147 ));
00148
00149 return argument->initDerivative();
00150 }
00151
00152
00153 CLOSE_NAMESPACE_ACADO
00154
00155