Re: Accuracy problem in Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg49117] Re: Accuracy problem in Mathematica
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 2 Jul 2004 02:01:17 -0400 (EDT)
- Organization: The University of Western Australia
- References: <cbu21o$5ea$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <cbu21o$5ea$1 at smc.vnet.net>, "aaaa" <aaa at huji.ac.il> wrote:
> I'm having a problem with a calculation in Mathematica which I can't
> solve. I have an expression which I know to be (from analytical reasons)
> always between 0 and 1. It's a function of a and n ( n being natural and
> a rational) and it looks like this:
>
> 1/(1-a^2)^n +
>
> Sum[((2*n - k - 1)!/((n - 1)!*(n - k)!*2^(2*n - k)))*(1/(1 + a)^k - 1/(1
> - a)^k), {k, 1, n}]
>
>
>
> Let's say a=0.5.
>
> Now, when I try to calculate for small n, it's ok. When calculating for
> large n's (around 400 and above) I'm starting to get wrong results (the
> number not being between 0 and 1). The problem is that the first term
> (the first line before the sum) is VERY VERY close to the negative of
> the second term (the sum), and it's getting closer as n grows. When
> using large n's, Mathematica says they are the same number or even that
> the last term is bigger (which means the whole expression becomes
> negative) - which is wrong. It's a matter of accuracy, and I'm not sure
> how I can fix it.
One solution is to use high-precision arithmetic. For example, with
f[n_][a_] := Sum[((-k + 2 n - 1)! (1/(a + 1)^k - 1/(1 - a)^k))/
((n - 1)! (n - k)! 2^(2 n - k)), {k, 1, n}] + 1/(1 - a^2)^n
then
f[400][0.5`70.]
is between 0 and 1 and gives you a precision of just over 16.
Note that you can change the upper limit of the summation to Infinity
(because of the (n - k)! term in the denominator) and obtain an
alternative form for the sum:
g[n_][a_] = Simplify[Sum[((-k + 2 n - 1)! (1/(a + 1)^k - 1/(1 - a)^k))/
((n - 1)! (n - k)! 2^(2 n - k)), {k, 1, Infinity}] + 1/(1 - a^2)^n,
n \[Element] Integers]
However, high-precision arithmetic is still required:
g[400][0.5`70.]
The optimal solution for calculations with large n would be to determine
asymptotic expansions of the sum. For example, here is a very crude
analysis:
summand[k_] = Simplify[Normal[Series[(2n-k-1)!/
((n-1)!(n-k)! 2^(2n - k)), {n, Infinity, 2}]]]
(ignoring the warning messages),
asympt[n_][a_] = Simplify[Sum[(1/(a + 1)^k - 1/(1 - a)^k) summand[k],
{k, 1, Infinity}]]
Then compare the sum to the asymptotic expression, computed at low
precision:
g[400][0.5`70.] - asympt[400][0.5]
Cheers,
Paul
--
Paul Abbott Phone: +61 8 9380 2734
School of Physics, M013 Fax: +61 8 9380 1014
The University of Western Australia (CRICOS Provider No 00126G)
35 Stirling Highway
Crawley WA 6009 mailto:paul at physics.uwa.edu.au
AUSTRALIA http://physics.uwa.edu.au/~paul