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
00027
00028
00029
00030
00031
00032
00033
00034
00040 #include "SimTKcommon.h"
00041 #include "internal/common.h"
00042 #include "SimTKcommon/internal/BigMatrix.h"
00043
00044 namespace SimTK {
00045
00046
00086 class SimTK_SIMMATH_EXPORT Differentiator {
00087 public:
00088
00089 class ScalarFunction;
00090 class GradientFunction;
00091 class JacobianFunction;
00092 class Function;
00093
00094
00095 class OpNotAllowedForFunctionOfThisShape;
00096 class UserFunctionThrewAnException;
00097 class UserFunctionReturnedNonzeroStatus;
00098 class UnknownMethodSpecified;
00099
00100
00101 enum Method {
00102 UnspecifiedMethod=0,
00103 ForwardDifference=1,
00104 CentralDifference=2
00105 };
00106 static bool isValidMethod(Method);
00107 static const char* getMethodName(Method);
00108 static int getMethodOrder(Method);
00109
00110 virtual ~Differentiator();
00111 explicit Differentiator(const Function& f,
00112 Method defaultMethod=UnspecifiedMethod);
00113
00114
00115
00116 Differentiator& setDefaultMethod(Method);
00117 Method getDefaultMethod() const;
00118
00119
00120
00121 void calcDerivative(Real y0, Real fy0, Real& dfdy,
00122 Method=UnspecifiedMethod) const;
00123 void calcGradient (const Vector& y0, Real fy0, Vector& gf,
00124 Method=UnspecifiedMethod) const;
00125 void calcJacobian (const Vector& y0, const Vector& fy0, Matrix& dfdy,
00126 Method=UnspecifiedMethod) const;
00127
00128
00129
00130
00131 Real calcDerivative(Real y0, Method=UnspecifiedMethod) const;
00132 Vector calcGradient (const Vector& y0, Method=UnspecifiedMethod) const;
00133 Matrix calcJacobian (const Vector& y0, Method=UnspecifiedMethod) const;
00134
00135
00136 void resetAllStatistics();
00137 int getNumDifferentiations() const;
00138 int getNumDifferentiationFailures() const;
00139 int getNumCallsToUserFunction() const;
00140
00141
00142 class DifferentiatorRep;
00143 private:
00144
00145 DifferentiatorRep* rep;
00146
00147 private:
00148
00149 int getNDifferentiations() const {return getNumDifferentiations();}
00150 int getNDifferentiationFailures() const {return getNumDifferentiationFailures();}
00151 int getNCallsToUserFunction() const {return getNumCallsToUserFunction();}
00152 };
00153
00167 class SimTK_SIMMATH_EXPORT Differentiator::Function {
00168 public:
00169 Function& setNumFunctions(int);
00170 Function& setNumParameters(int);
00171 Function& setEstimatedAccuracy(Real);
00172
00173
00174 int getNumFunctions() const;
00175 int getNumParameters() const;
00176 Real getEstimatedAccuracy() const;
00177
00178
00179 void resetAllStatistics();
00180 int getNumCalls() const;
00181 int getNumFailures() const;
00182
00183
00184 class FunctionRep;
00185 protected:
00186 Function();
00187 ~Function();
00188
00189
00190 FunctionRep* rep;
00191
00192 private:
00193
00194 Function(const Function&);
00195 Function& operator=(const Function&);
00196
00197 private:
00198
00199 Function& setNFunctions(int n) {return setNumFunctions(n);}
00200 Function& setNParameters(int n) {return setNumParameters(n);}
00201 int getNFunctions() const {return getNumFunctions();}
00202 int getNParameters() const {return getNumParameters();}
00203 int getNCalls() const {return getNumCalls();}
00204 int getNFailures() const {return getNumFailures();}
00205
00206
00207
00208 friend class Differentiator;
00209 };
00210
00215 class SimTK_SIMMATH_EXPORT Differentiator::ScalarFunction : public Differentiator::Function {
00216 public:
00217 virtual int f(Real x, Real& fx) const=0;
00218
00219 protected:
00220 explicit ScalarFunction(Real acc=-1);
00221 virtual ~ScalarFunction() { }
00222
00223 private:
00224
00225 ScalarFunction(const Function&);
00226 ScalarFunction& operator=(const Function&);
00227 };
00228
00234 class SimTK_SIMMATH_EXPORT Differentiator::GradientFunction : public Differentiator::Function {
00235 public:
00236 virtual int f(const Vector& y, Real& fy) const=0;
00237
00238 protected:
00239 explicit GradientFunction(int ny=-1, Real acc=-1);
00240 virtual ~GradientFunction() { }
00241
00242 private:
00243
00244 GradientFunction(const GradientFunction&);
00245 GradientFunction& operator=(const GradientFunction&);
00246 };
00247
00253 class SimTK_SIMMATH_EXPORT Differentiator::JacobianFunction : public Differentiator::Function {
00254 public:
00255 virtual int f(const Vector& y, Vector& fy) const=0;
00256
00257 protected:
00258 explicit JacobianFunction(int nf=-1, int ny=-1, Real acc=-1);
00259 virtual ~JacobianFunction() { }
00260
00261 private:
00262
00263 JacobianFunction(const JacobianFunction&);
00264 JacobianFunction& operator=(const JacobianFunction&);
00265 };
00266
00267 }
00268
00269 #endif // SimTK_DIFFERENTIATOR_H_