Karim Belabas on Sat, 27 Feb 2010 01:35:24 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Strange behaviour of intnum


* Bill Allombert [2010-02-26 19:37]:
> On Fri, Feb 26, 2010 at 10:30:05AM +0100, Olivier Ramare wrote:
> > Hello,
> >
> >  (1)----------------------------------------------------------------------
> >
> > Can anyone tell me what wrong with
> >
> > intnum(t = [0,0], [1], (sin(t)/t)^2)
> 
> Your function is oscillating at oo: the documentation says:
[...]
> so here you must replace sin(x)^2 by (1-cos(2*x))/2 and sum:
> You get:
> 
> ? intnum(t = 0, 1,if(t,(1-cos(2*t))/2/t^2,1))+intnum(t = 1, [[1],2*I],-cos(2*t)/2/t^2)+intnum(t=1,[1],1/2/t^2)
> %1 = 1.5707963267948966192313216916397514421

Hum, on the other hand :

(01:18) gp > \p100
  realprecision = 105 significant digits (100 digits displayed)
(01:18) gp >  intnum(t = 0, [1], (sin(t)/t)^2)
%1 = 1.571166537031496604360105950346597224302063277903999870302529278008130571434265738562554253368755171

which is (almost) entirely wrong, but in an «expected» way (same answer
at various other accuracies). The error you get simply comes from

(01:21) gp > \p28
   realprecision = 28 significant digits
(01:21) gp > sin(1e38)
  ***   at top-level: sin(1e38)
  ***                 ^---------
  *** sin: precision too low in mpsc1.

We try to reduce the argument mod 2*Pi, but since it allows an absolute
error of about 10^10, we do not go very far...

> > intnum(t = [0,0], 1000, 9*((sin(t)-t*cos(t))/t^3)^2)
> 
> ? intnum(t = 0, 1, 9*((sin(t)-t*cos(t))/t^3)^2)
> %1 = 0.E143
> 
> This one is a bug, I do not see any reason why it fails.

A simpler variant

(01:25) gp > intnum(t = 0, 1, (sin(t)-t*cos(t))/t^3)
%1 = 0.E32

This comes from the apparent singularity at 0 :

(01:27) gp > f(t) = (sin(t)-t*cos(t))/t^3;
(01:27) gp > f(1e-40)
%3 = 0.E52  \\ function evaluated with an enormous loss of accuracy

??intnum suggests replacing the integrand by truncated expansion in this case.

(01:30) gp > F = truncate(f(t) + O(t^7))
%4 = -1/45360*t^6 + 1/840*t^4 - 1/30*t^2 + 1/3

(01:30) gp > intnum(t = 0, 1, if (t < 1e-18, eval(F), f(t)))
%5 = 0.3224571957137131128479832569

Cheers,

    K.B.
--
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1          Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation    http://www.math.u-bordeaux.fr/~belabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux.fr/  [PARI/GP]
`