KrisLibrary  1.0.0
function.h
Go to the documentation of this file.
1 #ifndef MATH_FUNCTION_H
2 #define MATH_FUNCTION_H
3 
4 #include "math.h"
5 #include <KrisLibrary/errors.h>
6 #include <string>
7 namespace Math
8 {
9  template <class T> class VectorTemplate;
10  template <class T> class MatrixTemplate;
13 } //namespace Math
14 
22 namespace Math {
23 
26 
43 {
44 public:
45  virtual ~RealFunction() {}
46  virtual std::string Label() const { return "<unknown R->R>"; }
47  virtual std::string VariableLabel() const { return "x"; }
48  virtual Real operator ()(Real t) { PreEval(t); return Eval(t); }
49  virtual void PreEval(Real t) {}
50  virtual Real Eval(Real t) =0;
51  virtual Real Deriv(Real t) { FatalError("Deriv not defined in subclass of RealFunction"); return 0; }
52  virtual Real Deriv2(Real t) { FatalError("Deriv2 not defined in subclass of RealFunction"); return 0; }
53 };
54 
56 {
57 public:
58  virtual ~RealFunction2() {}
59  virtual std::string Label() const { return "<unknown R2->R>"; }
60  virtual std::string VariableLabel(int i) const { return (i==0?"t":"x"); }
61  virtual Real operator ()(Real t, Real x) { PreEval(t,x); return Eval(t,x); }
62  virtual void PreEval(Real t, Real x) {}
63  virtual Real Eval(Real t, Real x) =0;
64 };
65 
70 {
71 public:
72  virtual ~VectorFunction() {}
73  virtual std::string Label() const { return "<unknown R->Rn>"; }
74  virtual std::string Label(int i) const;
75  virtual std::string VariableLabel() const { return "t"; }
76  virtual int NumDimensions() const { FatalError("NumDimensions() not defined in subclass of VectorFunction"); return -1; }
77  virtual void operator()(Real t,Vector& x);// { PreEval(t); Eval(t,x); }
78  virtual void PreEval(Real t) {}
79  virtual void Eval(Real t,Vector& x) =0;
80  virtual void Deriv(Real t,Vector& dx) { FatalError("Deriv not defined in subclass of VectorFunction"); }
81  virtual void Deriv2(Real t,Vector& ddx) { FatalError("Deriv2 not defined in subclass of VectorFunction"); }
82 };
83 
98 {
99 public:
100  virtual ~ScalarFieldFunction() {}
101  virtual std::string Label() const { return "<unknown Rn->R>"; }
102  virtual std::string VariableLabel(int i) const;
103  virtual Real operator ()(const Vector& x) { PreEval(x); return Eval(x); }
104  virtual void PreEval(const Vector& x) {} //called before evaluations at x
105  virtual Real Eval(const Vector& x) =0;
106  virtual void Gradient(const Vector& x,Vector& grad) { FatalError("Gradient not defined in subclass of ScalarFieldFunction"); }
107  virtual Real Gradient_i(const Vector& x,int i) { FatalError("Gradient_i not defined in subclass of ScalarFieldFunction"); return 0; }
108  virtual Real DirectionalDeriv(const Vector& x,const Vector& h);
109  virtual void Hessian(const Vector& x,Matrix& H) { FatalError("Hessian not defined in subclass of ScalarFieldFunction"); }
110  virtual Real Hessian_ij(const Vector& x,int i,int j) { FatalError("Hessian_ij not defined in subclass of ScalarFieldFunction"); return 0; }
111  virtual Real DirectionalDeriv2(const Vector& x,const Vector& h);
112 };
113 
114 
135 {
136 public:
137  virtual ~VectorFieldFunction() {}
138  virtual std::string Label() const;
139  virtual std::string Label(int i) const;
140  virtual std::string VariableLabel(int i) const;
141  virtual int NumDimensions() const { FatalError("NumDimensions() not defined in subclass of VectorFieldFunction"); return -1; }
142  virtual void operator ()(const Vector& x,Vector& v) { PreEval(x);Eval(x,v); }
143  virtual void PreEval(const Vector& x) {} //called before evaluations at x
144  virtual void Eval(const Vector& x,Vector& v) =0;
145  virtual Real Eval_i(const Vector& x,int i);
146  virtual Real Jacobian_ij(const Vector& x,int i,int j) { FatalError("Jacobian_ij() not defined in subclass of VectorFieldFunction"); return 0; }
147  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
148  virtual void Jacobian_j(const Vector& x,int j,Vector& Jj);
149  virtual void Jacobian(const Vector& x,Matrix& J);
150  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
151  virtual Real Divergence(const Vector& x);
152 
153  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi) { FatalError("Hessian_i() not defined in subclass of VectorFieldFunction"); }
154  virtual Real Hessian_ijk(const Vector& x,int i,int j,int k) { FatalError("Hessian_ijk() not defined in subclass of VectorFieldFunction"); return 0; }
155 };
156 
158 {
159 public:
160  virtual ~DiffEqFunction() {}
161  virtual int NumDimensions() const { FatalError("NumDimensions not defined in subclass of DiffEqFunction"); return -1; }
162  virtual void operator ()(Real t,const Vector& y,Vector& fy) { PreEval(t,y); Eval(t,y,fy); }
163  virtual void PreEval(Real t,const Vector& y) {}
164  virtual void Eval(Real t,const Vector& y,Vector& fy) =0;
165 };
166 
167 
168 } //namespace Math
169 
170 #endif
Common math typedefs, constants, functions.
A function from R^n to R^m.
Definition: function.h:134
A function from R to R.
Definition: function.h:42
A function from R^n to R.
Definition: function.h:97
Definition: function.h:55
A matrix over the field T.
Definition: function.h:10
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
A vector over the field T.
Definition: function.h:9
Definition: function.h:157
A function from R to R^n, identical to RealFunction except a vector is returned.
Definition: function.h:69