Thanks Mikkel, Ted and Phil for your answers,
My problem is that yes, the physical consequences of such small errors are
quite big.
Because the calculated root is just the input data for a very nonlinear
equation that describes the density of energy generated by an electron in
its surroundings and changes a lot depending on alfa.
Just for curiosity I attach a drawing of this density of energy: it should
be an spiral with a "growing delta wall" ie. a kind of delta function ever
smoothly increasing in height but decreasing the width of its base.
As you can see what I'm getting is a very "hilly" spiral that instead of
increasing smoothly, goes up and down depending on the error of the alfa
root found. (also the effect of the sampling step can be seen but that is
another matter).
... and then I have to integrate this 3D function all over the XYZ space to
get the global energy... which will give me some headaches as a "delta"
spiral is not the best behaved function to integrate...
I will explore the possibility of changing variables or transforming the
function somehow to increase the differences in values surrounding the root.
By the way, what is R? some mathematical drawing package?
If I don't get anywhere, I will try using apfloat.
Thanks and Best Regards,
JBB
SpinningParticles.com
2010/8/15 Ted Dunning <ted.dunning@gmail.com>
> I think that you need to consider what your problem really is. Is this
> equation even as accurate as 10^300? What will the physical consequences
> of such small errors be?
>
> If you really think you need to solve this numerically, then I see that you
> have two choices:
>
> a) use some unbounded precision package such as
> http://www.apfloat.org/apfloat_java
>
> Keep in mind that the cost of taking powers and using trig functions is
> likely to scale *very* badly with increased precision.
>
> b) restate your problem in a scaled form so that the difference is apparent
> with normal floating point. The most common way to do this is by using
> logs
> and asymptotic formulae. This could dramatically improve your situation,
> but will require some pretty tricky manipulation of your problem.
>
> To misquote the Bard, the problem dear Brutus lies not in our numerics, but
> in your formula.
>
> On Thu, Aug 12, 2010 at 6:15 PM, Juan Barandiaran <
> barandiaran.juan@gmail.com> wrote:
>
> > Hi, I'm working in a theoretical physics problem in which I have to find
> > the
> > roots of a function for every point in x,y,z.
> > I can bracket quite precisely where every root will be found and I know
> the
> > exact solution for many points:
> > For every point (x= 1, y= n*2*PI, z= 0) the root is in n*2*PI.
> >
> > I have been using the newBrentSolver function, but to my surprise, even
> > when
> > I set the Accuracy settings to very
> > small values and the MaxIterationCount to Integer.MAX_VALUE I get an
> error
> > of 1.427E5 (too much).
> >
> > The function to be solved is alfa in
> > :
> >
> alfa+Math.sqrt(Math.pow(xMath.cos(alfa),2.0)+Math.pow(yMath.sin(alfa),2.0)+z*z);
> >
>
