In the following example limit() fails when x is numeric. Same results with MapleV 5 and Maple 6 on Win98. If x is a variable the results are ok.
> f:= x-> sin(2*Pi*x+Pi/2); f := x -> sin(2 Pi x + 1/2 Pi) > limit( (f(41/100+h)-f(41/100))/h,h=0); 0
(-cos(9/50 Pi) + sin(8/25 Pi)) 1/h, but (-cos(9/50 Pi) + sin(8/25 Pi)=0, which
fools taylor.
> series( (f(41/100+h)- f(41/100) )/h,h=0); -1 2 (-cos(9/50 Pi) + sin(8/25 Pi)) h - 2 sin(9/50 Pi) Pi + 2 cos(9/50 Pi) Pi h 3 2 4 3 + 4/3 sin(9/50 Pi) Pi h - 2/3 cos(9/50 Pi) Pi h - 5 4 5 4/15 sin(9/50 Pi) Pi h + O(h ) > taylor((f(41/100+h)-f(41/100))/h,h=0); Error, does not have a taylor expansion, try series() > series((f(x+h)-f(x))/h,h=0); 2 3 2 - 2 sin(2 Pi x) Pi - 2 cos(2 Pi x) Pi h + 4/3 sin(2 Pi x) Pi h + 4 3 5 4 5 2/3 cos(2 Pi x) Pi h - 4/15 sin(2 Pi x) Pi h + O(h ) > limit((f(x+h)-f(x))/h,h=0); -4 Pi sin(Pi x) cos(Pi x)
Well, I think you provided the clue yourself: "limit" looks at what it thinks is the leading
term of a series expansion. It’s not so obvious why, if Maple thinks there’s a 1/h term in
the series, it comes up with 0 rather than +infinity or -infinity or undefined: I think
that’s because it looks at the signum of the coefficient of the leading term in order to
decide which of these to return, and "signum" is clever enough to know that
-cos(9/50 Pi) + sin(8/25 Pi)=0.
The way that series tests whether something is zero is specified in the environment
variable Testzero, which is usually set to just use "normal". In this case it will work better
if you use "is" instead:
> restart; Testzero:= proc(x) is(x,0) end; f := x -> sin(2*Pi*x + Pi/2); limit( (f(41/100+h)-f(41/100))/h,h=0); -2 sin(9/50 Pi) Pi
That is an interesting bug. As I found out by using the Maple debugger, this bug seems to be unavoidable if the procedure limit() and the procedures called by it cannot determine whether a trig expression is zero or not. Look at the following short Maple session:
> restart; > expr:=x+(-cos(9/50*Pi)+sin(8/25*Pi))/h; -cos(9/50 Pi) + sin(8/25 Pi) expr := x + ---------------------------- h > limit(expr,h=0); 0
-cos(9/50 Pi) + sin(8/25 Pi) equals zero. However, testeq() can:
Thus, as a first bugfix, limit() and the procedures called by it should make use of testeq(),
too.