## 12755 Reputation

8 years, 298 days

## Bug in solve/ineqs...

Maple
 > restart;
 > torus:= (x^2+y^2+z^2 + R^2-r^2)^2 - 4*R^2*(x^2+y^2):
 > torus1:=eval(torus,[r=1,R=4]);
 (1)
 > plots:-implicitplot3d(torus1=0, x=-6..6,y=-6..6,z=-6..6, numpoints=5000, scaling=constrained, view=-2..2);
 > sol1:=solve(torus1<0, [x,y,z]); # It should be easy for Maple
 (2)
 > eval(torus1, [x=3,y=2,z=0]); # in the interior
 (3)
 > eval(sol1, [x=3,y=2,z=0]);   # ???
 (4)
 >

## Bugs for irrationals in inequal and solv...

Maple

 > restart;
 > plots:-inequal([x^2+y^2<100, x+y>Pi]);      # ?,  evalf(Pi) ok
 > plots:-inequal([x^2+y^2<100, x+y>sqrt(3)]); # ?
 > solve({x^2+y^2<100, x+y>Pi});               # ?
 > solve({x^2+y^2<100, x+y>sqrt(10)});         # ?
 > solve({x^2+y^2<100, x+y>4}, [x,y]);         # OK
 (1)
 > solve({x^2+y^2<100, x+y>a}, [x,y]) assuming 3
 (2)
 > solve({x^2+y^2<100, x+y>a}, [x,y], parametric) assuming 3
 (3)

Maple

This post is motivated by a recent answer where I needed a necessary and sufficient condition for three straight lines in space be concurrent. I had to use determinants because the eliminate command did not provide the correct answer.
Investigating the cause, I saw that eliminate uses an heuristic algorithm, instead of using Groebner bases (when possible).

Here is an example.

We want to eliminate the unknowns x an y in the system

a*x + y = 0,  b*x+y+1 = 0, c*x+2*y = 0

 > sys:=[a*x + y, b*x + y + 1, c*x + 2*y];
 (1)
 > eliminate(sys, [x,y]);
 (2)

So, apparently, the elimination is not possible, i.e. for each triple (a,b,c), the system in x and y is incompatible.
This is not true. For example,

 > eval(sys,[a=1,b=3,c=2]);
 (3)
 > eval(%, [x=-1/2, y=1/2]);
 (4)

eliminate  obtained its result this way (just like a superficial human):

 > solve(sys[[1,3]], [x,y]); eval(sys[2],%[]); # The result obtained by eliminate
 (5)

Now, the correct result (also by hand):

 > solve(sys[[1,2]], {x,y}); eval(sys[3],%); numer(simplify(%));
 (6)

So, for c = 2*a  (and a <> b)  the system in x,y  is compatible.

This result can be obtained with Groebner bases.

 > Groebner:-Basis(sys, plex(x,y,a,b,c));
 (7)
 > remove(has, %, {x,y});
 (8)

Note that it is more efficient to use lexdeg([x,y], [a,b,c])  instead of plex(x,y,a,b,c).

 > Groebner:-Basis(sys, lexdeg([x,y], [a,b,c]));
 (9)

The conclusion is that eliminate should use internally Groebner:-Basis for polynomial systems.
Until then, we can use it ourselves!

## Multibyte characters...

Maple strings contain extended ASCII characters (codes 1..255).
The international characters such as  î, ș, Å, Ø ,Ă, Æ, Ç are multi-byte encoded. They are ignored by the Maple engine but are known to the user interface which uses the UTF-8 encoding.
The package StringTools does not support this encoding. However it is not difficult to manage these characters using Python commands (included in the Maple distribution now).
Here are the UTF-8 versions of the Maple procedures length and substring.
You may want to improve these procedures, or to add new ones (my knowledge of Python is very limited).

```LEN:=proc(s::string) Python:-EvalFunction("len",s) end proc:

SS:=proc(s::string, mn::{integer, range(({integer,identical()}))})
local m,n;
if type(mn,integer) then m,n := mn\$2 else m:=lhs(mn); n:=rhs(mn) fi;
if m=NULL then m:=1 fi; if n=NULL then n:=-1 fi;
if n=-1 then n:=LEN(s) elif n<0 then n:=n+1 fi;
if m=-1 then m:=LEN(s) elif m<0 then m:=m+1 fi;
Python:-EvalString(cat("\"",  s, "\"", "[", m-1, ":", n, "]"  ));
end proc:
```

6, 6

s:="România":
LEN(s), length(s);
7, 8

SS(s, 1..), SS(s, 1..-3), SS(s, 1..1), SS(s, -7..2), SS(s,1), SS(s,-1);
"România", "Român", "R", "Ro", "R", "a"

## Old bug in `diff/abs`...

Maple

diff(abs(z), z)  returns abs(1, z)  and the latter, for a numeric z, is defined only for a nonzero real z.
However,  functions such as abs(I+sin(t)) are (real) differentiable for a real t and diff should work. It usually does, but not always.

```restart
f:= t -> abs(GAMMA(2*t+I)):  # We want D(f)(1)
D(f)(1):
evalf(%);  # Error, (in simpl/abs) abs is not differentiable at non-real arguments
D(f)(1); simplify(%);
evalf(%);   # 0.3808979508 + 1.161104935*I,  wrong
```

The same wrong results are obtained with diff instead of D

```diff(f(t),t):   # or  diff(f(t),t) assuming t::real;
eval(%,t=1);
simplify(%); evalf(%);   # wrong, should be real
```

To obtain the correct result, we could use the definition of the derivative:

```limit((f(t)-f(1))/(t-1), t=1); evalf(%); # OK
fdiff(f(t), t=1);    # numeric, OK
```

0.8772316598
0.8772316599

Note that abs(1, GAMMA(2 + I)); returns 1; this is also wrong, it should produce an error because  GAMMA(2+I) is not real;

Let's redefine now `diff/abs`  and redo the computations.

```restart
`diff/abs` := proc(u, z)   # implements d/dx |f(x+i*y|) when f is analytic and f(...)<>0
local u1:=diff(u,z);
1/abs(u)*( Re(u)*Re(u1) + Im(u)*Im(u1) )
end:
f:= t -> abs(GAMMA(2*t+I));
D(f)(1); evalf(%);   # OK now
```

0.8772316597

Now diff works too.

```diff(f(t),t);
eval(%,t=1);
simplify(%); evalf(%);   # it works
```

This is a probably a very old bug which may make diff(u,x)  fail for expressions having subespressions abs(...) depending on x.

However it works  using assuming x::real, but only if evalc simplifies u.
The problem is actually more serious because diff/ for Re, Im, conjugate should be revized too. Plus some other related things.

 1 2 3 4 5 6 7 Page 1 of 7
﻿