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 userml, 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.898587196589413E16
>> // but there
>> should be a root at PI and 0
This one is normal, it is a classical problem with NewtonRaphson.
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.152557373046875E7 5.115907697472721E13
>>
>> 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, email: devunsubscribe@commons.apache.org
For additional commands, email: devhelp@commons.apache.org
