source: trunk/extremum_seeking/esc_test/include/esc_test/function.h @ 11

Last change on this file since 11 was 11, checked in by wcaarls, 12 years ago

Updated extremum_seeking to revision 1001

File size: 1.7 KB
Line 
1#include <limits>
2#include <exception>
3
4class ESCFunction
5{
6  public:
7    virtual std::vector<float> init() = 0;
8    virtual float value(const std::vector<float> &state) const = 0;
9};
10
11class Gauss : public ESCFunction
12{
13  private:
14    float a_, b_, c_;
15
16  public:
17    Gauss(float a=1, float b=0, float c=1) : a_(a), b_(b), c_(c) { }
18   
19    std::vector<float> init()
20    {
21      std::vector<float> state;
22      state.push_back(0);
23      return state;
24    }
25   
26    float value(const std::vector<float> &state) const
27    {
28      if (state.size() != 1)
29        throw std::runtime_error("invalid state size");
30       
31      return a_*std::exp(-(state[0]-b_)*(state[0]-b_)/(2*c_*c_));
32    }
33};
34
35class ESCSystem
36{
37  protected:
38    ESCFunction *function_;
39    std::vector<float> state_;
40       
41  public:
42    ESCSystem(ESCFunction *function) : function_(function)
43    {
44      if (!function)
45        throw std::runtime_error("no function specified");
46       
47      reset();
48    }
49   
50    void reset()
51    {
52      state_ = function_->init();
53    }
54 
55    float step(const std::vector<float> &vel)
56    {
57      if (state_.size() != vel.size())
58        throw std::runtime_error("invalid state size");
59   
60      for (size_t ii=0; ii < state_.size() && ii < vel.size(); ++ii)
61        state_[ii] += vel[ii];
62       
63      return function_->value(state_);
64    }
65   
66    float set(const std::vector<float> &pos)
67    {
68      if (state_.size() != pos.size())
69        throw std::runtime_error("invalid state size");
70   
71      state_ = pos;
72      return function_->value(state_);
73    }
74   
75    float value() const
76    {
77      return function_->value(state_);
78    }
79   
80    const std::vector<float> &state()
81    {
82      return state_;
83    }
84};
Note: See TracBrowser for help on using the repository browser.