@@ -66,17 +66,24 @@ class IntegratorEuler
66
66
IntegratorEuler ( const std::string& name )
67
67
: IntegratorAbstract<sigT,coefT>( name )
68
68
{
69
+ using namespace dg ::command;
70
+
69
71
setSamplingPeriod (0.005 );
70
72
71
73
SOUT.addDependency (SIN);
72
74
this ->addCommand (" setSamplingPeriod" ,
73
- new dg::command:: Setter<IntegratorEuler,double > (*this ,
75
+ new Setter<IntegratorEuler,double > (*this ,
74
76
&IntegratorEuler::setSamplingPeriod,
75
77
" Set the time during two sampling." ));
76
78
this ->addCommand (" getSamplingPeriod" ,
77
- new dg::command:: Getter<IntegratorEuler,double > (*this ,
79
+ new Getter<IntegratorEuler,double > (*this ,
78
80
&IntegratorEuler::getSamplingPeriod,
79
81
" Get the time during two sampling." ));
82
+
83
+ this ->addCommand (" initialize" ,
84
+ makeCommandVoid0 (*this , &IntegratorEuler::initialize,
85
+ docCommandVoid0 (" Initialize internal memory from current value of input" )
86
+ ));
80
87
}
81
88
82
89
virtual ~IntegratorEuler ( void ) {}
@@ -106,28 +113,28 @@ public:
106
113
// End of step 1. Here, sum is b_0 X
107
114
108
115
// Step 2
109
- int denomsize = denom .size ();
110
- for (int i = 1 ; i < denomsize ; ++i)
116
+ int numsize = num .size ();
117
+ for (int i = 1 ; i < numsize ; ++i)
111
118
{
112
119
tmp2 = inputMemory[i-1 ] - tmp1;
113
120
tmp2 *= invdt;
114
121
tmp1 = inputMemory[i];
115
122
inputMemory[i] = tmp2;
116
- sum += (denom [i] * inputMemory[i]);
123
+ sum += (num [i] * inputMemory[i]);
117
124
}
118
125
// End of step 2. Here, sum is b_m * d(m)X / dt^m + ... - b_0 X
119
126
120
127
// Step 3
121
- int numsize = num .size () - 1 ;
122
- for (int i = 0 ; i < numsize ; ++i)
128
+ int denomsize = denom .size () - 1 ;
129
+ for (int i = 0 ; i < denomsize ; ++i)
123
130
{
124
- sum -= (num [i] * outputMemory[i]);
131
+ sum -= (denom [i] * outputMemory[i]);
125
132
}
126
133
// End of step 3. Here, sum is b_m * d(m)X / dt^m + ... - b_0 X - a_0 Y - ... a_n-1 d(n-1)Y / dt^(n-1)
127
134
128
135
// Step 4
129
- outputMemory[numsize ] = sum;
130
- for (int i = numsize - 1 ; i >= 0 ; --i)
136
+ outputMemory[denomsize ] = sum;
137
+ for (int i = denomsize- 1 ; i >= 0 ; --i)
131
138
{
132
139
outputMemory[i] += (outputMemory[i+1 ] * dt);
133
140
}
@@ -150,6 +157,25 @@ public:
150
157
{
151
158
return dt;
152
159
}
160
+
161
+ void initialize ()
162
+ {
163
+ std::size_t numsize = numerator.size ();
164
+ inputMemory.resize (numsize);
165
+
166
+ inputMemory[0 ] = SIN.accessCopy ();
167
+ for (std::size_t i = 1 ; i < numsize; ++i)
168
+ {
169
+ inputMemory[i] = inputMemory[0 ];
170
+ }
171
+
172
+ std::size_t denomsize = denominator.size ();
173
+ outputMemory.resize (denomsize);
174
+ for (std::size_t i = 0 ; i < denomsize; ++i)
175
+ {
176
+ outputMemory[i] = inputMemory[0 ];
177
+ }
178
+ }
153
179
};
154
180
155
181
} /* namespace sot */ } /* namespace dynamicgraph */
0 commit comments