# commons-dev mailing list archives

##### Site index · List index
Message view
Top
From Luc Maisonobe <Luc.Maison...@free.fr>
Subject Re: [math] NewtonRaphsonSolver
Date Mon, 03 Jun 2013 12:38:06 GMT
```Le 03/06/2013 13:13, Thomas Neidhart a écrit :
> Any feedback on this?
>
> I am really curious if there is a misunderstanding from my side or if there
> is a bug.
>
> Thomas
>
>
> On Tue, May 21, 2013 at 5:01 PM, Thomas Neidhart
> <thomas.neidhart@gmail.com>wrote:
>
>> Hi,
>>
>> based on the question on the user-ml, I did an experiment with the
>> NewtonRaphson solver, and I get some strange results, see below:
>>
>>     @Test
>>     public void testSquare() {
>>
>>         final UnivariateDifferentiableFunction d = new
>> UnivariateDifferentiableFunction() {
>>
>>             public double value(double x) {
>>                 return x*x;
>>             }
>>
>>             public DerivativeStructure value(DerivativeStructure t)
>>                 throws DimensionMismatchException {
>>                 return t.multiply(t);
>>             }
>>         };
>>
>>         NewtonRaphsonSolver solver = new NewtonRaphsonSolver();
>>         UnivariateDifferentiableFunction sin = new Sin();
>>         double result = solver.solve(1000, sin, -4, 1);
>>         System.out.println(result + " " + sin.value(result)); // prints
>> 12.566370614359172 -4.898587196589413E-16
>>                                                               // but there
>> should be a root at -PI and 0

This one is normal, it is a classical problem with Newton-Raphson.
The algortihm starts computing f(x0) for x0 at the center of the search
interval, i.e. at x0 = -1.5 :
f (-1.5) = -0.9974949866040544
f'(-1.5) =  0.0707372016677029

Sonce f' is close to 0, the next point is way out of the search
interval: x1 = 12.60141994717172. From this point, it converges to a
close root which is 4 PI.

The algorithm has no real notion of search interval or bracketing, it is
a one point algorithm that wanders around following the tangent.

>>
>>         result = solver.solve(1000, d, -4, 1);
>>         System.out.println(result + " " + d.value(result));   // prints
>> -7.152557373046875E-7 5.115907697472721E-13
>>
>>         result = solver.solve(1000, d, -1, 1);
>>         System.out.println(result + " " + d.value(result));   //
>> TooManyEvaluationsException
>>     }

For x^2, the first point is x0 = 0 which is the root but unfortunately
also a root of the derivative (f(0) = f'(0) = 0), so there is a division
by zero and hence NaN appears.

>>
>> For the case of sin, I expected to get either -PI or 0 as root.
>> For x^2, the result depends also on the bounds. Is there something wrong
>> with my test, or is the solver broken?

No, the algorithm itself is not robust.

Luc

>>
>> Thomas
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org