[ 
https://issues.apache.org/jira/browse/MATH-631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13084113#comment-13084113
 ] 

Dennis Hendriks commented on MATH-631:
--------------------------------------

The discussions for this issue have left me with a lack of overview, so I'll 
(try to) objectively summerize the discussions above:

The problems are:
 # Regula Falsi states it always converges, but the implementation doesn't.
 # The main loop may continue, even when it no longer makes any progress, and 
subsequently ends with a TooManyEvaluationsException exception.

The cause of both problems is:
 - The limited/finite precision of the Java double type.

Proposed solutions:
 # The patch from revision 1154614, which modifies the Regula Falsi algorithm.
   #- Consensus seems to be that this change, which modifies the algorithm, is 
undesireable. We should keep the original algorithm.
 # Detect that the algorithm no longer makes progress and throw an exception, 
instead of continuing the loop which no longer makes progress.
   #- This is just earlier detection of the algorithm getting stuck.
   #- We could throw the TooManyEvaluationsException exception, that continuing 
the loop would also get us.
     #-- The class only states "Exception to be thrown when the maximal number 
of evaluations is exceeded.".
     #-- The exception message only states: "illegal state: maximal count (100) 
exceeded: evaluations"
     #-- Both may benefit from more extended documentation/messages.
   #- We could also throw an other exception that more clearly states this 
issue (NoMoreProgressException, AlgorithmStuckException, ...?).
     #-- It could for instance mention that changing the function value 
accuracy may be a solution, or asking for a different kind of solution?
 # Add documentation to the Regula Falsi algorithm that it is not intended to 
be used for actual problems, but only to compare algorithms, for testing, 
educational purposes, etc.
 # Add documentation to the Regula Falsi algorithm that users should use 
Illinois or Pegasus instead, which should outperform the algorithm for most if 
not all problems.
 # Add documentation to the Regula Falsi algorithm that it theoretically 
converges, but the implementation may not, due to the limited/finite precision 
of Java's double type. This will result in an exception (or 2 if we also do 
solution number 2).
 # Remove the Regula Falsi algorithm, and document why it is not 
included/implemented.
   #- This seems to have been accepted as a last resort solution only.

Other notes:
 - The following problem was also indicated: a solution is found after a 
certain number of iterations, but the algorithm does not return the solution 
(it does not terminate)
   -- This should only happen if the user asked for a different solution. That 
is, there are several accuracy parameters, as well as an allowedSolution 
parameter.
   -- If the solution requested by the user is found, it should return the 
solution immediately, otherwise it is a bug.

New notes:
 - I think the Regula Falsi algorithm does not state a fixed convergence 
criteria: it is left to the user to decide on one.
   -- When I implemented the algorithm, I think I copied the convergence checks 
for Brent.
   -- I subsequently modified the convergence criteria when I added the 
allowedSolution parameter.

My personal opinions on the proposed solutions:
 - (1) Revert part of 1154614, so get the original algorithm back. The other 
changes of that commit, that don't change the actual algorith, can stay.
 - (2) If we keep the algorithm, earlier detection would be nice. Not sure 
which exception to throw in these cases.
   -- This would result in a single 'if' that detects that the new 
approximation is the same as the previous one, and we thus no longer make 
progress, in which case we throw the exception earlier, instead of later.
 - (3-5) If we keep the algorith, all 3 documentation extensions would be a 
good idea.
 - (6) If possible, keep the algorithm, and don't remove it.

New issue:
 - TooManyEvaluationsException currently seems to use 
LocalizedFormats.MAX_COUNT_EXCEEDED("maximal count ({0}) exceeded"), but maybe 
should use LocalizedFormats.MAX_EVALUATIONS_EXCEEDED("maximal number of 
evaluations ({0}) exceeded") instead?


> "RegulaFalsiSolver" failure
> ---------------------------
>
>                 Key: MATH-631
>                 URL: https://issues.apache.org/jira/browse/MATH-631
>             Project: Commons Math
>          Issue Type: Bug
>            Reporter: Gilles
>             Fix For: 3.0
>
>
> The following unit test:
> {code}
> @Test
> public void testBug() {
>     final UnivariateRealFunction f = new UnivariateRealFunction() {
>             @Override
>             public double value(double x) {
>                 return Math.exp(x) - Math.pow(Math.PI, 3.0);
>             }
>         };
>     UnivariateRealSolver solver = new RegulaFalsiSolver();
>     double root = solver.solve(100, f, 1, 10);
> }
> {code}
> fails with
> {noformat}
> illegal state: maximal count (100) exceeded: evaluations
> {noformat}
> Using "PegasusSolver", the answer is found after 17 evaluations.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to