# How to pick out the largest root of an equation?

I tried the following but it didn't work,

p = x^2 - 7ax + 5; a=5; m = max((p == 0).solve([x]))

edit retag close merge delete

Sort by » oldest newest most voted

First, here is a classical way to get solutions of you equation:

sage: a = 5
sage: p = x^2 - 7*a*x + 5
sage: p.solve(x)
[x == -1/2*sqrt(1205) + 35/2, x == 1/2*sqrt(1205) + 35/2]


So, you have a list of solutions. Each solution is of the form x == -1/2*sqrt(1205) + 35/2 which is a symbolic expression. You can get the right hand side of such an equality with the rhs() method:

sage: [s.rhs() for s in p.solve(x)]
[-1/2*sqrt(1205) + 35/2, 1/2*sqrt(1205) + 35/2]


Then, you can take the maximal element of this list:

sage: max([s.rhs() for s in p.solve(x)])
1/2*sqrt(1205) + 35/2


Alternatively, instead of getting solutions as symbolic expressions, you can get them as Python dictionaries:

sage: p.solve(x, solution_dict=True)
[{x: -1/2*sqrt(1205) + 35/2}, {x: 1/2*sqrt(1205) + 35/2}]


So, you can get each solution by looking at the x values:

sage: [s[x] for s in p.solve(x, solution_dict=True)]
[-1/2*sqrt(1205) + 35/2, 1/2*sqrt(1205) + 35/2]


Then, as before, you can take the maximal element of this list:

sage: max([s[x] for s in p.solve(x, solution_dict=True)])
1/2*sqrt(1205) + 35/2

more

If some of the roots turned out to be complex then would "max" throw up some kind of an error message which as an user I can catch ?

No, since Sage gives an ordering between complex numbers, you will get the maximum for this ordering:

sage: max([1+I, 2*I])
I + 1


A possibility is to assume that x is real:

sage: p = x^2 + 1
sage: p.solve(x)
[x == -I, x == I]
sage: assume(x, 'real')
sage: p.solve(x)
[]


Use subs (wrong solution):

sage: p = x^2 - 7*a*x + 5; p.subs(a=5)
x^2 - 35*x + 5
sage: max(p.solve([x]))
x == -1/2*sqrt(1205) + 35/2

more

The problem with your approach is that you take the maximum of symbolic expressions, which are equalities (not values of solutions), so the ordering of those is not very clear.