[ 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