[ 
https://issues.apache.org/jira/browse/MATH-156?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Luc Maisonobe resolved MATH-156.
--------------------------------

       Resolution: Fixed
    Fix Version/s:     (was: 1.2)
                   Nightly Builds

fixed in SVN revision 536283 (checked in 2007-05-08)

> Brent solver is non-optimal, because it doesn't use the user's guess.
> ---------------------------------------------------------------------
>
>                 Key: MATH-156
>                 URL: https://issues.apache.org/jira/browse/MATH-156
>             Project: Commons Math
>          Issue Type: Improvement
>            Reporter: Tyler Ward
>         Assigned To: Luc Maisonobe
>             Fix For: Nightly Builds
>
>
> Hi guys, I noticed that your brent solver isn't using the initial guess given 
> by the user. This can often radically improve the performance of the solver. 
> In my tests, it improved it by roughly 30% or more, with a decent guess. 
> Basically, we should try the guess first. If that's close enough, rreturn it. 
> Otherwise, try one of the end points. If that's close enough, return it. Then 
> if that brackets, go into the main loop. If that doesn't bracket, then we 
> instead try the other endpoint. If that's close enough, return it. If that 
> doesn't bracket, throw an exception. If it does bracket, go into the main 
> loop with all three trial points available, allowing the quadratic 
> interpolation to be used immediately.
> Worst case scenario, the initial guess doesn't bracket. In that case it is 
> better than the default algorithm only if the user's initial guess is better 
> than linear interpolation, which I imagine it almost always would be. If the 
> user can't guess better than linear interpolation, presumably they wouldn't 
> provide a guess at all, and then nothing would change.
> It's a small addition, less than 100 lines of code. I can't send it in due to 
> legal at work, but from the above ideas, you should be able to put it in 
> easily. One caveat. You may need to slightly modify the baisic solve(double, 
> double) method to linearly interpolate a good beginning point and then break 
> out a six double (solve(x0, y0, x1, y1, x2, y2)) method that both solve(min, 
> max) and solve(min, max, initial) can use. If you don't do this, then 
> solve(min, max) will bisect on its first iteration rather than intepolating, 
> which could cost performance. If you do break it out like so, then this will 
> always perform better than the current implementation.
> As a good case study, here's our situation from work. 
> We are trying to compute a root, we know it falls in a VERY large interval 
> (in this case -1.0 to 1.0), but more than 99% of the time it will be between 
> (say) 1.04 and 1.07. We can guess with stunning accuracy, at least 90% of the 
> time we can come to within 10^-4 for very little cost (a very nice cubic 
> approximation of the more complicated function), but  we really need it to 
> within 10^-8 or better. In addition, that 1% of the time, it can fall in very 
> strange areas (0.9, or -0.3 or so), and our guess isn't very good when that 
> happens. So we can't tighten down the interval, because that would cause 
> spurious errors, and at the same time your linear interpolation isn't going 
> to be very good at all. It easily takes you 3 or 4 steps to get as close as 
> our first guess. Using the first guess in this manner would cut the steps to 
> convergence from about 8-10 to about 3-5. A speed up of around 100%, with no 
> loss in accuracy.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to