1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements;
18
19 import java.util.List;
20
21 import org.hipparchus.stat.descriptive.StreamingStatistics;
22 import org.hipparchus.util.FastMath;
23 import org.junit.Assert;
24 import org.junit.Test;
25 import org.orekit.estimation.Context;
26 import org.orekit.estimation.EstimationTestUtils;
27 import org.orekit.estimation.measurements.modifiers.RangeRateTroposphericDelayModifier;
28 import org.orekit.models.earth.troposphere.EstimatedTroposphericModel;
29 import org.orekit.models.earth.troposphere.GlobalMappingFunctionModel;
30 import org.orekit.models.earth.troposphere.SaastamoinenModel;
31 import org.orekit.orbits.OrbitType;
32 import org.orekit.orbits.PositionAngle;
33 import org.orekit.propagation.Propagator;
34 import org.orekit.propagation.SpacecraftState;
35 import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
36 import org.orekit.time.AbsoluteDate;
37 import org.orekit.utils.Constants;
38 import org.orekit.utils.Differentiation;
39 import org.orekit.utils.ParameterDriver;
40 import org.orekit.utils.ParameterFunction;
41 import org.orekit.utils.StateFunction;
42
43 public class RangeRateTest {
44
45
46
47
48
49 @Test
50 public void testValuesOneWay() {
51
52 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
53
54 final NumericalPropagatorBuilder propagatorBuilder =
55 context.createBuilder(OrbitType.EQUINOCTIAL, PositionAngle.TRUE, false,
56 1.0e-6, 60.0, 0.001);
57
58
59 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
60 propagatorBuilder);
61 final double satClkDrift = 3.2e-10;
62 final List<ObservedMeasurement<?>> measurements =
63 EstimationTestUtils.createMeasurements(propagator,
64 new RangeRateMeasurementCreator(context, false, satClkDrift),
65 1.0, 3.0, 300.0);
66
67 propagator.clearStepHandlers();
68
69
70 final StreamingStatistics diffStat = new StreamingStatistics();
71
72 for (final ObservedMeasurement<?> measurement : measurements) {
73
74
75 final AbsoluteDate datemeas = measurement.getDate();
76 SpacecraftState state = propagator.propagate(datemeas);
77
78
79 final EstimatedMeasurement<?> estimated = measurement.estimate(0, 0, new SpacecraftState[] { state });
80
81
82 diffStat.addValue(FastMath.abs(estimated.getEstimatedValue()[0] - measurement.getObservedValue()[0]));
83 }
84
85
86 Assert.assertEquals(0.0, diffStat.getMean(), 6.5e-8);
87 Assert.assertEquals(0.0, diffStat.getStandardDeviation(), 5.5e-8);
88 }
89
90
91
92
93
94 @Test
95 public void testValuesTwoWays() {
96
97 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
98
99 final NumericalPropagatorBuilder propagatorBuilder =
100 context.createBuilder(OrbitType.EQUINOCTIAL, PositionAngle.TRUE, false,
101 1.0e-6, 60.0, 0.001);
102
103
104 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
105 propagatorBuilder);
106 final double satClkDrift = 3.2e-10;
107 final List<ObservedMeasurement<?>> measurements =
108 EstimationTestUtils.createMeasurements(propagator,
109 new RangeRateMeasurementCreator(context, true, satClkDrift),
110 1.0, 3.0, 300.0);
111
112 propagator.clearStepHandlers();
113
114
115 final StreamingStatistics diffStat = new StreamingStatistics();
116
117 for (final ObservedMeasurement<?> measurement : measurements) {
118
119
120 final AbsoluteDate datemeas = measurement.getDate();
121 SpacecraftState state = propagator.propagate(datemeas);
122
123
124 final EstimatedMeasurement<?> estimated = measurement.estimate(0, 0, new SpacecraftState[] { state });
125
126
127 diffStat.addValue(FastMath.abs(estimated.getEstimatedValue()[0] - measurement.getObservedValue()[0]));
128 }
129
130
131 Assert.assertEquals(0.0, diffStat.getMean(), 6.5e-8);
132 Assert.assertEquals(0.0, diffStat.getStandardDeviation(), 5.5e-8);
133 }
134
135
136
137
138
139 @Test
140 public void testStateDerivativesOneWay() {
141
142 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
143
144 final NumericalPropagatorBuilder propagatorBuilder =
145 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
146 1.0e-6, 60.0, 0.001);
147
148
149 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
150 propagatorBuilder);
151 final double satClkDrift = 3.2e-10;
152 final List<ObservedMeasurement<?>> measurements =
153 EstimationTestUtils.createMeasurements(propagator,
154 new RangeRateMeasurementCreator(context, false, satClkDrift),
155 1.0, 3.0, 300.0);
156 for (final ObservedMeasurement<?> m : measurements) {
157 Assert.assertFalse(((RangeRate) m).isTwoWay());
158 }
159 propagator.clearStepHandlers();
160
161 double maxRelativeError = 0;
162 for (final ObservedMeasurement<?> measurement : measurements) {
163
164 final double meanDelay = 1;
165 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
166 final SpacecraftState state = propagator.propagate(date);
167
168 final EstimatedMeasurement<?> estimated = measurement.estimate(0, 0, new SpacecraftState[] { state });
169 Assert.assertEquals(2, estimated.getParticipants().length);
170 final double[][] jacobian = estimated.getStateDerivatives(0);
171
172 final double[][] finiteDifferencesJacobian =
173 Differentiation.differentiate(new StateFunction() {
174 public double[] value(final SpacecraftState state) {
175 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue();
176 }
177 }, 1, propagator.getAttitudeProvider(),
178 OrbitType.CARTESIAN, PositionAngle.TRUE, 15.0, 3).value(state);
179
180 Assert.assertEquals(finiteDifferencesJacobian.length, jacobian.length);
181 Assert.assertEquals(finiteDifferencesJacobian[0].length, jacobian[0].length);
182
183 for (int i = 0; i < jacobian.length; ++i) {
184 for (int j = 0; j < jacobian[i].length; ++j) {
185
186 maxRelativeError = FastMath.max(maxRelativeError,
187 FastMath.abs((finiteDifferencesJacobian[i][j] - jacobian[i][j]) /
188 finiteDifferencesJacobian[i][j]));
189 }
190 }
191
192 }
193 Assert.assertEquals(0, maxRelativeError, 1.5e-8);
194
195 }
196
197
198
199
200
201 @Test
202 public void testStateDerivativesTwoWays() {
203
204 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
205
206 final NumericalPropagatorBuilder propagatorBuilder =
207 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
208 1.0e-6, 60.0, 0.001);
209
210
211 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
212 propagatorBuilder);
213 final double satClkDrift = 3.2e-10;
214 final List<ObservedMeasurement<?>> measurements =
215 EstimationTestUtils.createMeasurements(propagator,
216 new RangeRateMeasurementCreator(context, true, satClkDrift),
217 1.0, 3.0, 300.0);
218 for (final ObservedMeasurement<?> m : measurements) {
219 Assert.assertTrue(((RangeRate) m).isTwoWay());
220 }
221 propagator.clearStepHandlers();
222
223 double maxRelativeError = 0;
224 for (final ObservedMeasurement<?> measurement : measurements) {
225
226
227
228 final double meanDelay = 1;
229 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
230 final SpacecraftState state = propagator.propagate(date);
231
232 final EstimatedMeasurement<?> estimated = measurement.estimate(0, 0, new SpacecraftState[] { state });
233 Assert.assertEquals(3, estimated.getParticipants().length);
234 final double[][] jacobian = estimated.getStateDerivatives(0);
235
236 final double[][] finiteDifferencesJacobian =
237 Differentiation.differentiate(new StateFunction() {
238 public double[] value(final SpacecraftState state) {
239 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue();
240 }
241 }, 1, propagator.getAttitudeProvider(),
242 OrbitType.CARTESIAN, PositionAngle.TRUE, 15.0, 3).value(state);
243
244 Assert.assertEquals(finiteDifferencesJacobian.length, jacobian.length);
245 Assert.assertEquals(finiteDifferencesJacobian[0].length, jacobian[0].length);
246
247 for (int i = 0; i < jacobian.length; ++i) {
248 for (int j = 0; j < jacobian[i].length; ++j) {
249
250 maxRelativeError = FastMath.max(maxRelativeError,
251 FastMath.abs((finiteDifferencesJacobian[i][j] - jacobian[i][j]) /
252 finiteDifferencesJacobian[i][j]));
253 }
254 }
255
256 }
257 Assert.assertEquals(0, maxRelativeError, 2.1e-7);
258
259 }
260
261
262
263
264
265 @Test
266 public void testParameterDerivativesOneWay() {
267
268 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
269
270 final NumericalPropagatorBuilder propagatorBuilder =
271 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
272 1.0e-6, 60.0, 0.001);
273
274
275 final double groundClockDrift = 4.8e-9;
276 for (final GroundStation station : context.stations) {
277 station.getClockDriftDriver().setValue(groundClockDrift);
278 }
279 final double satClkDrift = 3.2e-10;
280 final RangeRateMeasurementCreator creator = new RangeRateMeasurementCreator(context, false, satClkDrift);
281 creator.getSatellite().getClockDriftDriver().setSelected(true);
282 for (final GroundStation station : context.stations) {
283 station.getClockOffsetDriver().setSelected(true);
284 station.getClockDriftDriver().setSelected(true);
285 station.getEastOffsetDriver().setSelected(true);
286 station.getNorthOffsetDriver().setSelected(true);
287 station.getZenithOffsetDriver().setSelected(true);
288 }
289 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
290 propagatorBuilder);
291
292
293
294 final List<ObservedMeasurement<?>> measurements =
295 EstimationTestUtils.createMeasurements(propagator,
296 creator,
297 1.0, 3.0, 300.0);
298 propagator.clearStepHandlers();
299
300 double maxRelativeError = 0;
301 for (final ObservedMeasurement<?> measurement : measurements) {
302
303
304 final GroundStation stationParameter = ((RangeRate) measurement).getStation();
305
306
307
308
309
310
311
312
313 final double meanDelay = measurement.getObservedValue()[0] / Constants.SPEED_OF_LIGHT;
314 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
315 final SpacecraftState state = propagator.propagate(date);
316 final ParameterDriver[] drivers = new ParameterDriver[] {
317 stationParameter.getClockDriftDriver(),
318 stationParameter.getEastOffsetDriver(),
319 stationParameter.getNorthOffsetDriver(),
320 stationParameter.getZenithOffsetDriver(),
321 measurement.getSatellites().get(0).getClockDriftDriver()
322 };
323 for (int i = 0; i < drivers.length; ++i) {
324 final double[] gradient = measurement.estimate(0, 0, new SpacecraftState[] { state }).getParameterDerivatives(drivers[i]);
325 Assert.assertEquals(1, measurement.getDimension());
326 Assert.assertEquals(1, gradient.length);
327
328 final ParameterFunction dMkdP =
329 Differentiation.differentiate(new ParameterFunction() {
330
331 @Override
332 public double value(final ParameterDriver parameterDriver) {
333 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue()[0];
334 }
335 }, 3, 20.0 * drivers[i].getScale());
336 final double ref = dMkdP.value(drivers[i]);
337 maxRelativeError = FastMath.max(maxRelativeError, FastMath.abs((ref - gradient[0]) / ref));
338 }
339
340 }
341 Assert.assertEquals(0, maxRelativeError, 1.2e-6);
342
343 }
344
345
346
347
348
349 @Test
350 public void testParameterDerivativesTwoWays() {
351
352 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
353
354 final NumericalPropagatorBuilder propagatorBuilder =
355 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
356 1.0e-6, 60.0, 0.001);
357
358
359 final double groundClockDrift = 4.8e-9;
360 for (final GroundStation station : context.stations) {
361 station.getClockDriftDriver().setValue(groundClockDrift);
362 }
363 final double satClkDrift = 3.2e-10;
364 final RangeRateMeasurementCreator creator = new RangeRateMeasurementCreator(context, false, satClkDrift);
365 for (final GroundStation station : context.stations) {
366 station.getClockOffsetDriver().setSelected(true);
367 station.getEastOffsetDriver().setSelected(true);
368 station.getNorthOffsetDriver().setSelected(true);
369 station.getZenithOffsetDriver().setSelected(true);
370 }
371
372 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
373 propagatorBuilder);
374
375
376 final List<ObservedMeasurement<?>> measurements =
377 EstimationTestUtils.createMeasurements(propagator,
378 creator,
379 1.0, 3.0, 300.0);
380 propagator.clearStepHandlers();
381
382 double maxRelativeError = 0;
383 for (final ObservedMeasurement<?> measurement : measurements) {
384
385
386 final GroundStation stationParameter = ((RangeRate) measurement).getStation();
387
388
389
390
391
392
393
394
395 final double meanDelay = measurement.getObservedValue()[0] / Constants.SPEED_OF_LIGHT;
396 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
397 final SpacecraftState state = propagator.propagate(date);
398 final ParameterDriver[] drivers = new ParameterDriver[] {
399 stationParameter.getEastOffsetDriver(),
400 stationParameter.getNorthOffsetDriver(),
401 stationParameter.getZenithOffsetDriver(),
402 };
403 for (int i = 0; i < drivers.length; ++i) {
404 final double[] gradient = measurement.estimate(0, 0, new SpacecraftState[] { state }).getParameterDerivatives(drivers[i]);
405 Assert.assertEquals(1, measurement.getDimension());
406 Assert.assertEquals(1, gradient.length);
407
408 final ParameterFunction dMkdP =
409 Differentiation.differentiate(new ParameterFunction() {
410
411 @Override
412 public double value(final ParameterDriver parameterDriver) {
413 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue()[0];
414 }
415 }, 3, 20.0 * drivers[i].getScale());
416 final double ref = dMkdP.value(drivers[i]);
417 maxRelativeError = FastMath.max(maxRelativeError, FastMath.abs((ref - gradient[0]) / ref));
418 }
419
420 }
421 Assert.assertEquals(0, maxRelativeError, 1.2e-6);
422
423 }
424
425
426
427
428
429 @Test
430 public void testStateDerivativesWithModifier() {
431
432 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
433
434 final NumericalPropagatorBuilder propagatorBuilder =
435 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
436 1.0e-6, 60.0, 0.001);
437
438
439 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
440 propagatorBuilder);
441 final double groundClockDrift = 4.8e-9;
442 for (final GroundStation station : context.stations) {
443 station.getClockDriftDriver().setValue(groundClockDrift);
444 }
445 final double satClkDrift = 3.2e-10;
446 final List<ObservedMeasurement<?>> measurements =
447 EstimationTestUtils.createMeasurements(propagator,
448 new RangeRateMeasurementCreator(context, false, satClkDrift),
449 1.0, 3.0, 300.0);
450 propagator.clearStepHandlers();
451
452 double maxRelativeError = 0;
453 for (final ObservedMeasurement<?> measurement : measurements) {
454
455 final RangeRateTroposphericDelayModifier modifier = new RangeRateTroposphericDelayModifier(SaastamoinenModel.getStandardModel(), true);
456 ((RangeRate) measurement).addModifier(modifier);
457
458
459
460 final double meanDelay = 1;
461 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
462 final SpacecraftState state = propagator.propagate(date);
463
464 final double[][] jacobian = measurement.estimate(0, 0, new SpacecraftState[] { state }).getStateDerivatives(0);
465
466 final double[][] finiteDifferencesJacobian =
467 Differentiation.differentiate(new StateFunction() {
468 public double[] value(final SpacecraftState state) {
469 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue();
470 }
471 }, 1, propagator.getAttitudeProvider(),
472 OrbitType.CARTESIAN, PositionAngle.TRUE, 15.0, 3).value(state);
473
474 Assert.assertEquals(finiteDifferencesJacobian.length, jacobian.length);
475 Assert.assertEquals(finiteDifferencesJacobian[0].length, jacobian[0].length);
476
477 for (int i = 0; i < jacobian.length; ++i) {
478 for (int j = 0; j < jacobian[i].length; ++j) {
479
480 maxRelativeError = FastMath.max(maxRelativeError,
481 FastMath.abs((finiteDifferencesJacobian[i][j] - jacobian[i][j]) /
482 finiteDifferencesJacobian[i][j]));
483 }
484 }
485
486 }
487 Assert.assertEquals(0, maxRelativeError, 1.4e-7);
488
489 }
490
491
492
493
494
495 @Test
496 public void testStateDerivativesWithEstimatedModifier() {
497
498 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
499
500 final NumericalPropagatorBuilder propagatorBuilder =
501 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
502 1.0e-6, 60.0, 0.001);
503
504
505 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
506 propagatorBuilder);
507
508 final double groundClockDrift = 4.8e-9;
509 for (final GroundStation station : context.stations) {
510 station.getClockDriftDriver().setValue(groundClockDrift);
511 }
512 final double satClkDrift = 3.2e-10;
513 final List<ObservedMeasurement<?>> measurements =
514 EstimationTestUtils.createMeasurements(propagator,
515 new RangeRateMeasurementCreator(context, false, satClkDrift),
516 1.0, 3.0, 300.0);
517 propagator.clearStepHandlers();
518
519 double maxRelativeError = 0;
520 for (final ObservedMeasurement<?> measurement : measurements) {
521
522
523 final GlobalMappingFunctionModel mappingFunction = new GlobalMappingFunctionModel();
524 final EstimatedTroposphericModel tropoModel = new EstimatedTroposphericModel(mappingFunction, 5.0);
525
526 final RangeRateTroposphericDelayModifier modifier = new RangeRateTroposphericDelayModifier(tropoModel, true);
527 ((RangeRate) measurement).addModifier(modifier);
528
529
530
531 final double meanDelay = 1;
532 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
533 final SpacecraftState state = propagator.propagate(date);
534
535 final double[][] jacobian = measurement.estimate(0, 0, new SpacecraftState[] { state }).getStateDerivatives(0);
536
537 final double[][] finiteDifferencesJacobian =
538 Differentiation.differentiate(new StateFunction() {
539 public double[] value(final SpacecraftState state) {
540 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue();
541 }
542 }, 1, propagator.getAttitudeProvider(),
543 OrbitType.CARTESIAN, PositionAngle.TRUE, 15.0, 3).value(state);
544
545 Assert.assertEquals(finiteDifferencesJacobian.length, jacobian.length);
546 Assert.assertEquals(finiteDifferencesJacobian[0].length, jacobian[0].length);
547
548 for (int i = 0; i < jacobian.length; ++i) {
549 for (int j = 0; j < jacobian[i].length; ++j) {
550
551 maxRelativeError = FastMath.max(maxRelativeError,
552 FastMath.abs((finiteDifferencesJacobian[i][j] - jacobian[i][j]) /
553 finiteDifferencesJacobian[i][j]));
554 }
555 }
556
557 }
558 Assert.assertEquals(0, maxRelativeError, 3.1e-7);
559
560 }
561
562
563
564
565
566 @Test
567 public void testParameterDerivativesWithModifier() {
568
569 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
570
571 final NumericalPropagatorBuilder propagatorBuilder =
572 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
573 1.0e-6, 60.0, 0.001);
574
575
576 final double groundClockDrift = 4.8e-9;
577 for (final GroundStation station : context.stations) {
578 station.getClockDriftDriver().setValue(groundClockDrift);
579 }
580 final double satClkDrift = 3.2e-10;
581 final RangeRateMeasurementCreator creator = new RangeRateMeasurementCreator(context, false, satClkDrift);
582 creator.getSatellite().getClockDriftDriver().setSelected(true);
583 for (final GroundStation station : context.stations) {
584 station.getClockOffsetDriver().setSelected(true);
585 station.getClockDriftDriver().setSelected(true);
586 station.getEastOffsetDriver().setSelected(true);
587 station.getNorthOffsetDriver().setSelected(true);
588 station.getZenithOffsetDriver().setSelected(true);
589 }
590 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
591 propagatorBuilder);
592
593 final List<ObservedMeasurement<?>> measurements =
594 EstimationTestUtils.createMeasurements(propagator,
595 creator,
596 1.0, 3.0, 300.0);
597 propagator.clearStepHandlers();
598
599 double maxRelativeError = 0;
600 for (final ObservedMeasurement<?> measurement : measurements) {
601
602 final RangeRateTroposphericDelayModifier modifier = new RangeRateTroposphericDelayModifier(SaastamoinenModel.getStandardModel(), true);
603 ((RangeRate) measurement).addModifier(modifier);
604
605
606 final GroundStation stationParameter = ((RangeRate) measurement).getStation();
607
608
609
610
611
612
613
614
615 final double meanDelay = measurement.getObservedValue()[0] / Constants.SPEED_OF_LIGHT;
616 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
617 final SpacecraftState state = propagator.propagate(date);
618 final ParameterDriver[] drivers = new ParameterDriver[] {
619 stationParameter.getClockDriftDriver(),
620 stationParameter.getEastOffsetDriver(),
621 stationParameter.getNorthOffsetDriver(),
622 stationParameter.getZenithOffsetDriver(),
623 measurement.getSatellites().get(0).getClockDriftDriver()
624 };
625 for (int i = 0; i < drivers.length; ++i) {
626 final double[] gradient = measurement.estimate(0, 0, new SpacecraftState[] { state }).getParameterDerivatives(drivers[i]);
627 Assert.assertEquals(1, measurement.getDimension());
628 Assert.assertEquals(1, gradient.length);
629
630 final ParameterFunction dMkdP =
631 Differentiation.differentiate(new ParameterFunction() {
632
633 @Override
634 public double value(final ParameterDriver parameterDriver) {
635 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue()[0];
636 }
637 }, 3, 20.0 * drivers[i].getScale());
638 final double ref = dMkdP.value(drivers[i]);
639 maxRelativeError = FastMath.max(maxRelativeError, FastMath.abs((ref - gradient[0]) / ref));
640 }
641
642 }
643 Assert.assertEquals(0, maxRelativeError, 1.2e-6);
644
645 }
646
647
648
649
650
651 @Test
652 public void testParameterDerivativesWithEstimatedModifier() {
653
654 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
655
656 final NumericalPropagatorBuilder propagatorBuilder =
657 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
658 1.0e-6, 60.0, 0.001);
659
660 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
661 propagatorBuilder);
662
663 final double groundClockDrift = 4.8e-9;
664 for (final GroundStation station : context.stations) {
665 station.getClockDriftDriver().setValue(groundClockDrift);
666 }
667 final double satClkDrift = 3.2e-10;
668 final List<ObservedMeasurement<?>> measurements =
669 EstimationTestUtils.createMeasurements(propagator,
670 new RangeRateMeasurementCreator(context, false, satClkDrift),
671 1.0, 3.0, 300.0);
672 propagator.clearStepHandlers();
673
674 double maxRelativeError = 0;
675 for (final ObservedMeasurement<?> measurement : measurements) {
676
677
678 final GlobalMappingFunctionModel mappingFunction = new GlobalMappingFunctionModel();
679 final EstimatedTroposphericModel tropoModel = new EstimatedTroposphericModel(mappingFunction, 10.0);
680
681 final List<ParameterDriver> parameters = tropoModel.getParametersDrivers();
682 for (ParameterDriver driver : parameters) {
683 driver.setSelected(true);
684 }
685
686 final RangeRateTroposphericDelayModifier modifier = new RangeRateTroposphericDelayModifier(tropoModel, true);
687 ((RangeRate) measurement).addModifier(modifier);
688
689
690
691
692
693
694
695
696 final double meanDelay = measurement.getObservedValue()[0] / Constants.SPEED_OF_LIGHT;
697 final AbsoluteDate date = measurement.getDate().shiftedBy(-0.75 * meanDelay);
698 final SpacecraftState state = propagator.propagate(date);
699
700 final ParameterDriver[] drivers = new ParameterDriver[] {
701 parameters.get(0)
702 };
703 for (int i = 0; i < 1; ++i) {
704 final double[] gradient = measurement.estimate(0, 0, new SpacecraftState[] { state }).getParameterDerivatives(drivers[i]);
705 Assert.assertEquals(1, measurement.getDimension());
706 Assert.assertEquals(1, gradient.length);
707
708 final ParameterFunction dMkdP =
709 Differentiation.differentiate(new ParameterFunction() {
710
711 @Override
712 public double value(final ParameterDriver parameterDriver) {
713 return measurement.estimate(0, 0, new SpacecraftState[] { state }).getEstimatedValue()[0];
714 }
715 }, 3, 0.1 * drivers[i].getScale());
716 final double ref = dMkdP.value(drivers[i]);
717 maxRelativeError = FastMath.max(maxRelativeError, FastMath.abs((ref - gradient[0]) / ref));
718 }
719
720 }
721 Assert.assertEquals(0, maxRelativeError, 2.2e-7);
722
723 }
724
725 }
726
727