1   /* Copyright 2002-2024 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.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       * Chan's method to compute probability of collision.
32       */
33      private final ShortTermEncounter2DPOCMethod method = new Chan1997();
34  
35      @Test
36      @DisplayName("Chan test case 01")
37      void ChanTestCase01() {
38          // GIVEN
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          // WHEN
46          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
47  
48          // THEN
49          Assertions.assertEquals(9.754e-3, result.getValue(), 1e-6);
50      }
51  
52      @Test
53      @DisplayName("Chan test case 02")
54      void ChanTestCase02() {
55          // GIVEN
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          // WHEN
63          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
64  
65          // THEN
66          Assertions.assertEquals(9.189e-3, result.getValue(), 1e-6);
67      }
68  
69      @Test
70      @DisplayName("Chan test case 03")
71      void ChanTestCase03() {
72          // GIVEN
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          // WHEN
80          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
81  
82          // THEN
83          Assertions.assertEquals(6.586e-3, result.getValue(), 1e-6);
84      }
85  
86      @Test
87      @DisplayName("Chan test case 04")
88      void ChanTestCase04() {
89          // GIVEN
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          // WHEN
97          final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
98  
99          // THEN
100         Assertions.assertEquals(6.135e-3, result.getValue(), 1e-6);
101     }
102 
103     @Test
104     @DisplayName("Chan test case 05")
105     void ChanTestCase05() {
106         // GIVEN
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         // WHEN
114         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
115 
116         // THEN
117         Assertions.assertEquals(1.577e-5, result.getValue(), 1e-8);
118     }
119 
120     @Test
121     @DisplayName("Chan test case 06")
122     void ChanTestCase06() {
123         // GIVEN
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         // WHEN
131         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
132 
133         // THEN
134         Assertions.assertEquals(1.011e-5, result.getValue(), 1e-8);
135     }
136 
137     @Test
138     @DisplayName("Chan test case 07")
139     void ChanTestCase07() {
140         // GIVEN
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         // WHEN
148         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
149 
150         // THEN
151         Assertions.assertEquals(6.443e-8, result.getValue(), 1e-11);
152     }
153 
154     @Test
155     @DisplayName("Chan test case 08")
156     void ChanTestCase08() {
157         // GIVEN
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         // WHEN
165         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
166 
167         // THEN
168         Assertions.assertEquals(3.216e-27, result.getValue(), 1e-30);
169     }
170 
171     @Test
172     @DisplayName("Chan test case 09")
173     void ChanTestCase09() {
174         // GIVEN
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         // WHEN
182         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
183 
184         // THEN
185         Assertions.assertEquals(3.033e-6, result.getValue(), 1e-9);
186     }
187 
188     @Test
189     @DisplayName("Chan test case 10")
190     void ChanTestCase10() {
191         // GIVEN
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         // WHEN
199         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
200 
201         // THEN
202         Assertions.assertEquals(9.645e-28, result.getValue(), 1e-31);
203     }
204 
205     @Test
206     @DisplayName("Chan test case 11")
207     void ChanTestCase11() {
208         // GIVEN
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         // WHEN
216         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
217 
218         // THEN
219         Assertions.assertEquals(1.039e-4, result.getValue(), 1e-7);
220     }
221 
222     @Test
223     @DisplayName("Chan test case 12")
224     void ChanTestCase12() {
225         // GIVEN
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         // WHEN
233         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
234 
235         // THEN
236         Assertions.assertEquals(1.556e-9, result.getValue(), 1e-12);
237     }
238 
239     @Test
240     @DisplayName("CSM test case 1")
241     void CsmTestCase1() {
242         // GIVEN
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         // WHEN
250         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
251 
252         // THEN
253         Assertions.assertEquals(1.8934e-3, result.getValue(), 1e-7);
254     }
255 
256     @Test
257     @DisplayName("CSM test case 2")
258     void CsmTestCase2() {
259         // GIVEN
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         // WHEN
267         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
268 
269         // THEN
270         Assertions.assertEquals(2.0135e-11, result.getValue(), 1e-15);
271     }
272 
273     @Test
274     @DisplayName("CSM test case 3")
275     void CsmTestCase3() {
276         // GIVEN
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         // WHEN
284         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
285 
286         // THEN
287         Assertions.assertEquals(7.2000e-5, result.getValue(), 1e-9);
288     }
289 
290     @Test
291     @DisplayName("CDM test case 1")
292     void CdmTestCase1() {
293         // GIVEN
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         // WHEN
301         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
302 
303         // THEN
304         Assertions.assertEquals(5.3903e-7, result.getValue(), 1e-11);
305     }
306 
307     @Test
308     @DisplayName("CDM test case 2")
309     void CdmTestCase2() {
310         // GIVEN
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         // WHEN
318         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
319 
320         // THEN
321         Assertions.assertEquals(2.2880e-20, result.getValue(), 1e-24);
322     }
323 
324     @Test
325     @DisplayName("Alfano test case 3")
326     void AlfanoTestCase3() {
327         // GIVEN
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         // WHEN
335         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
336 
337         // THEN
338         Assertions.assertEquals(3.1264e-2, result.getValue(), 1e-6);
339     }
340 
341     @Test
342     @DisplayName("Alfano test case 5")
343     void AlfanoTestCase5() {
344         // GIVEN
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         // WHEN
352         final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
353 
354         // THEN
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         // GIVEN
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         // WHEN
369         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
370 
371         // THEN
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         // GIVEN
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         // WHEN
386         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
387 
388         // THEN
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         // GIVEN
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         // WHEN
403         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
404 
405         // THEN
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         // GIVEN
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         // WHEN
420         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
421 
422         // THEN
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         // GIVEN
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         // WHEN
437         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
438 
439         // THEN
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         // GIVEN
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         // WHEN
454         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
455 
456         // THEN
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         // GIVEN
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         // WHEN
471         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
472 
473         // THEN
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         // GIVEN
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         // WHEN
488         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
489 
490         // THEN
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         // GIVEN
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         // WHEN
505         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
506 
507         // THEN
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         // GIVEN
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         // WHEN
522         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
523 
524         // THEN
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         // GIVEN
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         // WHEN
539         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
540 
541         // THEN
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         // GIVEN
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         // WHEN
556         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
557 
558         // THEN
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         // GIVEN
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         // WHEN
573         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
574 
575         // THEN
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         // GIVEN
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         // WHEN
590         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
591 
592         // THEN
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         // GIVEN
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         // WHEN
607         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
608 
609         // THEN
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         // GIVEN
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         // WHEN
624         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
625 
626         // THEN
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         // GIVEN
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         // WHEN
641         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
642 
643         // THEN
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         // GIVEN
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         // WHEN
658         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
659 
660         // THEN
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         // GIVEN
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         // WHEN
675         final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
676 
677         // THEN
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         // GIVEN
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         // WHEN
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         // THEN
708         Assertions.assertEquals(6.1e-3, resultNominal.getValue().getReal(), 1e-4);
709         Assertions.assertEquals(exactResult, taylorResult, 1e-18);
710     }
711 }