71 subroutine bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
75 real(kind=rk)
function func_to_solve_t(x, r_dat, i_dat)
78 real(kind=rk),
intent(in) :: x
79 real(kind=rk),
intent(in) :: r_dat(:)
80 integer(kind=ik),
intent(in) :: i_dat(:)
81 end function func_to_solve_t
84 procedure(func_to_solve_t) :: f
85 real(kind=rk),
intent(in) :: r_dat(:)
86 integer(kind=ik),
intent(in) :: i_dat(:)
87 real(kind=rk),
intent(out) :: xc
88 real(kind=rk),
intent(in) :: x0_init, x1_init
89 real(kind=rk),
intent(in) :: x_epsilon, y_epsilon
90 integer(kind=ik),
intent(in) :: max_itr
91 integer(kind=ik),
intent(out) :: status
92 logical,
intent(in) :: progress
93 real(kind=rk) :: x0, x1, f0, f1, fc
94 integer(kind=ik) :: itr
98 f0 = f(xc, r_dat, i_dat)
99 if (abs(f0) < y_epsilon)
then
104 f1 = f(xc, r_dat, i_dat)
105 if (abs(f1) < y_epsilon)
then
109 if (progress) print *, 0, x0, f0, x1, f1
110 if (((f0 < 0) .and. (f1 < 0)) .or. ((f0 > 0) .and. (f1 > 0)))
then
115 if (abs(x0-x1) < x_epsilon)
then
118 fc = f(xc, r_dat, i_dat)
119 if (progress) print *, itr, x0, f0, x1, f1, xc, fc
120 if (abs(fc) < y_epsilon)
then
71 subroutine bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
…
163 subroutine multi_bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
167 real(kind=rk)
function func_to_solve_t(x, r_dat, i_dat)
170 real(kind=rk),
intent(in) :: x
171 real(kind=rk),
intent(in) :: r_dat(:)
172 integer(kind=ik),
intent(in) :: i_dat(:)
173 end function func_to_solve_t
176 procedure(func_to_solve_t) :: f
177 real(kind=rk),
intent(in) :: r_dat(:)
178 integer(kind=ik),
intent(in) :: i_dat(:)
179 real(kind=rk),
intent(out) :: xc
180 real(kind=rk),
intent(in) :: x0_init(:), x1_init(:)
181 real(kind=rk),
intent(in) :: x_epsilon, y_epsilon
182 integer(kind=ik),
intent(in) :: max_itr
183 integer(kind=ik),
intent(out) :: status
184 logical,
intent(in) :: progress
185 integer(kind=ik) :: interval, num_intervals
187 num_intervals =
size(x0_init, kind=ik)
188 do interval=1,num_intervals
189 if (progress) print *,
"Bisection on [", x0_init(interval),
", ", x1_init(interval),
"]"
190 call bisection(xc, x0_init(interval), x1_init(interval), f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, &
192 if (status == 0)
then
163 subroutine multi_bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
…
Configuration for MRFFL (MR Fortran Finance Library).
integer, parameter, public mrfflrk
Real kind used in interfaces.
integer, parameter, public mrfflik
Integer kinds used in interfaces.
Experimental root solvers that take a data payload in addition to a function.
subroutine, public bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
Search for a root for the function f in the interval [x0_init, x1_init].
subroutine, public multi_bisection(xc, x0_init, x1_init, f, r_dat, i_dat, x_epsilon, y_epsilon, max_itr, status, progress)
Use bisection() to search for a root for the function f in a list of intervals returning the first ro...