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
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
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...