|
31 | 31 | using System; |
32 | 32 | using System.Collections.Generic; |
33 | 33 | using Numerics.Mathematics.Optimization; |
| 34 | +using Numerics.Mathematics.RootFinding; |
34 | 35 | using Numerics.Mathematics.SpecialFunctions; |
35 | 36 |
|
36 | 37 | namespace Numerics.Distributions |
@@ -566,7 +567,7 @@ private double NCT_INV(double p, double df, double delta) |
566 | 567 | iter = iter + 1; |
567 | 568 | } |
568 | 569 | // Solve for T using Brent |
569 | | - double ANS = ZBrent(t0, t1, y0, y1, xtol, df, delta, p); |
| 570 | + double ANS = Brent.Solve(x => NCTDist(x, df, delta) - p, Math.Min(t0, t1), Math.Max(t0, t1), xtol, reportFailure: false); |
570 | 571 | return ANS; |
571 | 572 | } |
572 | 573 |
|
@@ -597,128 +598,6 @@ private double NCTInv0(double P, double N, double D) |
597 | 598 | } |
598 | 599 | } |
599 | 600 |
|
600 | | - private double ZBrent(double X1, double X2, double y1, double y2, double Tol, double N, double Dnc, double Perc) |
601 | | - { |
602 | | - double ZBrentRet = default; |
603 | | - // |
604 | | - // Finds the zero of NCTDist(x, n, d) - p given that [x1, x2] brackets the zero and |
605 | | - // Y1 = value at X1, Y2 = value at X2. |
606 | | - // |
607 | | - // Translated from Numerical Recipes (1986). |
608 | | - // William A. Huber, 24 March 2001. |
609 | | - // |
610 | | - double a; |
611 | | - double b; |
612 | | - var c = default(double); |
613 | | - double fc; |
614 | | - var D = default(double); |
615 | | - var e = default(double); |
616 | | - double tol1; |
617 | | - double xm; |
618 | | - double s; |
619 | | - double P; |
620 | | - double q; |
621 | | - double r; |
622 | | - double fa; |
623 | | - double fb; |
624 | | - int iter; |
625 | | - const int itmax = 100; |
626 | | - const double eps = 0.00000003d; |
627 | | - a = X1; |
628 | | - b = X2; |
629 | | - fa = y1; |
630 | | - fb = y2; |
631 | | - if (fb * fa > 0d) |
632 | | - { |
633 | | - throw new ArgumentException("Brent's method failed because the root is not bracketed."); |
634 | | - } |
635 | | - |
636 | | - fc = fb; |
637 | | - for (iter = 1; iter <= itmax; iter++) |
638 | | - { |
639 | | - if (fb * fc > 0d) |
640 | | - { |
641 | | - c = a; |
642 | | - fc = fa; |
643 | | - D = b - a; |
644 | | - e = D; |
645 | | - } |
646 | | - |
647 | | - if (Math.Abs(fc) < Math.Abs(fb)) |
648 | | - { |
649 | | - a = b; |
650 | | - b = c; |
651 | | - c = a; |
652 | | - fa = fb; |
653 | | - fb = fc; |
654 | | - fc = fa; |
655 | | - } |
656 | | - |
657 | | - tol1 = 2.0d * eps * Math.Abs(b) + 0.5d * Tol; |
658 | | - xm = 0.5d * (c - b); |
659 | | - if (Math.Abs(xm) <= tol1 || fb == 0d) |
660 | | - { |
661 | | - return b; |
662 | | - } |
663 | | - |
664 | | - if (Math.Abs(e) >= tol1 && Math.Abs(fa) > Math.Abs(fb)) |
665 | | - { |
666 | | - s = fb / fa; |
667 | | - if (a == c) |
668 | | - { |
669 | | - P = 2.0d * xm * s; |
670 | | - q = 1.0d - s; |
671 | | - } |
672 | | - else |
673 | | - { |
674 | | - q = fa / fc; |
675 | | - r = fb / fc; |
676 | | - P = s * (2.0d * xm * q * (q - r) - (b - a) * (r - 1.0d)); |
677 | | - q = (q - 1.0d) * (r - 1.0d) * (s - 1.0d); |
678 | | - } |
679 | | - |
680 | | - if (P > 0d) |
681 | | - q = -q; |
682 | | - P = Math.Abs(P); |
683 | | - if (2.0d * P < 3.0d * xm * q - Math.Abs(tol1 * q) & 2.0d * P < Math.Abs(e * q)) |
684 | | - { |
685 | | - e = D; |
686 | | - D = P / q; |
687 | | - } |
688 | | - else |
689 | | - { |
690 | | - D = xm; |
691 | | - e = D; |
692 | | - } |
693 | | - } |
694 | | - else |
695 | | - { |
696 | | - D = xm; |
697 | | - e = D; |
698 | | - } |
699 | | - |
700 | | - a = b; |
701 | | - fa = fb; |
702 | | - if (Math.Abs(D) > tol1) |
703 | | - { |
704 | | - b = b + D; |
705 | | - } |
706 | | - else if (xm > 0d) // b = b + SIGN(tol1, xm) |
707 | | - { |
708 | | - b = b + Math.Abs(tol1); |
709 | | - } |
710 | | - else |
711 | | - { |
712 | | - b = b - Math.Abs(tol1); |
713 | | - } |
714 | | - |
715 | | - fb = NCTDist(b, N, Dnc) - Perc; |
716 | | - } |
717 | | - |
718 | | - ZBrentRet = b; |
719 | | - return ZBrentRet; |
720 | | - } |
721 | | - |
722 | 601 | /// <inheritdoc/> |
723 | 602 | public override UnivariateDistributionBase Clone() |
724 | 603 | { |
|
0 commit comments