42 """Test identification of alpha_F from synthetic data."""
48 identifier.alpha_F = 5.0
51 x = np.array([30e6, 24e6, 3e6, 3.5e6, 2.5e6, 3e6, 0.01, 0.01])
52 u = np.array([0.8, 0.5])
56 params_true = DynamicsParams.from_config(self.
cfg)
57 params_true.alpha_F = alpha_F_true
60 alpha_initial = identifier.alpha_F
63 x_next = step(x, u, dt, params_true, 0.5, 1.0)
69 P_u_fuel=x[IDX_P_U_F],
71 P_d_fuel=x[IDX_P_D_F],
76 identifier.update_params(
82 alpha_final = identifier.alpha_F
85 error_initial = abs(alpha_initial - alpha_F_true)
86 error_final = abs(alpha_final - alpha_F_true)
88 self.assertLess(error_final, error_initial,
"Parameter should move toward true value")
89 self.assertLess(error_final, error_initial * 0.5,
"Should converge significantly")
92 """Test identification of alpha_O from synthetic data."""
98 identifier.alpha_O = 5.0
101 x = np.array([30e6, 24e6, 3e6, 3.5e6, 2.5e6, 3e6, 0.01, 0.01])
102 u = np.array([0.3, 0.9])
106 params_true = DynamicsParams.from_config(self.
cfg)
107 params_true.alpha_O = alpha_O_true
110 alpha_initial = identifier.alpha_O
112 x_next = step(x, u, dt, params_true, 0.5, 1.0)
115 P_copv=x[IDX_P_COPV],
117 P_u_fuel=x[IDX_P_U_F],
119 P_d_fuel=x[IDX_P_D_F],
123 identifier.update_params(
129 alpha_final = identifier.alpha_O
132 error_initial = abs(alpha_initial - alpha_O_true)
133 error_final = abs(alpha_final - alpha_O_true)
135 self.assertLess(error_final, error_initial)
138 """Test identification of tau_line_F from synthetic data."""
140 tau_line_F_true = 0.05
144 identifier.tau_line_F = 0.01
147 x = np.array([30e6, 24e6, 5e6, 3.5e6, 2.5e6, 3e6, 0.01, 0.01])
148 u = np.array([0.5, 0.5])
152 params_true = DynamicsParams.from_config(self.
cfg)
153 params_true.tau_line_F = tau_line_F_true
156 tau_initial = identifier.tau_line_F
158 x_next = step(x, u, dt, params_true, 0.5, 1.0)
161 P_copv=x[IDX_P_COPV],
163 P_u_fuel=x[IDX_P_U_F],
165 P_d_fuel=x[IDX_P_D_F],
169 identifier.update_params(
175 tau_final = identifier.tau_line_F
178 error_initial = abs(tau_initial - tau_line_F_true)
179 error_final = abs(tau_final - tau_line_F_true)
181 self.assertLess(error_final, error_initial)
184 """Test identification of tau_line_O from synthetic data."""
186 tau_line_O_true = 0.08
190 identifier.tau_line_O = 0.01
193 x = np.array([30e6, 24e6, 3e6, 5.5e6, 2.5e6, 3e6, 0.01, 0.01])
194 u = np.array([0.5, 0.5])
198 params_true = DynamicsParams.from_config(self.
cfg)
199 params_true.tau_line_O = tau_line_O_true
202 tau_initial = identifier.tau_line_O
204 x_next = step(x, u, dt, params_true, 0.5, 1.0)
207 P_copv=x[IDX_P_COPV],
209 P_u_fuel=x[IDX_P_U_F],
211 P_d_fuel=x[IDX_P_D_F],
215 identifier.update_params(
221 tau_final = identifier.tau_line_O
224 error_initial = abs(tau_initial - tau_line_O_true)
225 error_final = abs(tau_final - tau_line_O_true)
227 self.assertLess(error_final, error_initial)
230 """Test identification of COPV consumption coefficients."""
237 identifier.copv_cF = 5e4
238 identifier.copv_cO = 5e4
241 x = np.array([30e6, 24e6, 3e6, 3.5e6, 2.5e6, 3e6, 0.01, 0.01])
242 u = np.array([0.7, 0.6])
246 params_true = DynamicsParams.from_config(self.
cfg)
247 params_true.copv_cF = copv_cF_true
248 params_true.copv_cO = copv_cO_true
251 cF_initial = identifier.copv_cF
252 cO_initial = identifier.copv_cO
255 x_next = step(x, u, dt, params_true, 0.5, 1.0)
258 P_copv=x[IDX_P_COPV],
260 P_u_fuel=x[IDX_P_U_F],
262 P_d_fuel=x[IDX_P_D_F],
266 identifier.update_params(
272 cF_final = identifier.copv_cF
273 cO_final = identifier.copv_cO
276 error_F_initial = abs(cF_initial - copv_cF_true)
277 error_F_final = abs(cF_final - copv_cF_true)
278 error_O_initial = abs(cO_initial - copv_cO_true)
279 error_O_final = abs(cO_final - copv_cO_true)
281 self.assertLess(error_F_final, error_F_initial)
282 self.assertLess(error_O_final, error_O_initial)
285 """Test that parameters stay within bounds."""
289 identifier.alpha_F = 200.0
290 identifier.alpha_O = 0.01
291 identifier.tau_line_F = 0.0001
292 identifier.tau_line_O = 2.0
293 identifier.copv_cF = 1e8
294 identifier.copv_cO = 1e2
297 x = np.array([30e6, 24e6, 3e6, 3.5e6, 2.5e6, 3e6, 0.01, 0.01])
298 u = np.array([0.5, 0.5])
300 P_copv=x[IDX_P_COPV],
302 P_u_fuel=x[IDX_P_U_F],
304 P_d_fuel=x[IDX_P_D_F],
308 identifier.update_params(
313 self.assertGreaterEqual(identifier.alpha_F, identifier.alpha_min)
314 self.assertLessEqual(identifier.alpha_F, identifier.alpha_max)
315 self.assertGreaterEqual(identifier.alpha_O, identifier.alpha_min)
316 self.assertLessEqual(identifier.alpha_O, identifier.alpha_max)
317 self.assertGreaterEqual(identifier.tau_line_F, identifier.tau_min)
318 self.assertLessEqual(identifier.tau_line_F, identifier.tau_max)
319 self.assertGreaterEqual(identifier.tau_line_O, identifier.tau_min)
320 self.assertLessEqual(identifier.tau_line_O, identifier.tau_max)
321 self.assertGreaterEqual(identifier.copv_cF, identifier.copv_c_min)
322 self.assertLessEqual(identifier.copv_cF, identifier.copv_c_max)
323 self.assertGreaterEqual(identifier.copv_cO, identifier.copv_c_min)
324 self.assertLessEqual(identifier.copv_cO, identifier.copv_c_max)
343 """Test slow update of config parameters."""
347 identifier.alpha_F = 20.0
348 identifier.alpha_O = 25.0
351 alpha_F_initial = self.
cfg.alpha_F
352 alpha_O_initial = self.
cfg.alpha_O
355 identifier.update_config(self.
cfg)
358 self.assertGreater(self.
cfg.alpha_F, alpha_F_initial)
359 self.assertLess(self.
cfg.alpha_F, identifier.alpha_F)
360 self.assertGreater(self.
cfg.alpha_O, alpha_O_initial)
361 self.assertLess(self.
cfg.alpha_O, identifier.alpha_O)