20#ifndef _POLYNOM_FUNCTION_H_
21#define _POLYNOM_FUNCTION_H_
23#include "mbsim/functions/function.h"
24#include "mbsim/utils/utils.h"
30 template<
typename Ret,
typename Arg>
32 using B = fmatvec::Function<Ret(Arg)>;
37 Function<Ret(Arg)>::init(stage, config);
39 ad.resize(a.size()-1);
40 add.resize(ad.size()-1);
41 for(
int i=1; i<a.size(); i++)
42 ad.e(i-1) = double(i)*a.e(i);
43 for(
int i=1; i<ad.size(); i++)
44 add.e(i-1) = double(i)*ad(i);
47 int getArgSize()
const override {
return 1; }
48 std::pair<int, int> getRetSize()
const override {
return std::make_pair(1,1); }
49 Ret operator()(
const Arg &x_)
override {
50 double x = ToDouble<Arg>::cast(x_);
51 double value=a(a.size()-1);
52 for (
int i=
int(a.size())-2; i>-1; i--)
54 return FromDouble<Ret>::cast(value);
56 typename B::DRetDArg parDer(
const Arg &x_)
override {
57 double x = ToDouble<Arg>::cast(x_);
58 double value=ad(ad.size()-1);
59 for (
int i=
int(ad.size())-2; i>-1; i--)
60 value=value*x+ad.e(i);
61 return FromDouble<typename B::DRetDArg>::cast(value);
63 typename B::DRetDArg parDerDirDer(
const Arg &xDir_,
const Arg &x_)
override {
64 double x = ToDouble<Arg>::cast(x_);
65 double xDir = ToDouble<Arg>::cast(xDir_);
66 double value=add(add.size()-1);
67 for (
int i=
int(add.size())-2; i>-1; i--)
68 value=value*x+add.e(i);
69 return FromDouble<typename B::DRetDArg>::cast(value*xDir);
71 void initializeUsingXML(xercesc::DOMElement *element)
override {
72 setCoefficients(MBXMLUtils::E(MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"coefficients"))->getText<fmatvec::Vec>());
74 void setCoefficients(
const fmatvec::VecV &a_) { a <<= a_; }
76 fmatvec::VecV a, ad, add;
InitStage
The stages of the initialization.
Definition: element.h:62
@ preInit
Definition: element.h:64
Definition: function.h:53
void init(Element::InitStage stage, const InitConfigSet &config) override
plots time series header
Definition: polynom_function.h:36
Definition: polynom_function.h:28
namespace MBSim
Definition: bilateral_constraint.cc:30