limitations of "solve"?

250 views
Skip to first unread message

Fernando Q. Gouvea

unread,
Nov 28, 2023, 10:36:30 AM11/28/23
to sage-s...@googlegroups.com
Yesterday I was demonstrating to my calculus class Sage's ability to
implement the method of Lagrange multipliers. I used a standard example,
putting the following code into SageMath Cell:

var('x,y,l')
f(x,y)=10*x^(1/3)*y^(2/3)
g(x,y)=5*x-6*y
fx=diff(f,x)
fy=diff(f,y)
gx=diff(g,x)
gy=diff(g,y)
solve((fx(x,y)==l*gx(x,y),fy(x,y)==l*gy(x,y),g(x,y)==120),(x,y,l))

That works beautifully. Then I decided to show off Sage's powers by
making a little change:

var('x,y,l')
f(x,y)=10*x^(1/3)*y^(2/3)
g(x,y)=5*x^2+6*y
fx=diff(f,x)
fy=diff(f,y)
gx=diff(g,x)
gy=diff(g,y)
solve((fx(x,y)==l*gx(x,y),fy(x,y)==l*gy(x,y),g(x,y)==120),(x,y,l))

SageCell now gives me a spinning symbol ("I'm working") for a while,
then seems to exit without any result. On my local installation (Sage
9.2 on Windows) it returns an empty list, [].

What is curious is that the constraint equation 5x^2 + 6y=120 is easily
solved for y...

Questions:

1) Shouldn't SageCell output an empty list here?

2) Is this a known limitation of "solve"?

Fernando

PS: It seems that if I add "algorithm='sympy'" then solutions are found.

--
==================================================================
Fernando Q. Gouvea
Carter Professor of Mathematics
Colby College
Mayflower Hill 5836
Waterville, ME 04901
fqgo...@colby.edu http://www.colby.edu/~fqgouvea



Eric Gourgoulhon

unread,
Nov 28, 2023, 10:45:33 AM11/28/23
to sage-support
Hi,

I've also noticed two days ago that https://sagecell.sagemath.org/ is very slow (actually does not terminate) even on elementary operations.
Maybe there is a problem with the server at the moment...

Eric.

Fernando Q. Gouvea

unread,
Nov 28, 2023, 10:50:45 AM11/28/23
to sage-s...@googlegroups.com
Answering part of my question: it seems that sympy and maxima have
different attitudes towards fractional powers of negative numbers, which
may be the source of the problem.

If I change to g(x,y)=x^2+6*y then "solve" has no problem finding
x=2*sqrt(6), y=16.

Fernando
Let the majority eavesdrop if they like, but their tastes should be
firmly ignored.
-- Dwight Macdonald, in "Masscult & Midcult"

Dima Pasechnik

unread,
Nov 28, 2023, 10:52:09 AM11/28/23
to sage-s...@googlegroups.com
one should not be using sagecell.sagemath.org server for teaching, it's not scaling well (compared to cocalc.com, say) under load.

unleashing undergraduates to compute on it surely gets things very slow there

kcrisman

unread,
Nov 28, 2023, 12:25:04 PM11/28/23
to sage-support

Answering part of my question: it seems that sympy and maxima have
different attitudes towards fractional powers of negative numbers, which
may be the source of the problem.


Yes.  Maxima's attitude is that the square root of negative one is an expression which might have multiple values, rather than just picking one you hope might be consistent over branch points.   (There are very long discussions on this list about this from years ago, which I will spare you by not linking to any of them.)  I would not be surprised if that came up here.

Oscar Benjamin

unread,
Nov 28, 2023, 1:12:41 PM11/28/23
to sage-s...@googlegroups.com
I wouldn't mind seeing those discussions if you have a link to send
(perhaps only to me).

--
Oscar

Eric Gourgoulhon

unread,
Nov 29, 2023, 7:40:47 AM11/29/23
to sage-support
Hi,

Le mardi 28 novembre 2023 à 18:25:04 UTC+1, kcrisman a écrit :
Yes.  Maxima's attitude is that the square root of negative one is an expression which might have multiple values, rather than just picking one you hope might be consistent over branch points.  

To enforce Maxima to work in the real domain, avoiding to play too much with complex square roots, one can add at the beginning of the Sage session:

maxima_calculus.eval("domain: real;")

Then the second example in the initial message of this thread yields

[[x == 2/5*sqrt(6)*sqrt(5), y == 16, l == 1/9*18750^(1/6)], [x == -2/5*sqrt(6)*sqrt(5), y == 16, l == -1/9*18750^(1/6)]]

instead of an empty list.

Eric.

kcrisman

unread,
Nov 29, 2023, 12:52:13 PM11/29/23
to sage-support
I wouldn't mind seeing those discussions if you have a link to send
(perhaps only to me).


A relatively recent one (mentioning Eric's workaround) is https://groups.google.com/g/sage-devel/c/h50LZVLVQI4/m/AieyOKHVAQAJ  

(Note that there were at times separate problems with the "abs_integrate" and "to_poly_solve" Maxima packages, though these sometimes overlapped.  And sometimes we may have used them not as intended.)

Oscar Benjamin

unread,
Dec 3, 2023, 7:31:10 AM12/3/23
to sage-s...@googlegroups.com
When using Maxima (5.45.1) directly I get this result with default settings:

(%i1) f: 10*x^(1/3)*y^(2/3)$

(%i2) g: 5*x^2 + 6*y$

(%i3) solve([diff(f,x)=l*diff(g,x), diff(f,y)=l*diff(g,y), g=120], [x,y,l]);
1/6
2 sqrt(6) 18750
(%o3) [[x = ---------, y = 16, l = --------],
sqrt(5) 9
1/6
2 sqrt(6) 18750
[x = - ---------, y = 16, l = - --------]]
sqrt(5) 9

Does Sage modify some Maxima settings related to this or does it call
something other than solve?

--
Oscar

Dima Pasechnik

unread,
Dec 3, 2023, 8:37:42 AM12/3/23
to sage-s...@googlegroups.com
Yes, Sage modifies the defaults of Maxima, in particular we set domain to complex.

Fernando Gouvea

unread,
Dec 3, 2023, 9:03:46 AM12/3/23
to sage-s...@googlegroups.com

Is there a way to change the default when calling "solve"?

Fernando

-- 
=============================================================
Fernando Q. Gouvea         http://www.colby.edu/~fqgouvea
Carter Professor of Mathematics
Dept. of Mathematics
Colby College              
5836 Mayflower Hill        
Waterville, ME 04901       

Mother Nature -- unlike Ivy League admissions committees --
doesn't like suck-ups.
  -- David Brooks, The New York Times, 4/24/2005

Oscar Benjamin

unread,
Dec 3, 2023, 9:26:20 AM12/3/23
to sage-s...@googlegroups.com
Oh, I see:

(%i23) domain: complex
;
(%o23) complex
(%i24) f: 10*x^(1/3)*y^(2/3)$

(%i25) g: 5*x^2 + 6*y$

(%i26) solve([diff(f,x)=l*diff(g,x), diff(f,y)=l*diff(g,y), g=120], [x,y,l]);
(%o26) []

On Sun, 3 Dec 2023 at 14:20, Oscar Benjamin <oscar.j....@gmail.com> wrote:
>
> What does "set domain to complex" mean in terms of Maxima's settings?
>
> Maxima's solve seems to compute complex solutions by default:
>
> (%i21) solve(x^2 + 1);
> (%o21) [x = - %i, x = %i]
> > --
> > You received this message because you are subscribed to the Google Groups "sage-support" group.
> > To unsubscribe from this group and stop receiving emails from it, send an email to sage-support...@googlegroups.com.
> > To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/6F4839F2-38B6-40F2-B080-EFCC1C0C3B65%40gmail.com.

Oscar Benjamin

unread,
Dec 3, 2023, 9:26:20 AM12/3/23
to sage-s...@googlegroups.com
What does "set domain to complex" mean in terms of Maxima's settings?

Maxima's solve seems to compute complex solutions by default:

(%i21) solve(x^2 + 1);
(%o21) [x = - %i, x = %i]

On Sun, 3 Dec 2023 at 13:37, Dima Pasechnik <dim...@gmail.com> wrote:
>

Nils Bruin

unread,
Jan 1, 2024, 4:54:58 PMJan 1
to sage-support
The documented effect is usually of most impact:


there may be other undocumented effects, but the one above tends to explain a lot already.

Oscar Benjamin

unread,
Jan 1, 2024, 5:15:48 PMJan 1
to sage-s...@googlegroups.com
I did go on to discuss this on the Maxima mailing list:
https://sourceforge.net/p/maxima/mailman/maxima-discuss/thread/CADB8Zm56axVDFXRLbJnxm7xnnbQiixBzg4VX1T91ucj%2B-tuGvA%40mail.gmail.com/#msg58347791

Apparently domain:complex as used by Sage is not a very well tested
configuration of Maxima.

There are most likely other effects besides the documented one about
sqrt(x^2) not simplifying to abs(x):

$ git grep domain src/simp.lisp
src/simp.lisp:(defmvar $limitdomain '$complex)
src/simp.lisp: (cond ((or (and $logexpand (eq $domain '$real))
src/simp.lisp: (cond ((or $numer_pbranch (eq $domain '$complex))
src/simp.lisp: (or (and (eq $domain '$real) (not
(apparently-complex-to-judge-by-$csign-p (cadr gr))))
src/simp.lisp: (and (eq $domain '$complex)
(apparently-real-to-judge-by-$csign-p (cadr gr)))))
src/simp.lisp: (or (and (eq $domain '$real) (not
(apparently-complex-to-judge-by-$csign-p (cadr gr))))
src/simp.lisp: (and (eq $domain '$complex)
(apparently-real-to-judge-by-$csign-p (cadr gr)))))
src/simp.lisp: (and (eq $domain '$real) $radexpand))
src/simp.lisp: ((or (eq $domain '$complex) (not $radexpand)) (go up)))
src/simp.lisp: (and (eq $domain '$complex)
src/simp.lisp: (and (eq $domain '$real)
src/simp.lisp: (eq $domain '$real))
src/simp.lisp: (eq $domain '$real)
src/simp.lisp: ((and (eq $domain '$real)
src/simp.lisp: (eq $domain '$real)
src/simp.lisp: (and (eq $domain '$real) (ratnump e) (oddp (caddr e)))))
src/simp.lisp: ((eq $domain '$real)

--
Oscar
> To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/454c0dbc-ead3-45c4-9557-fdb2391a9ce9n%40googlegroups.com.

Emmanuel Charpentier

unread,
Jan 2, 2024, 6:30:14 AMJan 2
to sage-support

FWIW, a working workaround this interesting Maxima quirk (bug ?) is to use sympy, as demonstrated here.

HTH,

Le mardi 28 novembre 2023 à 16:36:30 UTC+1, Fernando Q. Gouvea a écrit :
Message has been deleted

Emmanuel Charpentier

unread,
Jan 4, 2024, 4:45:59 AMJan 4
to sage-support

These systems and Sage’s “solutions” exhibit some serious problems. See there

Reply all
Reply to author
Forward
0 new messages