Differentiator.h
Go to the documentation of this file.00001 #ifndef SimTK_DIFFERENTIATOR_H_
00002 #define SimTK_DIFFERENTIATOR_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00032 #include "SimTKcommon.h"
00033 #include "internal/common.h"
00034 #include "SimTKcommon/internal/BigMatrix.h"
00035
00036 namespace SimTK {
00037
00038
00049 class SimTK_SIMMATH_EXPORT Differentiator {
00050 public:
00051
00052 class ScalarFunction;
00053 class GradientFunction;
00054 class JacobianFunction;
00055 class Function;
00056
00057
00058 class OpNotAllowedForFunctionOfThisShape;
00059 class UserFunctionThrewAnException;
00060 class UserFunctionReturnedNonzeroStatus;
00061 class UnknownMethodSpecified;
00062
00063
00064 enum Method {
00065 UnspecifiedMethod=0,
00066 ForwardDifference=1,
00067 CentralDifference=2
00068 };
00069 static bool isValidMethod(Method);
00070 static const char* getMethodName(Method);
00071 static int getMethodOrder(Method);
00072
00073 virtual ~Differentiator();
00074 explicit Differentiator(const Function& f,
00075 Method defaultMethod=UnspecifiedMethod);
00076
00077
00078
00079 Differentiator& setDefaultMethod(Method);
00080 Method getDefaultMethod() const;
00081
00082
00083
00084 void calcDerivative(Real y0, Real fy0, Real& dfdy,
00085 Method=UnspecifiedMethod) const;
00086 void calcGradient (const Vector& y0, Real fy0, Vector& gf,
00087 Method=UnspecifiedMethod) const;
00088 void calcJacobian (const Vector& y0, const Vector& fy0, Matrix& dfdy,
00089 Method=UnspecifiedMethod) const;
00090
00091
00092
00093
00094 Real calcDerivative(Real y0, Method=UnspecifiedMethod) const;
00095 Vector calcGradient (const Vector& y0, Method=UnspecifiedMethod) const;
00096 Matrix calcJacobian (const Vector& y0, Method=UnspecifiedMethod) const;
00097
00098
00099 void resetAllStatistics();
00100 long getNDifferentiations() const;
00101 long getNDifferentiationFailures() const;
00102 long getNCallsToUserFunction() const;
00103
00104
00105 class DifferentiatorRep;
00106 private:
00107
00108 DifferentiatorRep* rep;
00109 };
00110
00124 class SimTK_SIMMATH_EXPORT Differentiator::Function {
00125 public:
00126 Function& setNFunctions(int);
00127 Function& setNParameters(int);
00128 Function& setEstimatedAccuracy(Real);
00129
00130
00131 int getNFunctions() const;
00132 int getNParameters() const;
00133 Real getEstimatedAccuracy() const;
00134
00135
00136 void resetAllStatistics();
00137 long getNCalls() const;
00138 long getNFailures() const;
00139
00140
00141 class FunctionRep;
00142 protected:
00143 Function();
00144 ~Function();
00145
00146
00147 FunctionRep* rep;
00148
00149 private:
00150
00151 Function(const Function&);
00152 Function& operator=(const Function&);
00153
00154 friend class Differentiator;
00155 };
00156
00161 class SimTK_SIMMATH_EXPORT Differentiator::ScalarFunction : public Differentiator::Function {
00162 public:
00163 virtual int f(Real x, Real& fx) const=0;
00164
00165 protected:
00166 explicit ScalarFunction(Real acc=-1);
00167 virtual ~ScalarFunction() { }
00168
00169 private:
00170
00171 ScalarFunction(const Function&);
00172 ScalarFunction& operator=(const Function&);
00173 };
00174
00180 class SimTK_SIMMATH_EXPORT Differentiator::GradientFunction : public Differentiator::Function {
00181 public:
00182 virtual int f(const Vector& y, Real& fy) const=0;
00183
00184 protected:
00185 explicit GradientFunction(int ny=-1, Real acc=-1);
00186 virtual ~GradientFunction() { }
00187
00188 private:
00189
00190 GradientFunction(const GradientFunction&);
00191 GradientFunction& operator=(const GradientFunction&);
00192 };
00193
00199 class SimTK_SIMMATH_EXPORT Differentiator::JacobianFunction : public Differentiator::Function {
00200 public:
00201 virtual int f(const Vector& y, Vector& fy) const=0;
00202
00203 protected:
00204 explicit JacobianFunction(int nf=-1, int ny=-1, Real acc=-1);
00205 virtual ~JacobianFunction() { }
00206
00207 private:
00208
00209 JacobianFunction(const JacobianFunction&);
00210 JacobianFunction& operator=(const JacobianFunction&);
00211 };
00212
00213 }
00214
00215 #endif // SimTK_DIFFERENTIATOR_H_