Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

All published worksheets from http://sagenb.org

Views: 168692
Image: ubuntu2004

Math 480b: May 5, 2010

Basic Symbolic Calculus in Sage

William Stein

University of Washington

 

 

Creating Symbolic Expressions


The "symbolic variable" or indeterminate x is predefined when you startup Sage:

x
x
(x+2)^3
(x + 2)^3
parent(x)
Symbolic Ring
type(x)
<type 'sage.symbolic.expression.Expression'>

Use the var command to define some symbolic variables.  You can separate the variables by commas or spaces in the var command.

reset() x + y
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_8.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("cmVzZXQoKQp4ICsgeQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in <module> File "/private/var/folders/FE/FEo498bGEOeewp0B4AIIP++++TM/-Tmp-/tmpI4D4Iw/___code___.py", line 3, in <module> exec compile(u'x + y' + '\n', '', 'single') File "", line 1, in <module> NameError: name 'y' is not defined
var('y theta')
(y, theta)
(x+y+theta)^(2+pi)
(theta + x + y)^(pi + 2)
var('a,b,c') expand(a^(b+c))
a^c*a^b
show(expand((x+y+theta)^(2+pi)))
\newcommand{\Bold}[1]{\mathbf{#1}}\theta^{2} {\left(\theta + x + y\right)}^{\pi} + 2 \, \theta x {\left(\theta + x + y\right)}^{\pi} + 2 \, \theta y {\left(\theta + x + y\right)}^{\pi} + x^{2} {\left(\theta + x + y\right)}^{\pi} + 2 \, x y {\left(\theta + x + y\right)}^{\pi} + y^{2} {\left(\theta + x + y\right)}^{\pi}
f = (x+y+theta)^(2+pi); show(f)
\newcommand{\Bold}[1]{\mathbf{#1}}{\left(\theta + x + y\right)}^{\pi + 2}
show(f.simplify_full())
\newcommand{\Bold}[1]{\mathbf{#1}}{\left(2 \, {\left(\theta + x\right)} y + \theta^{2} + 2 \, \theta x + x^{2} + y^{2}\right)} {\left(\theta + x + y\right)}^{\pi}
print f._latex_()
{\left(\theta + x + y\right)}^{\pi + 2}
sin(2*y)
var('x y z epsilon')
(x, y, z, epsilon)
cos(x^3) - y^2*z + epsilon
-y^2*z + epsilon + cos(x^3)

NOTE:  If you want symbolic variables to just "magically" spring into existence when you use them, type automatic_names(True).  To turn this off, type automatic_names(False).

automatic_names(True)
expand( (fred + sam + verlkja + anything)^3 )
anything^3 + 3*anything^2*fred + 3*anything^2*sam + 3*anything^2*verlkja + 3*anything*fred^2 + 6*anything*fred*sam + 6*anything*fred*verlkja + 3*anything*sam^2 + 6*anything*sam*verlkja + 3*anything*verlkja^2 + fred^3 + 3*fred^2*sam + 3*fred^2*verlkja + 3*fred*sam^2 + 6*fred*sam*verlkja + 3*fred*verlkja^2 + sam^3 + 3*sam^2*verlkja + 3*sam*verlkja^2 + verlkja^3

Using automatic_names is usually a bad idea, since it can easily lead to subtle bugs:

theta^3 - x + y + thetta # "thetta" -- a typo!
theta^3 + thetta - x + y
automatic_names(False)
x + y + askdf
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_31.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("eCArIHkgKyBhc2tkZg=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in <module> File "/private/var/folders/FE/FEo498bGEOeewp0B4AIIP++++TM/-Tmp-/tmp1UMxGp/___code___.py", line 2, in <module> exec compile(u'x + y + askdf' + '\n', '', 'single') File "", line 1, in <module> NameError: name 'askdf' is not defined
automatic_names(True)
f = 7*12
f.prime_to_m_part(2)
21
prime_to_m_part(f, 2)
21
automatic_names(False)

Problem: Create the following expressions: sin5(x)cos2(x),x3x3+1,kP(1PK)\sin^5(x)\cos^2(x), \qquad \displaystyle \frac{x^3}{x^3 + 1}, \qquad k\cdot P \cdot \left(1 - \frac{P}{K}\right).

Tip: that you must put in an asterisk (*) for multiplication.

Tip: You can edit the HTML between cells by double clicking on it.  You can create new HTML areas by shift-clicking on the blue bar that appears just above a compute cell.

var('k K P')
(k, K, P)
k * P * (1 - P/K)
-(P/K - 1)*P*k
implicit_multiplication(True)
k P *(1 - P/K)
-(P/K - 1)*P*k
k K x sin(y)
K*k*x*sin(y)
implicit_multiplication(False)

Most standard functions are defined in Sage.  They are named lowercase, e.g.,

sin, cos, tan, sec, csc, cot, sinh, cosh, tanh, sech, csch, coth, log, exp, etc.

var('x,y') sin(x) + cos(y) - tan(x/y) + sec(x*csc(y))^5
sec(x*csc(y))^5 + sin(x) + cos(y) - tan(x/y)

Problem: Construct the symbolic expresion sin(xcos(y)+θ)+coth(2x)+log(3x)exp(y3)\sin(x^{\cos(y)} + \theta) + \coth(2x) + \log(3x)\cdot \exp(y^3)

var('x, y, theta') show(sin(x^cos(y) + theta) + coth(2*x) + log(3*x) * exp(y^3))
\newcommand{\Bold}[1]{\mathbf{#1}}e^{\left(y^{3}\right)} \log\left(3 \, x\right) + \sin\left(x^{\cos\left(y\right)} + \theta\right) + \coth\left(2 \, x\right)

Making substitutions

Use the subs method to replace any variables by other variables.

var('x,y') f = sin(x) + cos(y) - x^2 + y
f.subs(x=5)
y + sin(5) + cos(y) - 25
f.subs(x=y, y=x)
-y^2 + x + sin(y) + cos(x)
f
-x^2 + y + sin(x) + cos(y)

Problem: Replace xx by sin(y)x\sin(y)-x in the expression x3+xyx^3 + x y.

f = x^3 + x*y
f.subs(x = sin(y)-x)
-(x - sin(y))^3 - (x - sin(y))*y

Expanding Expressions

To expand a symbolic expression with exponents, use the expand method (or function) -- we saw this above:

var('x,y') f = (x+2*y)^3 f
(x + 2*y)^3
f.expand().show() # tip -- using show makes the output nicer
\newcommand{\Bold}[1]{\mathbf{#1}}x^{3} + 6 \, x^{2} y + 12 \, x y^{2} + 8 \, y^{3}
show(f)
\newcommand{\Bold}[1]{\mathbf{#1}}{\left(x + 2 \, y\right)}^{3}
latex(f)
{\left(x + 2 \, y\right)}^{3}

Problem: Expand the expression (2sin(x) cos(y))5(2\sin(x)  - \cos(y))^5.

Symbolic Unit Conversions

As of Sage-4.4, Sage has a massive symbolic unit conversion package, which was written by David Ackerman (a UW undergrad) recently, as  a funded student project after he took Math 480 (the Sage class) last year.

a = units.length.rope
a.convert(units.length.meter)
762/125*meter
a = 170*units.mass.pound
a.convert(units.mass.dalton)
4.64371586715522e28*dalton
a.convert(units.mass.drachma)
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_87.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("YS5jb252ZXJ0KHVuaXRzLm1hc3MuZHJhY2htYSk="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in <module> File "/private/var/folders/FE/FEo498bGEOeewp0B4AIIP++++TM/-Tmp-/tmpUIHhFg/___code___.py", line 2, in <module> exec compile(u'a.convert(units.mass.drachma)' + '\n', '', 'single') File "", line 1, in <module> File "expression.pyx", line 6300, in sage.symbolic.expression.Expression.convert (sage/symbolic/expression.cpp:23977) File "/Users/wstein/sage/build/sage/local/lib/python2.6/site-packages/sage/symbolic/units.py", line 1287, in convert tz[y] = base_units(y) File "/Users/wstein/sage/build/sage/local/lib/python2.6/site-packages/sage/symbolic/units.py", line 1343, in base_units base = SR.var(value_to_unit[str(v)]['1'])*sage_eval(unitdict[str(v)][str(unit)]) File "element.pyx", line 1433, in sage.structure.element.RingElement.__mul__ (sage/structure/element.c:11382) File "coerce.pyx", line 759, in sage.structure.coerce.CoercionModel_cache_maps.bin_op (sage/structure/coerce.c:6911) File "expression.pyx", line 3643, in sage.symbolic.expression.Expression.__index__ (sage/symbolic/expression.cpp:16592) File "expression.pyx", line 644, in sage.symbolic.expression.Expression._integer_ (sage/symbolic/expression.cpp:4065) TypeError: unable to convert x (=kilogram) to an integer
a = 10 * units.mass.kilogram*units.length.meter / units.time.minute^2
a
10*kilogram*meter/minute^2
a.convert(units.force.newton)
1/360*newton
units.force.newton?
a = 100 * units.si_prefixes.giga * units.information.byte; a
100*byte*giga
a.convert(units.information.bit)
800000000000*bit
var('x') d = 17 * units.length.meter / units.time.second^2 ; d
17*meter/second^2
d.convert(units.length.mile/units.time.minute^2)
53125/1397*mile/minute^2

Creating Symbolic Functions

To create a symbolic function, use the notation f(x,y) = x^3 + y.  A symbolic function is just like a symbolic expression, except you can call it without having to explicitly use subs or name variables and be sure that the order is what you want.

 

f = y + x^3
f.subs(y=2,x=3)
29
preparse('f(y,x) = x^3 + y')
'__tmp__=var("y,x"); f = symbolic_expression(x**Integer(3) + y).function(y,x)'
f(y,x) = x^3 + y f
(y, x) |--> x^3 + y
f(2,3)
29
f(pi,e)
pi + e^3
f._fast_float_
<built-in method _fast_float_ of sage.symbolic.expression.Expression object at 0x10cf6e8c0>

Problem: Create the functions xx3+1,(x,y)sin(x)cos(y)/y,(a,x,θ)ax+θ2x\mapsto x^3 + 1, \qquad (x, y) \mapsto \sin(x) - \cos(y)/y, \qquad (a,x,\theta)\mapsto a x + \theta^2.

f(x) = x^3 + 1 show(f)
\newcommand{\Bold}[1]{\mathbf{#1}}x \ {\mapsto}\ x^{3} + 1

2D Plotting

Use the plot command to plot a function of one variable.  TIP: Type plot(<tab key> to find out much more about the plot command.

var('x') plot(sin(x^2), (x,-10,3))
P = plot(sin(x^2), (x,-10,3)) P.save('image.pdf')
P.save('image.eps')
P.save('image.svg')

The plot command has many options:

plot(sin(x^2), (x,-3,3), thickness=5, color='orange', gridlines=True, frame=True)
import pylab

Here's a the same plot, but you can adjust many of the parameters to the plot command interactively.

var('x') @interact def plot_example(f=sin(x^2),r=range_slider(-5,5,step_size=1/4,default=(-3,3)), color=color_selector(widget='colorpicker'), thickness=(3,(1..10)), adaptive_recursion=(5,(0..10)), adaptive_tolerance=(0.01,(0.001,1)), plot_points=(20,(1..100)), linestyle=['-','--','-.',':'], gridlines=False, fill=False, frame=False, axes=True ): show(plot(f, (x,r[0],r[1]), color=color, thickness=thickness, adaptive_recursion=adaptive_recursion, adaptive_tolerance=adaptive_tolerance, plot_points=plot_points, linestyle=linestyle, fill=fill if fill else None), gridlines=gridlines, frame=frame, axes=axes)

Problem: Use the above interactive plotter to draw the following plot of sin(x2)\sin(x^2).

You can plot many other things, including polygons, parametric plots, polar plots, implicit plots, etc.:

line, polygon, circle, text, polar_plot, parametric_plot, circle, implicit_plot

You superimpose plots using +.

var('x') P = circle((0,0),1) + polar_plot(2 + 2*cos(x), (x, 0, 2*pi), rgbcolor='red')+ plot(sin(x^2),(x,0,4)) show(P, aspect_ratio=1)



You can also do 3D plots, including parametric lines, parametric surfaces, implicit 3d plots, etc.

var('x y') plot3d(sin(pi*(x^2+y^2))/2,(x,-1,1),(y,-1,1), opacity=.7) + octahedron(color='red')
f = sin(x).plot()
f.plot3d()

More Symbolic Calculus: Computing Integrals and Derivatives

You can symbolically integrate or differentiate functions, compute limits, Taylor polynomials, etc.

var('x') integrate(x^2, x)
1/3*x^3
integrate(sin(x)+tan(2*x),x)
1/2*log(sec(2*x)) - cos(x)
integrate(sin(x)+tan(2*x),x, algorithm='sympy')
1/4*log(tan(2*x)^2 + 1) - cos(x)
f = sin(x) - cos(y*x) + 1/(x^3+1) g = f.integrate(x) show(g)
\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{3} \, \sqrt{3} \arctan\left(\frac{1}{3} \, {\left(2 \, x - 1\right)} \sqrt{3}\right) + \frac{-\sin\left(x y\right)}{y} + \frac{1}{3} \, \log\left(x + 1\right) - \frac{1}{6} \, \log\left(x^{2} - x + 1\right) - \cos\left(x\right)
bool(g.differentiate(x) == f)
True

Symbolic Taylor Series

f = sin(x^2)-cos(x)/log(x)
f.taylor(x, 1, 3)
-7/720*(x - 1)^3*(210*sin(1) + 143*cos(1)) - 1/24*(x - 1)^2*(54*sin(1) - 29*cos(1)) + 1/12*(x - 1)*(6*sin(1) + 31*cos(1)) - cos(1)/(x - 1) + 2*sin(1) - 1/2*cos(1)
g = sin(x^2)/x
g.taylor(x, 0, 20)
1/362880*x^17 - 1/5040*x^13 + 1/120*x^9 - 1/6*x^5 + x
@interact def ex_taylor(n=(1..10)): h(x) = sin(x)*cos(x) show(h) show(plot(h,-1,4,thickness=2) + plot(h.taylor(x,1,n),-1,4, color='red'), ymin=-1,ymax=1)

Other Options for Symbolic Calculus

  1. Maxima -- a powerful symbolic computer algebra system, which is fully usable from Sage, and included in Sage.  Sometimes you want to do something, e.g., solve some weird differential equation or evaluate a special functions, and you search the web, find how to do it in Maxima, and can then... paste and do the same in Sage via the Maxima interface.

  2. SymPy -- a powerful pure Python library for symbolic Calculus, written almost entirely by Physics graduate students.  This can be installed into anything that you can run Python on, and provides a nice range of capabilities.  Sage uses it some, and it is included in Sage.

Maxima

maxima('sin(%i)')
%i*sinh(1)
sin(I)
sin(I)
f = log(sin(x)/x) f.taylor(x, 0, 10)
-1/467775*x^10 - 1/37800*x^8 - 1/2835*x^6 - 1/180*x^4 - 1/6*x^2
[bernoulli(2*i) for i in range(1,7)] [1/6, -1/30, 1/42, -1/30, 5/66, -691/2730]
f_maxima = maxima(f) f_maxima
log(sin(x)/x)
type(f_maxima)
<class 'sage.interfaces.maxima.MaximaElement'>
parent(f_maxima)
Maxima
maxima(f).powerseries(x,0)
'sum((-1)^i3*2^(2*i3-1)*bern(2*i3)*x^(2*i3)/(i3*(2*i3)!),i3,1,inf)

Sympy

reset()
from sympy import var as svar, sin, integrate, pi, S
x = svar('x') integrate(sin(x)*cos(x+1), (x, 0, pi))
-pi*sin(1)/2
type(x)
<type 'sage.symbolic.expression.Expression'>