#### 7.82 bug in integration 2 in Maple V.4 and Maple V.5 (18.11.98)

##### 7.82.1 Robert Michael Sinclair (PHj)

There is a bug in the deﬁnite integration algorithm which only appears when the limits of integration are ﬂoating point numbers. Expressions of the form "limit/X" appear uninvited in the result. I had thought that this problem had been ﬁxed in the transition from V4 to V5, but it is still around. In the ﬁrst example below, the limits of integration are rational numbers, so the problem does not appear. In the second, the same limits have been written as ﬂoating point numbers, and the result is suddenly useless.

    |\^/|     Maple V Release 5 (WMI Campus Wide License)
._|\|   |/|_. Copyright (c) 1981-1997 by Waterloo Maple Inc. All rights
\  MAPLE  /  reserved. Maple and Maple V are registered trademarks of
<____ ____>  Waterloo Maple Inc.
|       Type ? for help.

> int( x/sin(1-x^2), x=1/10..9/10 );

19       19                 19
- 1/2 ln(1 - cot(---) sin(---)) + 1/2 ln(sin(---))
100      100                100

99       99                 99
+ 1/2 ln(1 - cot(---) sin(---)) - 1/2 ln(sin(---))
100      100                100

> int( x/sin(1-x^2), x=0.1..0.9 );
2
.8671793960 + 1.570796327 I signum(csc(-.19 - 1.8 limit/X + 1. limit/X )

2
- 1. cot(-.19 - 1.8 limit/X + 1. limit/X )) - 1.570796327 I signum(

2                                      2
csc(-.99 + .2 limit/X + limit/X ) - 1. cot(-.99 + .2 limit/X + limit/X ))



It is corrected with Maple 6. (U. Klein)

##### 7.82.2 David L. Johnson (19.11.98)

Yech. It does clear up, however, if you add abs() around the argument of sin():

> int( x/sin(abs(1-x^2)), x=0.1..0.9 );

.8671793961



which agrees with the rational version.

##### 7.82.3 Helmut Kahovec (21.11.98)

This bug occurs in Release 4 and Release 5 because in your example

- int calculates the antiderivative of the integrand and then calls int/DefInt.

- int/Deﬁnt calls limit to calculate the value of the antiderivative at the limits of integration.

- limit substitutes L-limit/X for the indeterminate in the antiderivative. L is either limit of integration.

- limit does a series expansion of the antiderivative w.r.t. limit/X and calls series/leadterm since L is a ﬂoat and there isn’t any ﬂoat in the antiderivative.

- series/leadterm does not work correctly if the series expansion of the antiderivative doesn’t have an explicit leading term. It always takes the ﬁrst term of the series expansion.

Thus the real bug is in series/leadterm. Look at the following:

> restart;
> j:=x/sin(1-x^2);

x
j := - ------------
2
sin(-1 + x )

> Int(j,x): %=value(%);

/
|         x                               2              2
|  - ------------ dx = - 1/2 ln(csc(-1 + x ) - cot(-1 + x ))
|              2
/     sin(-1 + x )

> J:=rhs(%);

2              2
J := - 1/2 ln(csc(-1 + x ) - cot(-1 + x ))

> limit(J,x=0.1,right);

.3082524570 - 1.570796327 I csgn(I (

2
-csc(-.99 + .2 limit/X + limit/X )

2
+ 1. cot(-.99 + .2 limit/X + limit/X )))

> limit(J,x=0.9,left);

1.175431853 + 1.570796327 I csgn(I (

2
csc(-.19 - 1.8 limit/X + 1. limit/X )

2
- 1. cot(-.19 - 1.8 limit/X + 1. limit/X )))



Compare with the following:

> limit(J,x=1/10,right);

99       99                 99
- 1/2 ln(1 - cot(---) sin(---)) + 1/2 ln(sin(---)) - 1/2 I Pi
100      100                100

> limit(J,x=9/10,left);

19       19                 19
- 1/2 ln(1 - cot(---) sin(---)) + 1/2 ln(sin(---)) - 1/2 I Pi
100      100                100



Actually, the order of the series expansion is 6. We use 4 to save space:

> series(J,x,4);

/           1
|- 1/2 ln(------ - cot(1))
\         sin(1)

2              2      \
+ 1/2 I csgn(I (csc(-1 + x ) - cot(-1 + x ))) Pi| -
/

cos(1)              2
------- - 1 - cot(1)
2
sin(1)                 2      4
1/2 --------------------- x  + O(x )
1
------ - cot(1)
sin(1)

/           1
|- 1/2 ln(------ - cot(1))
\         sin(1)

2              2      \
- 1/2 I csgn(I (-csc(-1 + x ) + cot(-1 + x ))) Pi|
/



Note that if L is a ﬂoat, then series/leadterm seems to be called if there also is a ﬂoat in the integrand. But if you manually introduce a ﬂoat in the antiderivative then series/leadterm isn’t called by limit and the antiderivative is calculated correctly at the limits of integration:

> subs(-1+x^2=-1.+x^2,J);

2               2
- 1/2 ln(csc(-1. + x ) - cot(-1. + x ))

> limit(%,x=0.1,right);

.3082524570 - 1.570796327 I

> limit(%%,x=0.9,left);

1.175431854 - 1.570796327 I



Now we may easily construct another example of this bug:

> -ln(sin(-1+x^2));

2
-ln(sin(-1 + x ))

> series(%,x,6);

2         cos(1)  2
(-ln(sin(1)) + I csgn(I sin(-1 + x )) Pi) + ------ x  +
sin(1)

/                2\
|          cos(1) |  4      6
|1/2 + 1/2 -------| x  + O(x )
|                2|
\          sin(1) /

2
(-ln(sin(1)) + I csgn(I sin(-1 + x )) Pi)

> diff(%%%,x);

2
cos(-1 + x ) x
-2 --------------
2
sin(-1 + x )

> int(%,x);

2
-ln(sin(-1 + x ))

> int(%%,x=0.1..0.9);

1.487659539

2
+ 3.141592654 I csgn(I sin(-.19 - 1.8 limit/X + 1. limit/X ))

2
- 1. I csgn(I sin(-.99 + .2 limit/X + limit/X )) Pi

> int(%%%,x=1/10..9/10);

19             99
-ln(sin(---)) + ln(sin(---))
100            100