Compute the zero of the function f(x) in the interval ax,bx using the regula falsi method.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(regula_falsi_solver), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | ax |
left endpoint of initial interval |
||
real(kind=wp), | intent(in) | :: | bx |
right endpoint of initial interval |
||
real(kind=wp), | intent(in) | :: | fax |
|
||
real(kind=wp), | intent(in) | :: | fbx |
|
||
real(kind=wp), | intent(out) | :: | xzero |
abscissa approximating a zero of |
||
real(kind=wp), | intent(out) | :: | fzero |
value of |
||
integer, | intent(out) | :: | iflag |
status flag ( |
subroutine regula_falsi(me,ax,bx,fax,fbx,xzero,fzero,iflag) implicit none class(regula_falsi_solver),intent(inout) :: me real(wp),intent(in) :: ax !! left endpoint of initial interval real(wp),intent(in) :: bx !! right endpoint of initial interval real(wp),intent(in) :: fax !! `f(ax)` real(wp),intent(in) :: fbx !! `f(ax)` real(wp),intent(out) :: xzero !! abscissa approximating a zero of `f` in the interval `ax`,`bx` real(wp),intent(out) :: fzero !! value of `f` at the root (`f(xzero)`) integer,intent(out) :: iflag !! status flag (`0`=root found, `-2`=max iterations reached) real(wp) :: x1,x2,x3,f1,f2,f3 integer :: i !! iteration counter logical :: root_found !! convergence in x ! initialize: iflag = 0 x1 = ax x2 = bx f1 = fax f2 = fbx ! main loop do i=1,me%maxiter x3 = regula_falsi_step(x1,x2,f1,f2,ax,bx) ! calculate the new function value: f3 = me%f(x3) if (me%solution(x3,f3,xzero,fzero)) return ! determine new inclusion interval: if (f2*f3<0.0_wp) then ! root lies between x2 and x3 x1 = x3 x2 = x2 f1 = f3 f2 = f2 else ! root lies between x1 and x3 x2 = x3 f2 = f3 end if ! check for convergence: root_found = me%converged(x1,x2) if (root_found .or. i==me%maxiter) then call choose_best(x1,x2,f1,f2,xzero,fzero) if (.not. root_found) iflag = -2 ! max iterations reached exit end if end do end subroutine regula_falsi