1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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       * Chan's method to compute probability of collision.
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          // GIVEN
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          // WHEN
53          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
54  
55          // THEN
56          Assertions.assertEquals(9.754e-3, result.getValue(), 1e-6);
57      }
58  
59      @Test
60      @DisplayName("Chan test case 02")
61      void ChanTestCase02() {
62          // GIVEN
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          // WHEN
70          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
71  
72          // THEN
73          Assertions.assertEquals(9.189e-3, result.getValue(), 1e-6);
74      }
75  
76      @Test
77      @DisplayName("Chan test case 03")
78      void ChanTestCase03() {
79          // GIVEN
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          // WHEN
87          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
88  
89          // THEN
90          Assertions.assertEquals(6.586e-3, result.getValue(), 1e-6);
91      }
92  
93      @Test
94      @DisplayName("Chan test case 04")
95      void ChanTestCase04() {
96          // GIVEN
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         // WHEN
104         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
105 
106         // THEN
107         Assertions.assertEquals(6.135e-3, result.getValue(), 1e-6);
108     }
109 
110     @Test
111     @DisplayName("Chan test case 05")
112     void ChanTestCase05() {
113         // GIVEN
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         // WHEN
121         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
122 
123         // THEN
124         Assertions.assertEquals(1.577e-5, result.getValue(), 1e-8);
125     }
126 
127     @Test
128     @DisplayName("Chan test case 06")
129     void ChanTestCase06() {
130         // GIVEN
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         // WHEN
138         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
139 
140         // THEN
141         Assertions.assertEquals(1.011e-5, result.getValue(), 1e-8);
142     }
143 
144     @Test
145     @DisplayName("Chan test case 07")
146     void ChanTestCase07() {
147         // GIVEN
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         // WHEN
155         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
156 
157         // THEN
158         Assertions.assertEquals(6.443e-8, result.getValue(), 1e-11);
159     }
160 
161     @Test
162     @DisplayName("Chan test case 08")
163     void ChanTestCase08() {
164         // GIVEN
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         // WHEN
172         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
173 
174         // THEN
175         Assertions.assertEquals(3.216e-27, result.getValue(), 1e-30);
176     }
177 
178     @Test
179     @DisplayName("Chan test case 09")
180     void ChanTestCase09() {
181         // GIVEN
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         // WHEN
189         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
190 
191         // THEN
192         Assertions.assertEquals(3.033e-6, result.getValue(), 1e-9);
193     }
194 
195     @Test
196     @DisplayName("Chan test case 10")
197     void ChanTestCase10() {
198         // GIVEN
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         // WHEN
206         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
207 
208         // THEN
209         Assertions.assertEquals(9.645e-28, result.getValue(), 1e-31);
210     }
211 
212     @Test
213     @DisplayName("Chan test case 11")
214     void ChanTestCase11() {
215         // GIVEN
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         // WHEN
223         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
224 
225         // THEN
226         Assertions.assertEquals(1.039e-4, result.getValue(), 1e-7);
227     }
228 
229     @Test
230     @DisplayName("Chan test case 12")
231     void ChanTestCase12() {
232         // GIVEN
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         // WHEN
240         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
241 
242         // THEN
243         Assertions.assertEquals(1.556e-9, result.getValue(), 1e-12);
244     }
245 
246     @Test
247     @DisplayName("CSM test case 1")
248     void CsmTestCase1() {
249         // GIVEN
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         // WHEN
257         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
258 
259         // THEN
260         Assertions.assertEquals(1.8934e-3, result.getValue(), 1e-7);
261     }
262 
263     @Test
264     @DisplayName("CSM test case 2")
265     void CsmTestCase2() {
266         // GIVEN
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         // WHEN
274         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
275 
276         // THEN
277         Assertions.assertEquals(2.0135e-11, result.getValue(), 1e-15);
278     }
279 
280     @Test
281     @DisplayName("CSM test case 3")
282     void CsmTestCase3() {
283         // GIVEN
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         // WHEN
291         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
292 
293         // THEN
294         Assertions.assertEquals(7.2000e-5, result.getValue(), 1e-9);
295     }
296 
297     @Test
298     @DisplayName("CDM test case 1")
299     void CdmTestCase1() {
300         // GIVEN
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         // WHEN
308         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
309 
310         // THEN
311         Assertions.assertEquals(5.3903e-7, result.getValue(), 1e-11);
312     }
313 
314     @Test
315     @DisplayName("CDM test case 2")
316     void CdmTestCase2() {
317         // GIVEN
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         // WHEN
325         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
326 
327         // THEN
328         Assertions.assertEquals(2.2880e-20, result.getValue(), 1e-24);
329     }
330 
331     @Test
332     @DisplayName("Alfano test case 3")
333     void AlfanoTestCase3() {
334         // GIVEN
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         // WHEN
342         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
343 
344         // THEN
345         Assertions.assertEquals(3.1264e-2, result.getValue(), 1e-6);
346     }
347 
348     @Test
349     @DisplayName("Alfano test case 5")
350     void AlfanoTestCase5() {
351         // GIVEN
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         // WHEN
359         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
360 
361         // THEN
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         // GIVEN
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         // WHEN
376         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
377 
378         // THEN
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         // GIVEN
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         // WHEN
393         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
394 
395         // THEN
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         // GIVEN
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         // WHEN
410         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
411 
412         // THEN
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         // GIVEN
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         // WHEN
427         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
428 
429         // THEN
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         // GIVEN
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         // WHEN
444         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
445 
446         // THEN
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         // GIVEN
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         // WHEN
461         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
462 
463         // THEN
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         // GIVEN
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         // WHEN
478         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
479 
480         // THEN
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         // GIVEN
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         // WHEN
495         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
496 
497         // THEN
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         // GIVEN
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         // WHEN
512         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
513 
514         // THEN
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         // GIVEN
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         // WHEN
529         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
530 
531         // THEN
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         // GIVEN
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         // WHEN
546         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
547 
548         // THEN
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         // GIVEN
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         // WHEN
563         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
564 
565         // THEN
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         // GIVEN
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         // WHEN
580         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
581 
582         // THEN
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         // GIVEN
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         // WHEN
597         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
598 
599         // THEN
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         // GIVEN
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         // WHEN
614         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
615 
616         // THEN
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         // GIVEN
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         // WHEN
631         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
632 
633         // THEN
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         // GIVEN
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         // WHEN
648         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
649 
650         // THEN
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         // GIVEN
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         // WHEN
665         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
666 
667         // THEN
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         // GIVEN
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         // WHEN
682         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
683 
684         // THEN
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         // GIVEN
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         // WHEN
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         // THEN
715         Assertions.assertEquals(6.1e-3, resultNominal.getValue().getReal(), 1e-4);
716         Assertions.assertEquals(exactResult, taylorResult, 1e-18);
717     }
718 }