1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.ssa.collision.shorttermencounter.probability.twod;
18
19 import org.hipparchus.analysis.differentiation.DSFactory;
20 import org.hipparchus.analysis.differentiation.DerivativeStructure;
21 import org.hipparchus.util.Binary64;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.DisplayName;
24 import org.junit.jupiter.api.Test;
25 import org.orekit.ssa.metrics.FieldProbabilityOfCollision;
26 import org.orekit.ssa.metrics.ProbabilityOfCollision;
27
28 class Chan1997Test {
29
30
31
32
33 private final ShortTermEncounter2DPOCMethod method = new Chan1997();
34
35 @Test
36 @DisplayName("Chan test case 01")
37 void ChanTestCase01() {
38
39 final double xm = 0;
40 final double ym = 10;
41 final double sigmaX = 25;
42 final double sigmaY = 50;
43 final double radius = 5;
44
45
46 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
47
48
49 Assertions.assertEquals(9.754e-3, result.getValue(), 1e-6);
50 }
51
52 @Test
53 @DisplayName("Chan test case 02")
54 void ChanTestCase02() {
55
56 final double xm = 10;
57 final double ym = 0;
58 final double sigmaX = 25;
59 final double sigmaY = 50;
60 final double radius = 5;
61
62
63 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
64
65
66 Assertions.assertEquals(9.189e-3, result.getValue(), 1e-6);
67 }
68
69 @Test
70 @DisplayName("Chan test case 03")
71 void ChanTestCase03() {
72
73 final double xm = 0;
74 final double ym = 10;
75 final double sigmaX = 25;
76 final double sigmaY = 75;
77 final double radius = 5;
78
79
80 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
81
82
83 Assertions.assertEquals(6.586e-3, result.getValue(), 1e-6);
84 }
85
86 @Test
87 @DisplayName("Chan test case 04")
88 void ChanTestCase04() {
89
90 final double xm = 10;
91 final double ym = 0;
92 final double sigmaX = 25;
93 final double sigmaY = 75;
94 final double radius = 5;
95
96
97 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
98
99
100 Assertions.assertEquals(6.135e-3, result.getValue(), 1e-6);
101 }
102
103 @Test
104 @DisplayName("Chan test case 05")
105 void ChanTestCase05() {
106
107 final double xm = 0;
108 final double ym = 1000;
109 final double sigmaX = 1000;
110 final double sigmaY = 3000;
111 final double radius = 10;
112
113
114 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
115
116
117 Assertions.assertEquals(1.577e-5, result.getValue(), 1e-8);
118 }
119
120 @Test
121 @DisplayName("Chan test case 06")
122 void ChanTestCase06() {
123
124 final double xm = 1000;
125 final double ym = 0;
126 final double sigmaX = 1000;
127 final double sigmaY = 3000;
128 final double radius = 10;
129
130
131 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
132
133
134 Assertions.assertEquals(1.011e-5, result.getValue(), 1e-8);
135 }
136
137 @Test
138 @DisplayName("Chan test case 07")
139 void ChanTestCase07() {
140
141 final double xm = 0;
142 final double ym = 10000;
143 final double sigmaX = 1000;
144 final double sigmaY = 3000;
145 final double radius = 10;
146
147
148 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
149
150
151 Assertions.assertEquals(6.443e-8, result.getValue(), 1e-11);
152 }
153
154 @Test
155 @DisplayName("Chan test case 08")
156 void ChanTestCase08() {
157
158 final double xm = 10000;
159 final double ym = 0;
160 final double sigmaX = 1000;
161 final double sigmaY = 3000;
162 final double radius = 10;
163
164
165 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
166
167
168 Assertions.assertEquals(3.216e-27, result.getValue(), 1e-30);
169 }
170
171 @Test
172 @DisplayName("Chan test case 09")
173 void ChanTestCase09() {
174
175 final double xm = 0;
176 final double ym = 10000;
177 final double sigmaX = 1000;
178 final double sigmaY = 10000;
179 final double radius = 10;
180
181
182 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
183
184
185 Assertions.assertEquals(3.033e-6, result.getValue(), 1e-9);
186 }
187
188 @Test
189 @DisplayName("Chan test case 10")
190 void ChanTestCase10() {
191
192 final double xm = 10000;
193 final double ym = 0;
194 final double sigmaX = 1000;
195 final double sigmaY = 10000;
196 final double radius = 10;
197
198
199 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
200
201
202 Assertions.assertEquals(9.645e-28, result.getValue(), 1e-31);
203 }
204
205 @Test
206 @DisplayName("Chan test case 11")
207 void ChanTestCase11() {
208
209 final double xm = 0;
210 final double ym = 5000;
211 final double sigmaX = 1000;
212 final double sigmaY = 3000;
213 final double radius = 50;
214
215
216 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
217
218
219 Assertions.assertEquals(1.039e-4, result.getValue(), 1e-7);
220 }
221
222 @Test
223 @DisplayName("Chan test case 12")
224 void ChanTestCase12() {
225
226 final double xm = 5000;
227 final double ym = 0;
228 final double sigmaX = 1000;
229 final double sigmaY = 3000;
230 final double radius = 50;
231
232
233 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
234
235
236 Assertions.assertEquals(1.556e-9, result.getValue(), 1e-12);
237 }
238
239 @Test
240 @DisplayName("CSM test case 1")
241 void CsmTestCase1() {
242
243 final double xm = 84.875546;
244 final double ym = 60.583685;
245 final double sigmaX = 57.918666;
246 final double sigmaY = 152.8814468;
247 final double radius = 10.3;
248
249
250 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
251
252
253 Assertions.assertEquals(1.8934e-3, result.getValue(), 1e-7);
254 }
255
256 @Test
257 @DisplayName("CSM test case 2")
258 void CsmTestCase2() {
259
260 final double xm = -81.618369;
261 final double ym = 115.055899;
262 final double sigmaX = 15.988242;
263 final double sigmaY = 5756.840725;
264 final double radius = 1.3;
265
266
267 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
268
269
270 Assertions.assertEquals(2.0135e-11, result.getValue(), 1e-15);
271 }
272
273 @Test
274 @DisplayName("CSM test case 3")
275 void CsmTestCase3() {
276
277 final double xm = 102.177247;
278 final double ym = 693.405893;
279 final double sigmaX = 94.230921;
280 final double sigmaY = 643.409272;
281 final double radius = 5.3;
282
283
284 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
285
286
287 Assertions.assertEquals(7.2000e-5, result.getValue(), 1e-9);
288 }
289
290 @Test
291 @DisplayName("CDM test case 1")
292 void CdmTestCase1() {
293
294 final double xm = -752.672701;
295 final double ym = 644.939441;
296 final double sigmaX = 445.859950;
297 final double sigmaY = 6095.858688;
298 final double radius = 3.5;
299
300
301 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
302
303
304 Assertions.assertEquals(5.3903e-7, result.getValue(), 1e-11);
305 }
306
307 @Test
308 @DisplayName("CDM test case 2")
309 void CdmTestCase2() {
310
311 final double xm = -692.362272;
312 final double ym = 4475.456261;
313 final double sigmaX = 193.454603;
314 final double sigmaY = 562.027293;
315 final double radius = 13.2;
316
317
318 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
319
320
321 Assertions.assertEquals(2.2880e-20, result.getValue(), 1e-24);
322 }
323
324 @Test
325 @DisplayName("Alfano test case 3")
326 void AlfanoTestCase3() {
327
328 final double xm = -3.8872073;
329 final double ym = 0.1591646;
330 final double sigmaX = 1.4101830;
331 final double sigmaY = 114.2585190;
332 final double radius = 15;
333
334
335 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
336
337
338 Assertions.assertEquals(3.1264e-2, result.getValue(), 1e-6);
339 }
340
341 @Test
342 @DisplayName("Alfano test case 5")
343 void AlfanoTestCase5() {
344
345 final double xm = -1.2217895;
346 final double ym = 2.1230067;
347 final double sigmaX = 0.0373279;
348 final double sigmaY = 177.8109003;
349 final double radius = 10;
350
351
352 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
353
354
355 Assertions.assertEquals(1.7346e-202, result.getValue(), 1e-206);
356 }
357
358 @Test
359 @DisplayName("Chan test case 01 Field version")
360 void ChanTestCase01FieldField() {
361
362 final Binary64 xm = new Binary64(0);
363 final Binary64 ym = new Binary64(10);
364 final Binary64 sigmaX = new Binary64(25);
365 final Binary64 sigmaY = new Binary64(50);
366 final Binary64 radius = new Binary64(5);
367
368
369 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
370
371
372 Assertions.assertEquals(9.754e-3, result.getValue().getReal(), 1e-6);
373 }
374
375 @Test
376 @DisplayName("Chan test case 02 Field version")
377 void ChanTestCase02Field() {
378
379 final Binary64 xm = new Binary64(10);
380 final Binary64 ym = new Binary64(0);
381 final Binary64 sigmaX = new Binary64(25);
382 final Binary64 sigmaY = new Binary64(50);
383 final Binary64 radius = new Binary64(5);
384
385
386 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
387
388
389 Assertions.assertEquals(9.189e-3, result.getValue().getReal(), 1e-6);
390 }
391
392 @Test
393 @DisplayName("Chan test case 03 Field version")
394 void ChanTestCase03Field() {
395
396 final Binary64 xm = new Binary64(0);
397 final Binary64 ym = new Binary64(10);
398 final Binary64 sigmaX = new Binary64(25);
399 final Binary64 sigmaY = new Binary64(75);
400 final Binary64 radius = new Binary64(5);
401
402
403 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
404
405
406 Assertions.assertEquals(6.586e-3, result.getValue().getReal(), 1e-6);
407 }
408
409 @Test
410 @DisplayName("Chan test case 04 Field version")
411 void ChanTestCase04Field() {
412
413 final Binary64 xm = new Binary64(10);
414 final Binary64 ym = new Binary64(0);
415 final Binary64 sigmaX = new Binary64(25);
416 final Binary64 sigmaY = new Binary64(75);
417 final Binary64 radius = new Binary64(5);
418
419
420 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
421
422
423 Assertions.assertEquals(6.135e-3, result.getValue().getReal(), 1e-6);
424 }
425
426 @Test
427 @DisplayName("Chan test case 05 Field version")
428 void ChanTestCase05Field() {
429
430 final Binary64 xm = new Binary64(0);
431 final Binary64 ym = new Binary64(1000);
432 final Binary64 sigmaX = new Binary64(1000);
433 final Binary64 sigmaY = new Binary64(3000);
434 final Binary64 radius = new Binary64(10);
435
436
437 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
438
439
440 Assertions.assertEquals(1.577e-5, result.getValue().getReal(), 1e-8);
441 }
442
443 @Test
444 @DisplayName("Chan test case 06 Field version")
445 void ChanTestCase06Field() {
446
447 final Binary64 xm = new Binary64(1000);
448 final Binary64 ym = new Binary64(0);
449 final Binary64 sigmaX = new Binary64(1000);
450 final Binary64 sigmaY = new Binary64(3000);
451 final Binary64 radius = new Binary64(10);
452
453
454 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
455
456
457 Assertions.assertEquals(1.011e-5, result.getValue().getReal(), 1e-8);
458 }
459
460 @Test
461 @DisplayName("Chan test case 07 Field version")
462 void ChanTestCase07Field() {
463
464 final Binary64 xm = new Binary64(0);
465 final Binary64 ym = new Binary64(10000);
466 final Binary64 sigmaX = new Binary64(1000);
467 final Binary64 sigmaY = new Binary64(3000);
468 final Binary64 radius = new Binary64(10);
469
470
471 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
472
473
474 Assertions.assertEquals(6.443e-8, result.getValue().getReal(), 1e-11);
475 }
476
477 @Test
478 @DisplayName("Chan test case 08 Field version")
479 void ChanTestCase08Field() {
480
481 final Binary64 xm = new Binary64(10000);
482 final Binary64 ym = new Binary64(0);
483 final Binary64 sigmaX = new Binary64(1000);
484 final Binary64 sigmaY = new Binary64(3000);
485 final Binary64 radius = new Binary64(10);
486
487
488 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
489
490
491 Assertions.assertEquals(3.216e-27, result.getValue().getReal(), 1e-30);
492 }
493
494 @Test
495 @DisplayName("Chan test case 09 Field version")
496 void ChanTestCase09Field() {
497
498 final Binary64 xm = new Binary64(0);
499 final Binary64 ym = new Binary64(10000);
500 final Binary64 sigmaX = new Binary64(1000);
501 final Binary64 sigmaY = new Binary64(10000);
502 final Binary64 radius = new Binary64(10);
503
504
505 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
506
507
508 Assertions.assertEquals(3.033e-6, result.getValue().getReal(), 1e-9);
509 }
510
511 @Test
512 @DisplayName("Chan test case 10 Field version")
513 void ChanTestCase10Field() {
514
515 final Binary64 xm = new Binary64(10000);
516 final Binary64 ym = new Binary64(0);
517 final Binary64 sigmaX = new Binary64(1000);
518 final Binary64 sigmaY = new Binary64(10000);
519 final Binary64 radius = new Binary64(10);
520
521
522 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
523
524
525 Assertions.assertEquals(9.645e-28, result.getValue().getReal(), 1e-31);
526 }
527
528 @Test
529 @DisplayName("Chan test case 11 Field version")
530 void ChanTestCase11Field() {
531
532 final Binary64 xm = new Binary64(0);
533 final Binary64 ym = new Binary64(5000);
534 final Binary64 sigmaX = new Binary64(1000);
535 final Binary64 sigmaY = new Binary64(3000);
536 final Binary64 radius = new Binary64(50);
537
538
539 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
540
541
542 Assertions.assertEquals(1.039e-4, result.getValue().getReal(), 1e-7);
543 }
544
545 @Test
546 @DisplayName("Chan test case 12 Field version")
547 void ChanTestCase12Field() {
548
549 final Binary64 xm = new Binary64(5000);
550 final Binary64 ym = new Binary64(0);
551 final Binary64 sigmaX = new Binary64(1000);
552 final Binary64 sigmaY = new Binary64(3000);
553 final Binary64 radius = new Binary64(50);
554
555
556 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
557
558
559 Assertions.assertEquals(1.556e-9, result.getValue().getReal(), 1e-12);
560 }
561
562 @Test
563 @DisplayName("CSM test case 1 Field version")
564 void CsmTestCase1Field() {
565
566 final Binary64 xm = new Binary64(84.875546);
567 final Binary64 ym = new Binary64(60.583685);
568 final Binary64 sigmaX = new Binary64(57.918666);
569 final Binary64 sigmaY = new Binary64(152.8814468);
570 final Binary64 radius = new Binary64(10.3);
571
572
573 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
574
575
576 Assertions.assertEquals(1.8934e-3, result.getValue().getReal(), 1e-7);
577 }
578
579 @Test
580 @DisplayName("CSM test case 2 Field version")
581 void CsmTestCase2Field() {
582
583 final Binary64 xm = new Binary64(-81.618369);
584 final Binary64 ym = new Binary64(115.055899);
585 final Binary64 sigmaX = new Binary64(15.988242);
586 final Binary64 sigmaY = new Binary64(5756.840725);
587 final Binary64 radius = new Binary64(1.3);
588
589
590 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
591
592
593 Assertions.assertEquals(2.0135e-11, result.getValue().getReal(), 1e-15);
594 }
595
596 @Test
597 @DisplayName("CSM test case 3 Field version")
598 void CsmTestCase3Field() {
599
600 final Binary64 xm = new Binary64(102.177247);
601 final Binary64 ym = new Binary64(693.405893);
602 final Binary64 sigmaX = new Binary64(94.230921);
603 final Binary64 sigmaY = new Binary64(643.409272);
604 final Binary64 radius = new Binary64(5.3);
605
606
607 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
608
609
610 Assertions.assertEquals(7.2000e-5, result.getValue().getReal(), 1e-9);
611 }
612
613 @Test
614 @DisplayName("CDM test case 1 Field version")
615 void CdmTestCase1Field() {
616
617 final Binary64 xm = new Binary64(-752.672701);
618 final Binary64 ym = new Binary64(644.939441);
619 final Binary64 sigmaX = new Binary64(445.859950);
620 final Binary64 sigmaY = new Binary64(6095.858688);
621 final Binary64 radius = new Binary64(3.5);
622
623
624 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
625
626
627 Assertions.assertEquals(5.3903e-7, result.getValue().getReal(), 1e-11);
628 }
629
630 @Test
631 @DisplayName("CDM test case 2 Field version")
632 void CdmTestCase2Field() {
633
634 final Binary64 xm = new Binary64(-692.362272);
635 final Binary64 ym = new Binary64(4475.456261);
636 final Binary64 sigmaX = new Binary64(193.454603);
637 final Binary64 sigmaY = new Binary64(562.027293);
638 final Binary64 radius = new Binary64(13.2);
639
640
641 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
642
643
644 Assertions.assertEquals(2.2880e-20, result.getValue().getReal(), 1e-24);
645 }
646
647 @Test
648 @DisplayName("Alfano test case 3 Field version")
649 void AlfanoTestCase3Field() {
650
651 final Binary64 xm = new Binary64(-3.8872073);
652 final Binary64 ym = new Binary64(0.1591646);
653 final Binary64 sigmaX = new Binary64(1.4101830);
654 final Binary64 sigmaY = new Binary64(114.2585190);
655 final Binary64 radius = new Binary64(15);
656
657
658 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
659
660
661 Assertions.assertEquals(3.1264e-2, result.getValue().getReal(), 1e-6);
662 }
663
664 @Test
665 @DisplayName("Alfano test case 5 Field version")
666 void AlfanoTestCase5Field() {
667
668 final Binary64 xm = new Binary64(-1.2217895);
669 final Binary64 ym = new Binary64(2.1230067);
670 final Binary64 sigmaX = new Binary64(0.0373279);
671 final Binary64 sigmaY = new Binary64(177.8109003);
672 final Binary64 radius = new Binary64(10);
673
674
675 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
676
677
678 Assertions.assertEquals(1.7346e-202, result.getValue().getReal(), 1e-206);
679 }
680
681 @Test
682 @DisplayName("Test impact on the probability of collision of a slight difference in combined radius in Chan test case 4")
683 void testReturnExpectedValueWhenIntroducingSmallChangeOnCombinedRadius() {
684
685 final DSFactory factory = new DSFactory(1, 10);
686
687 final double xmNominal = 10;
688 final double ymNominal = 0;
689 final double sigmaXNominal = 25;
690 final double sigmaYNominal = 75;
691 final double radiusNominal = 5;
692 final double dRadius = 2.5;
693
694 final DerivativeStructure xm = factory.constant(xmNominal);
695 final DerivativeStructure ym = factory.constant(ymNominal);
696 final DerivativeStructure sigmaX = factory.constant(sigmaXNominal);
697 final DerivativeStructure sigmaY = factory.constant(sigmaYNominal);
698 final DerivativeStructure radius = factory.variable(0, radiusNominal);
699
700
701 final FieldProbabilityOfCollision<DerivativeStructure> resultNominal =
702 method.compute(xm, ym, sigmaX, sigmaY, radius);
703 final double taylorResult = resultNominal.getValue().taylor(dRadius);
704 final double exactResult =
705 method.compute(xmNominal, ymNominal, sigmaXNominal, sigmaYNominal, radiusNominal + dRadius).getValue();
706
707
708 Assertions.assertEquals(6.1e-3, resultNominal.getValue().getReal(), 1e-4);
709 Assertions.assertEquals(exactResult, taylorResult, 1e-18);
710 }
711 }