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