Objective
I need to find roots of $$f(x)=c$$ in interval $[a,b]$, where
- $f(a)=0$ and $c<f(b)<1$
- $f(x)$ is unknown outside of the interval
- $f(x)$ is monotonuous and has decreasing derivative (i.e., $f''(x)<0$)
(Overall it resembles flipped hockey stick.)
What I tried
Right now I am using bisection method, which is somewhat slow for my purposes, as evaluating the function is expensive.
I tried other bracketing methods:
- false position (regula falsi) is slower due to the stagnant bound. Illinois improves performance a bit, but still slower than bisection.
- Ridder's method converges in less steps, but overall slower, as it requires more function evaluations (perhaps also due to the stagnant bound).
Question
Could I use my knowledge of the function properties outline in the beginning, to achieve faster convergence (less function evaluations)?
Possibilities. As an idea, one could try using transformation: $$F(x) = \log (1-f(x)), C=\log (1-c),$$ In a hope that false position converges faster for equation $$F(x)=C.$$
Supporting information: more details about the curve can be found here. Mine is not exactly teh same, but very similar. Calculating it directly is expensive, and one resorts to resampling and averaging.
I shall suppose that the computation of $f'(x)$ is more expensive that the computation of $f(x)$ itself.
For this kind of problems, I extensively used the so-called RTSAFE subroutine from "Numerical Recipes" (have a look at the documentation here on chapter $9$. Just adapt the FUND subroutine to return the derivative by finite difference.
This corresponds to a combination of bisection and Newton steps.