In [1]:
from sympy import *
from sympy.solvers.solveset import solveset
init_printing()
x, y, z = symbols('x,y,z')
In [2]:
solveset(x**2 - 4, x)
Out[2]:
Solveset takes two arguments and one optional argument specifying the domain, an equation like $x^2 - 4$ and a variable on which we want to solve, like $x$ and an optional argument domain specifying the region in which we want to solve.
Solveset returns the values of the variable, $x$, for which the equation, $x^2 - 4$ equals 0.
In [3]:
solveset(x**2 - 9 == 0, x)
Out[3]:
In [12]:
solveset(sin(x), x)
Out[12]:
In [14]:
solveset(exp(x) -1, x)
Out[14]:
solveset
by default solves everything in the complex domain. In complex domain $exp(x) == cos(x) + i\ sin(x)$ and solution is basically equal to solution to $cos(x) == 1$. If you want only real solution, you can specify the domain as S.Reals
.
In [15]:
solveset(exp(x) -1, x, domain=S.Reals)
Out[15]:
solveset
Results of solveset
don't need to be numeric, like {-2, 2}
. We can use solveset to perform algebraic manipulations. For example if we know a simple equation for the area of a square
area = height * width
we can solve this equation for any of the variables. For example how would we solve this system for the height
, given the area
and width
?
In [4]:
height, width, area = symbols('height, width, area')
solveset(area - height*width, height)
Out[4]:
Note that we would have liked to have written
solveset(area == height * width, height)
But the ==
gotcha bites us. Instead we remember that solveset
expects an expression that is equal to zero, so we rewrite the equation
area = height * width
into the equation
0 = height * width - area
and that is what we give to solveset.
In [5]:
# Solve for the radius of a sphere, given the volume
You will probably get several solutions, this is fine. The first one is probably the one that you want.
In [5]:
x**2
Out[5]:
In [6]:
# Replace x with y
(x**2).subs({x: y})
Out[6]:
In [8]:
# Replace x with sin(x)
In [8]:
# Solve for the height of a rectangle given area and width
soln = list(solveset(area - height*width, height))[0]
soln
Out[8]:
In [10]:
# Define perimeter of rectangle in terms of height and width
perimeter = 2*(height + width)
In [11]:
# Substitute the solution for height into the expression for perimeter
perimeter.subs({height: soln})
Out[11]:
In [12]:
V, r = symbols('V,r', real=True)
4*pi/3 * r**3
Out[12]:
In [13]:
list(solveset(V - 4*pi/3 * r**3, r))[0]
Out[13]:
Now lets compute the surface area of a sphere in terms of the volume. Recall that the surface area of a sphere is given by
$$ 4 \pi r^2 $$
In [14]:
(?).subs(?)
Does the expression look right? How would you expect the surface area to scale with respect to the volume? What is the exponent on $V$?
In [15]:
%matplotlib inline
In [16]:
plot(x**2)
Out[16]:
In [17]:
plot(?)
In [18]:
textplot(x**2, -3, 3)