1 #ifndef SimTK_SimTKCOMMON_FUNCTION_H_ 2 #define SimTK_SimTKCOMMON_FUNCTION_H_ 87 const Vector& x)
const = 0;
136 : argumentSize(argumentSize), value(value) {
139 assert(x.
size() == argumentSize);
143 const Vector& x)
const override {
144 return static_cast<T
>(0);
185 assert(x.
size() == coefficients.size()-1);
186 T value =
static_cast<T
>(0);
187 for (
int i = 0; i < x.
size(); ++i)
188 value += x[i]*coefficients[i];
189 value += coefficients[x.
size()];
193 const Vector& x)
const override {
194 assert(x.
size() == coefficients.size()-1);
195 assert(derivComponents.
size() > 0);
196 if (derivComponents.
size() == 1)
197 return coefficients(derivComponents[0]);
198 return static_cast<T
>(0);
201 return coefficients.size()-1;
234 assert(x.
size() == 1);
236 T value =
static_cast<T
>(0);
237 for (
int i = 0; i < coefficients.size(); ++i)
238 value = value*arg + coefficients[i];
242 const Vector& x)
const override {
243 assert(x.
size() == 1);
244 assert(derivComponents.
size() > 0);
246 T value =
static_cast<T
>(0);
247 const int derivOrder = (int)derivComponents.
size();
248 const int polyOrder = coefficients.size()-1;
249 for (
int i = 0; i <= polyOrder-derivOrder; ++i) {
250 T coeff = coefficients[i];
251 for (
int j = 0; j < derivOrder; ++j)
252 coeff *= polyOrder-i-j;
253 value = value*arg + coeff;
293 : a(amplitude), w(frequency), p(phase) {}
307 return a*std::sin(w*t + p);
311 const Vector& x)
const override {
313 const int order = derivComponents.
size();
319 case 0:
return a* std::sin(w*t + p);
320 case 1:
return a*w* std::cos(w*t + p);
321 case 2:
return -a*w*w* std::sin(w*t + p);
322 case 3:
return -a*w*w*w*std::cos(w*t + p);
325 const Real sc = (order & 0x1) ? std::cos(w*t+p) : std::sin(w*t+p);
326 const Real wn = std::pow(w, order);
375 { setParameters(y0,y1,x0,x1); }
381 "A zero-length switching interval is illegal; both ends were %g.", x0);
382 m_y0 = y0; m_y1 = y1; m_yr = y1-y0; m_zero =
Real(0)*y0;
383 m_x0 = x0; m_x1 = x1; m_ooxr = 1/(x1-x0); m_sign =
sign(m_ooxr);
388 "Function_<T>::Step::calcValue()",
389 "Expected just one input argument but got %d.", xin.
size());
391 const Real x = xin[0];
392 if ((x-m_x0)*m_sign <= 0)
return m_y0;
393 if ((x-m_x1)*m_sign >= 0)
return m_y1;
396 return m_y0 + f*m_yr;
400 const Vector& xin)
const override {
402 "Function_<T>::Step::calcDerivative()",
403 "Expected just one input argument but got %d.", xin.
size());
405 const int derivOrder = (int)derivComponents.
size();
407 "Function_<T>::Step::calcDerivative()",
408 "Only 1st, 2nd, and 3rd derivatives of the step are available," 409 " but derivative %d was requested.", derivOrder);
410 const Real x = xin[0];
411 if ((x-m_x0)*m_sign <= 0)
return m_zero;
412 if ((x-m_x1)*m_sign >= 0)
return m_zero;
414 case 1:
return dstepAny (1,m_x0,m_ooxr, x) * m_yr;
415 case 2:
return d2stepAny(1,m_x0,m_ooxr, x) * m_yr;
416 case 3:
return d3stepAny(1,m_x0,m_ooxr, x) * m_yr;
417 default: assert(!
"impossible derivOrder");
434 Real m_x0, m_x1, m_ooxr;
440 #endif // SimTK_SimTKCOMMON_FUNCTION_H_ void setAmplitude(Real amplitude)
Definition: Function.h:295
Polynomial(const Vector_< T > &coefficients)
Create a Function_::Polynomial object.
Definition: Function.h:231
virtual Function_ * clone() const
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:109
T calcValue(const Vector &x) const override
Calculate the value of this function at a particular point.
Definition: Function.h:184
size_type size() const
Return the current number of elements stored in this array.
Definition: Array.h:2075
This is a Function_ subclass whose output value is a linear function of its arguments: f(x...
Definition: Function.h:170
#define SimTK_ERRCHK1_ALWAYS(cond, whereChecked, fmt, a1)
Definition: ExceptionMacros.h:285
T calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:429
double d2stepAny(double yRange, double x0, double oneOverXRange, double x)
Second derivative of stepAny(): d^2/dx^2 stepAny(x).
Definition: Scalar.h:924
Polynomial * clone() const override
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:264
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
Real calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:340
Step * clone() const override
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:425
virtual T calcDerivative(const Array_< int > &derivComponents, const Vector &x) const =0
Calculate a partial derivative of this function at a particular point.
virtual Real calcValue(const Vector &x) const override
Calculate the value of this function at a particular point.
Definition: Function.h:305
Constant(T value, int argumentSize=1)
Create a Function_::Constant object.
Definition: Function.h:135
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:606
virtual T calcValue(const Vector &x) const =0
Calculate the value of this function at a particular point.
T calcDerivative(const Array_< int > &derivComponents, const Vector &xin) const override
Calculate a partial derivative of this function at a particular point.
Definition: Function.h:399
Step(const T &y0, const T &y1, Real x0, Real x1)
Create a Function_::Step object that smoothly interpolates its output through a given range as its in...
Definition: Function.h:374
const Real NaN
This is the IEEE "not a number" constant for this implementation of the default-precision Real type; ...
void setPhase(Real phase)
Definition: Function.h:297
virtual int getArgumentSize() const =0
Get the number of components expected in the input vector.
int getArgumentSize() const override
Get the number of components expected in the input vector.
Definition: Function.h:200
This is a Function_ subclass whose output value is a polynomial of its argument: f(x) = ax^n+bx^(n-1)...
Definition: Function.h:223
T calcValue(const Vector &x) const override
Calculate the value of this function at a particular point.
Definition: Function.h:233
int getMaxDerivativeOrder() const override
Get the maximum derivative order this Function_ object can calculate.
Definition: Function.h:203
void setParameters(const T &y0, const T &y1, Real x0, Real x1)
Change the four parameters that define the step function; see constructor for documentation.
Definition: Function.h:379
T calcDerivative(const Array_< int > &derivComponents, const Vector &x) const override
Calculate a partial derivative of this function at a particular point.
Definition: Function.h:142
virtual Real calcDerivative(const Array_< int > &derivComponents, const Vector &x) const override
Calculate a partial derivative of this function at a particular point.
Definition: Function.h:310
T calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:211
virtual int getMaxDerivativeOrder() const =0
Get the maximum derivative order this Function_ object can calculate.
double dstepAny(double yRange, double x0, double oneOverXRange, double x)
First derivative of stepAny(): d/dx stepAny(x).
Definition: Scalar.h:899
Sinusoid(Real amplitude, Real frequency, Real phase=0)
Create a Function::Sinusoid object, returning a*sin(w*x+p).
Definition: Function.h:292
#define SimTK_THROW2(exc, a1, a2)
Definition: Exception.h:318
int getMaxDerivativeOrder() const override
Get the maximum derivative order this Function_ object can calculate.
Definition: Function.h:149
T calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:157
ELEM max(const VectorBase< ELEM > &v)
Definition: VectorMath.h:251
int getMaxDerivativeOrder() const override
Get the maximum derivative order this Function_ object can calculate.
Definition: Function.h:260
Linear(const Vector_< T > &coefficients)
Create a Function_::Linear object.
Definition: Function.h:182
This is a Function_ subclass whose output value is a sinusoid of its argument: f(x) = a*sin(w*x + p) ...
Definition: Function.h:283
int getMaxDerivativeOrder() const override
Get the maximum derivative order this Function_ object can calculate.
Definition: Function.h:423
Constant * clone() const override
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:153
This abstract class represents a mathematical function that calculates a value of arbitrary type base...
Definition: Function.h:51
Real getAmplitude() const
Definition: Function.h:299
This is a Function_ subclass which simply returns a fixed value, independent of its arguments...
Definition: Function.h:126
double d3stepAny(double yRange, double x0, double oneOverXRange, double x)
Third derivative of stepAny(): d^3/dx^3 stepAny(x).
Definition: Scalar.h:949
This Array_ helper class is the base class for ArrayView_ which is the base class for Array_; here we...
Definition: Array.h:51
int getMaxDerivativeOrder() const override
Get the maximum derivative order this Function_ object can calculate.
Definition: Function.h:332
T calcDerivative(const Array_< int > &derivComponents, const Vector &x) const override
Calculate a partial derivative of this function at a particular point.
Definition: Function.h:192
int getArgumentSize() const override
Get the number of components expected in the input vector.
Definition: Function.h:146
Real getPhase() const
Definition: Function.h:301
unsigned int sign(unsigned char u)
Definition: Scalar.h:311
T calcDerivative(const Array_< int > &derivComponents, const Vector &x) const override
Calculate a partial derivative of this function at a particular point.
Definition: Function.h:241
double stepAny(double y0, double yRange, double x0, double oneOverXRange, double x)
Interpolate smoothly from y0 to y1 as the input argument goes from x0 to x1, with first and second de...
Definition: Scalar.h:873
int size() const
Definition: VectorBase.h:396
T calcValue(const Vector &xin) const override
Calculate the value of this function at a particular point.
Definition: Function.h:386
void setFrequency(Real frequency)
Definition: Function.h:296
Definition: Exception.h:248
T calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:91
int getArgumentSize() const override
Get the number of components expected in the input vector.
Definition: Function.h:422
virtual ~Function_()
Definition: Function.h:58
T calcDerivative(const std::vector< int > &derivComponents, const Vector &x) const
This provides compatibility with std::vector without requiring any copying.
Definition: Function.h:268
Real getFrequency() const
Definition: Function.h:300
This is the header which should be included in user programs that would like to make use of all the S...
Sinusoid * clone() const override
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:336
Linear * clone() const override
Create a new heap-allocated copy of this concrete Function.
Definition: Function.h:207
int getArgumentSize() const override
Get the number of components expected in the input vector.
Definition: Function.h:331
Includes internal headers providing declarations for the basic SimTK Core classes.
Function_< Real > Function
This typedef is used for the very common case that the return type of the Function object is Real...
Definition: Function.h:117
T calcValue(const Vector &x) const override
Calculate the value of this function at a particular point.
Definition: Function.h:138
This is a Function_ subclass whose output value y=f(x) is smoothly stepped from y=y0 to y1 as its inp...
Definition: Function.h:355
int getArgumentSize() const override
Get the number of components expected in the input vector.
Definition: Function.h:257