# ifndef CPPAD_SIN_COS_INCLUDED # define CPPAD_SIN_COS_INCLUDED /* -------------------------------------------------------------------------- CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-06 Bradley M. Bell CppAD is distributed under multiple licenses. This distribution is under the terms of the Common Public License Version 1.0. A copy of this license is included in the COPYING file of this distribution. Please visit http://www.coin-or.org/CppAD/ for information on other licenses. -------------------------------------------------------------------------- */ /* $begin ForSinCos$$spell Hyp Sin Cos Taylor const inline Op ps$$$index forward, cos$$index forward, cosh$$ $index forward, sin$$index forward, sinh$$$index cos, forward$$index cosh, forward$$ $index sin, forward$$index sinh, forward$$$index ForSinCos$$section Forward Mode Trigonometric and Hyperbolic Sine and Cosine$$ $head Syntax$$syntax%inline void For%Type%SinCos(size_t %d%, %Base% *%s%, %Base% *%c%, const %Base% *%x%)%$$$head Description$$Computes the italic d$$ order Taylor coefficient for $latex S$$and latex C$$ where are given by$table $italic Type$$cnext latex S$$$cnext $latex C$$rnext code Trig$$$cnext $latex \sin [ X(t) ]$$cnext latex \cos [ X(t) ]$$$rnext $code Hyp$$cnext latex \sinh[ X(t) ]$$$cnext $latex \cosh [ X(t) ]$$tend head x$$ The vector$italic x$$has length latex d+1$$ and contains the $th d$$order Taylor coefficient matrix for italic X$$.$head s$$The vector italic s$$ has length $latex d+1$$. On input it contains the th d-1$$ order Taylor coefficient matrix for$italic S$$. On output it contains the th d$$ order Taylor coefficient matrix for $italic S$$; i.e., syntax%%s%[%d%]%$$ is set equal to the$th d$$Taylor coefficient for the function latex S$$. $head c$$The vector italic c$$ has length$latex d+1$$. On input it contains the th d-1$$ order Taylor coefficient matrix for $italic C$$. On output it contains the th d$$ order Taylor coefficient matrix for$italic C$$; i.e., syntax%%c%[%d%]%$$ is set equal to the $th d$$Taylor coefficient for the function latex C$$.$end ------------------------------------------------------------------------------ $begin RevSinCos$$spell Hyp Cos Cosh ps Sin Taylor const inline Op px py pz$$$index reverse, cos$$index reverse, cosh$$ $index reverse, sin$$index reverse, sinh$$$index cos, reverse$$index cosh, reverse$$ $index sin, reverse$$index sinh, reverse$$$index RevSinCos$$section Reverse Mode Sine and Cosine Functions$$ $head Syntax$$syntax%inline void Rev%Type%SinCos(size_t %d%, const %Base% *%s%, const %Base% *%c%, const %Base% *%x%, %Base% *%ps%, %Base% *%pc%, %Base% *%px%)%$$$head Description$$We are given the partial derivatives for a function latex G(s, c, x)$$ and we wish to compute the partial derivatives for the function $latex $H(x) = G [ S(x) , C(x) , x ]$$$where latex S(x)$$ and$latex C(x)$$are defined as the th d$$ order Taylor coefficient matrix for sine and cosine as a function of the corresponding matrix for $italic X$$; i.e., table italic Type$$$cnext $latex S$$cnext latex C$$$rnext $code Trig$$cnext latex \sin [ X(t) ]$$$cnext $latex \cos [ X(t) ]$$rnext code Hyp$$$cnext $latex \sinh[ X(t) ]$$cnext latex \cosh [ X(t) ]$$$tend Note that $italic S$$and latex C$$ have been used both the original functions and for the corresponding mapping of Taylor coefficients.$head x$$The vector italic x$$ has length $latex d+1$$and contains the th d$$ order Taylor coefficient matrix for$italic X$$. head s$$ The vector $italic s$$has length latex d+1$$ and contains$th d$$order Taylor coefficient matrix for italic S$$. $head c$$The vector italic c$$ has length$latex d+1$$and contains th d$$ order Taylor coefficient matrix for $italic C$$. head On Input$$$subhead px$$The vector italic px$$ has length $latex d+1$$and syntax%%px%[%j%]%$$ contains the partial for$italic G$$with respect to the th j$$ order Taylor coefficient for $italic X$$. subhead ps$$ The vector$italic ps$$has length latex d+1$$ and $syntax%%ps%[%j%]%$$contains the partial for italic G$$ with respect to the$th j$$order Taylor coefficient for italic S$$. $subhead pc$$The vector italic pc$$ has length$latex d+1$$and syntax%%pc%[%j%]%$$ contains the partial for $italic G$$with respect to the th j$$ order Taylor coefficient for$italic C$$. head On Output$$ $subhead px$$The vector italic px$$ has length$latex d+1$$and syntax%%px%[%j%]%$$ contains the partial for $italic H$$with respect to the th j$$ order Taylor coefficient for$italic X$$. subhead ps$$ The vector $italic ps$$has length latex d+1$$ and its contents are no longer specified; i.e., it has been used for work space.$subhead pc$$The vector italic pc$$ has length $latex d+1$$and its contents are no longer specified; i.e., it has been used for work space.$end ------------------------------------------------------------------------------ */ // BEGIN CppAD namespace namespace CppAD { template inline void ForTrigSinCos(size_t j, Base *s, Base *c, const Base *x) { size_t k; if( j == 0 ) { s[j] = sin( x[0] ); c[j] = cos( x[0] ); } else { s[j] = Base(0); c[j] = Base(0); for(k = 1; k <= j; k++) { s[j] += Base(k) * x[k] * c[j-k]; c[j] -= Base(k) * x[k] * s[j-k]; } s[j] /= Base(j); c[j] /= Base(j); } } template inline void ForHypSinCos(size_t j, Base *s, Base *c, const Base *x) { size_t k; if( j == 0 ) { s[j] = sinh( x[0] ); c[j] = cosh( x[0] ); } else { s[j] = Base(0); c[j] = Base(0); for(k = 1; k <= j; k++) { s[j] += Base(k) * x[k] * c[j-k]; c[j] += Base(k) * x[k] * s[j-k]; } s[j] /= Base(j); c[j] /= Base(j); } } template inline void RevTrigSinCos(size_t d, const Base *s, const Base *c, const Base *x, Base *ps, Base *pc, Base *px) { size_t k; // number of indices to access size_t j = d; while(j) { ps[j] /= Base(j); pc[j] /= Base(j); for(k = 1; k <= j; k++) { px[k] += ps[j] * Base(k) * c[j-k]; px[k] -= pc[j] * Base(k) * s[j-k]; ps[j-k] -= pc[j] * Base(k) * x[k]; pc[j-k] += ps[j] * Base(k) * x[k]; } --j; } px[0] += ps[0] * c[0]; px[0] -= pc[0] * s[0]; } template inline void RevHypSinCos(size_t d, const Base *s, const Base *c, const Base *x, Base *ps, Base *pc, Base *px) { size_t k; // number of indices to access size_t j = d; while(j) { ps[j] /= Base(j); pc[j] /= Base(j); for(k = 1; k <= j; k++) { px[k] += ps[j] * Base(k) * c[j-k]; px[k] += pc[j] * Base(k) * s[j-k]; ps[j-k] += pc[j] * Base(k) * x[k]; pc[j-k] += ps[j] * Base(k) * x[k]; } --j; } px[0] += ps[0] * c[0]; px[0] += pc[0] * s[0]; } } // END CppAD namespace # endif