(actual version from talk) Calculus in Sage -- a tour (Sage Days 15)
system:sage

<h1 style="text-align: center;"><br /></h1>
<h1 style="text-align: center;"><br /></h1>
<h1 style="text-align: center;"><br /></h1>
<h1 style="text-align: center;"><br /></h1>
<h1 style="text-align: center;">Calculus in Sage</h1>
<h2 style="text-align: center;"><span style="color: #333333;">William Stein</span></h2>
<h2 style="text-align: center;"><span style="color: #333333;">2009-05-16 at Sage Days 16</span></h2>
<h2 style="text-align: center;">
<table style="height: 141px;" border="0" width="400" align="center">
<tbody>
<tr>
<td>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="stamp_newton.jpg" alt="" width="222" height="134" /></p>
<p>&nbsp;</p>
</td>
<td>
<h2 style="text-align: center;"><img src="stamp_leibniz.jpg" alt="" width="122" height="144" /></h2>
</td>
</tr>
</tbody>
</table>
<br /></h2>

<p><strong>NOTE</strong>: I'm giving this talk using the <em><strong>Pynac-based symbolics</strong></em>!</p>

{{{id=89|
type(x)
///

<type 'sage.symbolic.expression.Expression'>
}}}

{{{id=1|

///
}}}

<h1>Creating Symbolic Expressions</h1>
<p>Use the <strong>var</strong> command to define some symbolic variables.  You can separate the variables by commas or spaces in the var command.</p>
<p><em>Tip</em>: Press shift-enter to evaluate an input cell (instead of clicking "evaluate").</p>

{{{id=5|
var('x y z epsilon')
///

(x, y, z, epsilon)
}}}

{{{id=6|
cos(x^3) - y^2*z + epsilon
///

-y^2*z + epsilon + cos(x^3)
}}}

{{{id=7|
t*y
///

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/scratch/wstein/build/sage-symbolics/notebook/worksheets/admin/1/code/129.py", line 6, in <module>
    exec compile(ur't*y' + '\n', '', 'single')
  File "/scratch/wstein/build/sage-symbolics/local/lib/python2.5/site-packages/Jinja-1.2-py2.5-linux-x86_64.egg/", line 1, in <module>
    
NameError: name 't' is not defined
}}}

{{{id=0|

///
}}}

<p><strong>Examples:</strong> Create the following expressions: $\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)$.</p>
<p><em>Note</em>: that you <em>must</em> put in an asterisk (*) for multiplication.</p>

{{{id=20|
sin(x)^5*cos(x)^2
///

sin(x)^5*cos(x)^2
}}}

{{{id=19|
x^3/(x^3+1)
///

x^3/(x^3 + 1)
}}}

{{{id=11|
var('k,K,P')
k*P * (1-P/K)
///

-(P/K - 1)*P*k
}}}

{{{id=112|
k * (P+1)
///

(P + 1)*k
}}}

{{{id=92|
2*k + 3
///

2*k + 3
}}}

{{{id=10|

///
}}}

<p>Most standard functions are defined in Sage.&nbsp; They are named lowercase, much like in Maple. E.g.,</p>
<p><span style="font-family: courier new,courier;">sin, cos, tan, sec, csc, cot, sinh, cosh, tanh, sech, csch, coth, log, exp, etc.</span></p>

{{{id=8|
var('x,y')
latex(sin(x) + cos(y) - tan(x/y) + sec(x*csc(y))^3)
///

\mbox{\sec}\left(x \mbox{\csc}\left(y\right)\right)^{3} + \sin\left(x\right) + \cos\left(y\right) - \tan\left(\frac{x}{y}\right)
}}}

{{{id=93|
show(sin(x^2).integrate())
///

<html><div class="math">\frac{1}{8} \, {(\left(I - 1\right) \, \sqrt{2} \mbox{\text{erf}}\left(\left(\frac{1}{2} I - \frac{1}{2}\right) \, \sqrt{2} x\right) + \left(I + 1\right) \, \sqrt{2} \mbox{\text{erf}}\left(\left(\frac{1}{2} I + \frac{1}{2}\right) \, \sqrt{2} x\right))} \sqrt{\pi}</div></html>
}}}

{{{id=2|

///
}}}

<p><strong>Example: </strong>Construct the symbolic expresion $\sin(x^{\cos(y)} + \theta) + \coth(2x) + \log(3x)\cdot \exp(y^3)$.&nbsp;</p>

{{{id=17|
var('x,y,theta')
sin(x^cos(y)+theta) + coth(2*x) + log(3*x) * exp(y^3)
///

e^(y^3)*log(3*x) + sin(x^cos(y) + theta) + coth(2*x)
}}}

{{{id=94|

///
}}}

{{{id=26|

///
}}}

<h2>Making substitutions</h2>
<p>Use the <strong>subs</strong> method to replace any variables by other variables.</p>

{{{id=29|
var('x,y')
f = sin(x) + cos(y) - x^2 + y
///
}}}

{{{id=28|
f.subs(x=5)
///

y + sin(5) + cos(y) - 25
}}}

{{{id=25|
f.subs(x=y, y=x)
///

-y^2 + x + sin(y) + cos(x)
}}}

{{{id=114|
f(x=5)
///

y + sin(5) + cos(y) - 25
}}}

{{{id=31|

///
}}}

{{{id=113|

///
}}}

<p><strong>Example: </strong>Replace $x$ by $\sin(y)-x$ in the expression $x^3 + x y$.</p>

{{{id=95|
var('x,y')
f = x^3 + x*y
f.subs(x=sin(y)-x)
///

-(x - sin(y))^3 - (x - sin(y))*y
}}}

{{{id=32|

///
}}}

{{{id=35|

///
}}}

<h2>Expanding Expressions</h2>
<p>To expand a symbolic expression with exponents, use the <strong>expand </strong>method.</p>

{{{id=34|
var('x,y')
f = (x+2*y)^3
f
///

(x + 2*y)^3
}}}

{{{id=30|
show(f.expand())                  # tip -- using show makes the output nicer
///

<html><div class="math">x^{3} + 6 \, x^{2} y + 12 \, x y^{2} + 8 \, y^{3}</div></html>
}}}

{{{id=116|
type(f)
///

<type 'sage.symbolic.expression.Expression'>
}}}

{{{id=118|
f
///

(x + 2*y)^3
}}}

{{{id=117|
f.operator()
///

<built-in function pow>
}}}

{{{id=119|
f.operands()
///

[x + 2*y, 3]
}}}

{{{id=120|

///
}}}

{{{id=38|

///
}}}

{{{id=115|

///
}}}

<p><strong>Example:</strong> Expand the expression $(2\sin(x)&nbsp; - \cos(y))^5$.</p>

{{{id=37|
f = (2*sin(x) - cos(y))^5
f.expand()
///

32*sin(x)^5 - 80*sin(x)^4*cos(y) + 80*sin(x)^3*cos(y)^2 - 40*sin(x)^2*cos(y)^3 + 10*sin(x)*cos(y)^4 - cos(y)^5
}}}

{{{id=121|
f
///

(2*sin(x) - cos(y))^5
}}}

{{{id=16|

///
}}}

<p>By the way, the pynac symbolics are faster at arithmetic/exanding.&nbsp; For, example, in Sage-3.4.2 right now:</p>
<p><span style="font-family: terminal,monaco;">sage: _=var('x,y,z'); f=expand((x+y+z)^10); g=f+1<br />sage: timeit('(f*g).expand()')<br />5 loops, best of 3: 531 ms per loop<br /><br /><br /></span></p>

<p>The pynac symbolics are more usable:</p>

{{{id=101|
_=var('x,y,z'); f=expand((x+y+z)^10); g=f+1
timeit('k=(f*g).expand()')
///

25 loops, best of 3: 21.2 ms per loop
}}}

{{{id=100|
531/21.1
///

25.1658767772512
}}}

{{{id=122|
R.<x,y,z> = QQ[]
f = (x+y+z)^10; g = f+1
timeit('k=(f*g)')
///

625 loops, best of 3: 150 µs per loop
}}}

{{{id=124|
21.2/.15
///

141.333333333333
}}}

{{{id=125|

///
}}}

{{{id=108|

///
}}}

{{{id=123|

///
}}}

<p>Another example.&nbsp; In Sage-3.4.2 (based on Maxima):</p>
<p><span style="font-family: times new roman,times;"><span style="font-family: terminal,monaco;">sage: timeit('((x+y+z)^15).expand()')<br />5 loops, best of 3: 49.3 ms per loop</span><br /></span></p>

{{{id=107|
timeit('((x+y+z)^15).expand()')
///

625 loops, best of 3: 771 µs per loop
}}}

{{{id=110|
49.3/.771
///

63.9429312581063
}}}

{{{id=111|

///
}}}

{{{id=15|

///
}}}

<h1>Creating Symbolic Functions</h1>
<p>To create a symbolic function, use the notation <strong>f(x,y) = x^3 + y</strong>.&nbsp; 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.</p>
<p>&nbsp;</p>

{{{id=13|
f(x,y) = x^3 + y
f
///

(x, y) |--> x^3 + y
}}}

{{{id=9|
f(2,3)
///

11
}}}

{{{id=21|
f(pi,e)
///

pi^3 + e
}}}

{{{id=103|

///
}}}

{{{id=126|
def f(x):
    return x^3 + 1
///
}}}

{{{id=128|
f(2)
///

9
}}}

{{{id=131|
f.integrate()
///

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/scratch/wstein/build/sage-symbolics/notebook/worksheets/admin/1/code/194.py", line 6, in <module>
    exec compile(ur'f.integrate()' + '\n', '', 'single')
  File "/scratch/wstein/build/sage-symbolics/local/lib/python2.5/site-packages/Jinja-1.2-py2.5-linux-x86_64.egg/", line 1, in <module>
    
AttributeError: 'function' object has no attribute 'integrate'
}}}

{{{id=132|
a = float(2)
timeit('f(a)')
///

625 loops, best of 3: 9.08 µs per loop
}}}

{{{id=46|

///
}}}

<p><strong>Problem</strong>: Create the functions $x\mapsto x^3 + 1, \qquad (x, y) \mapsto \sin(x) - \cos(y)/y, \qquad (a,x,\theta)\mapsto a x + \theta^2$.</p>

{{{id=45|
g(x) = x^3 + 1
g
///

x |--> x^3 + 1
}}}

{{{id=133|
h = g._fast_float_(x)
///
}}}

{{{id=134|
a = float(2)
timeit('h(a)')
///

625 loops, best of 3: 211 ns per loop
}}}

{{{id=127|
g(2)
///

9
}}}

{{{id=129|
g.integrate()
///

x |--> 1/4*x^4 + x
}}}

{{{id=130|

///
}}}

{{{id=44|
f(x,y) = sin(x)-cos(y)/y
f
///

(x, y) |--> -cos(y)/y + sin(x)
}}}

{{{id=97|
f(a,x,s1,s2) = a*x+s2^2-s1^4
show(f)
///

<html><div class="math">\left( a, x, s_{1}, s_{2} \right) \ {\mapsto} \ -s_{1}^{4} + a x + s_{2}^{2}</div></html>
}}}

{{{id=96|

///
}}}

{{{id=22|

///
}}}

<h1>2D Plotting</h1>
<p>Use the <strong>plot</strong> command to plot a function of 1 variable.&nbsp; <em>TIP</em>: Type <strong>plot(&lt;tab key&gt;</strong> to find out much more about the plot command.</p>

{{{id=51|
var('x')
(plot(sin(x^2), (x,-3,3), thickness=5, rgbcolor='red')
   + circle((0,0),1,rgbcolor='blue',alpha=0.5,thickness=10))
///

<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=135|
@interact
def f(n=(1..10), thickness=(1..20)):
    show(plot(sin(n*x),(0,10*pi),thickness=thickness))
    print factor(n*thickness)
///

<html><!--notruncate--><div padding=6 id='div-interact-135'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">n&nbsp;</font></td><td><table><tr><td>
        <div id='slider-n-135' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-n-135-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10"]; setTimeout(function() {
    $('#slider-n-135').slider({
        stepping: 1, min: 0, max: 9, startValue: 0,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-n-135-lbl').text(values[position]); interact(135, "sage.server.notebook.interact.update(135, \"n\", 34, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(135)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-n-135-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-n-135-lbl').text(values[$('#slider-n-135').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">thickness&nbsp;</font></td><td><table><tr><td>
        <div id='slider-thickness-135' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-thickness-135-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]; setTimeout(function() {
    $('#slider-thickness-135').slider({
        stepping: 1, min: 0, max: 19, startValue: 0,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-thickness-135-lbl').text(values[position]); interact(135, "sage.server.notebook.interact.update(135, \"thickness\", 35, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(135)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-thickness-135-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-thickness-135-lbl').text(values[$('#slider-thickness-135').slider('value')]);
    }, 1); })();</script></td></tr>
</table><div id='cell-interact-135'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

{{{id=136|
f(1)
///

<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=40|

///
}}}

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

{{{id=50|
var('x')
@interact
def plot_example(f=sin(x^2),r=range_slider(-5,5,step_size=1/4,default=(-3,3)), 
                 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,
                  c=Color('blue')
                 ):
    show(plot(f, (x,r[0],r[1]), color=c, 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)
///

<html><!--notruncate--><div padding=6 id='div-interact-50'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">f&nbsp;</font></td><td><input type='text' value="sin(x^2)" size=80 onchange='interact(50, "sage.server.notebook.interact.update(50, \"f\", 17, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)")'></input></td></tr>
<tr><td align=right><font color="black">r&nbsp;</font></td><td><table>
    <tr><td><div id='slider-r-50' class='ui-slider ui-slider-3' style='margin:0px;'>
    <span class='ui-slider-handle'></span><span class='ui-slider-handle'></span>
    </div></td></tr><tr><td><font color='black' id='slider-r-50-lbl'></font></td></tr></table><script>(function()
    {
        var values = ["-5","-19/4","-9/2","-17/4","-4","-15/4","-7/2","-13/4","-3","-11/4","-5/2","-9/4","-2","-7/4","-3/2","-5/4","-1","-3/4","-1/2","-1/4","0","1/4","1/2","3/4","1","5/4","3/2","7/4","2","9/4","5/2","11/4","3","13/4","7/2","15/4","4","17/4","9/2","19/4","5"];
        var pos = [8, 32];
        var sel = '#slider-r-50';
        var updatePos = function()
        {
            pos[0]=$(sel).slider('value', 0);
            pos[1]=$(sel).slider('value', 1);
            if(values!=null) $(sel+'-lbl').text("("+values[pos[0]]+", "+values[pos[1]]+")");
        };
        setTimeout(function()
        {
            $(sel).slider(
            {
                range: true,
                stepping: 1,                    
                min: 0,
                max: 40,
                handles: [{start: 8},{start:32}],
                change: function(e,ui){ updatePos(); interact(50, "sage.server.notebook.interact.update(50, \"r\", 18, sage.server.notebook.interact.standard_b64decode(\""+encode64(pos[0]+' '+pos[1])+"\"), globals());sage.server.notebook.interact.recompute(50)"); },
                slide: updatePos
            });
            updatePos();
        }, 1);
    })();</script></td></tr>
<tr><td align=right><font color="black">thickness&nbsp;</font></td><td><table><tr><td>
        <div id='slider-thickness-50' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-thickness-50-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10"]; setTimeout(function() {
    $('#slider-thickness-50').slider({
        stepping: 1, min: 0, max: 9, startValue: 2,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-thickness-50-lbl').text(values[position]); interact(50, "sage.server.notebook.interact.update(50, \"thickness\", 19, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(50)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-thickness-50-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-thickness-50-lbl').text(values[$('#slider-thickness-50').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">adaptive_recursion&nbsp;</font></td><td><table><tr><td>
        <div id='slider-adaptive_recursion-50' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-adaptive_recursion-50-lbl'></font></td></tr></table><script>(function(){ var values = ["0","1","2","3","4","5","6","7","8","9","10"]; setTimeout(function() {
    $('#slider-adaptive_recursion-50').slider({
        stepping: 1, min: 0, max: 10, startValue: 5,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-adaptive_recursion-50-lbl').text(values[position]); interact(50, "sage.server.notebook.interact.update(50, \"adaptive_recursion\", 20, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(50)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-adaptive_recursion-50-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-adaptive_recursion-50-lbl').text(values[$('#slider-adaptive_recursion-50').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">adaptive_tolerance&nbsp;</font></td><td><table><tr><td>
        <div id='slider-adaptive_tolerance-50' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-adaptive_tolerance-50-lbl'></font></td></tr></table><script>(function(){ var values = ["0.00100000000000000","0.00300200400801603","0.00500400801603206","0.00700601202404810","0.00900801603206413","0.0110100200400802","0.0130120240480962","0.0150140280561122","0.0170160320641283","0.0190180360721443","0.0210200400801603","0.0230220440881764","0.0250240480961924","0.0270260521042084","0.0290280561122245","0.0310300601202405","0.0330320641282565","0.0350340681362726","0.0370360721442886","0.0390380761523046","0.0410400801603207","0.0430420841683367","0.0450440881763527","0.0470460921843688","0.0490480961923848","0.0510501002004008","0.0530521042084169","0.0550541082164329","0.0570561122244489","0.0590581162324650","0.0610601202404810","0.0630621242484970","0.0650641282565131","0.0670661322645291","0.0690681362725451","0.0710701402805612","0.0730721442885772","0.0750741482965932","0.0770761523046093","0.0790781563126253","0.0810801603206413","0.0830821643286574","0.0850841683366734","0.0870861723446894","0.0890881763527055","0.0910901803607215","0.0930921843687375","0.0950941883767536","0.0970961923847696","0.0990981963927857","0.101100200400802","0.103102204408818","0.105104208416834","0.107106212424850","0.109108216432866","0.111110220440882","0.113112224448898","0.115114228456914","0.117116232464930","0.119118236472946","0.121120240480962","0.123122244488978","0.125124248496994","0.127126252505010","0.129128256513026","0.131130260521042","0.133132264529058","0.135134268537074","0.137136272545090","0.139138276553106","0.141140280561122","0.143142284569138","0.145144288577154","0.147146292585170","0.149148296593186","0.151150300601203","0.153152304609219","0.155154308617235","0.157156312625251","0.159158316633267","0.161160320641283","0.163162324649299","0.165164328657315","0.167166332665331","0.169168336673347","0.171170340681363","0.173172344689379","0.175174348697395","0.177176352705411","0.179178356713427","0.181180360721443","0.183182364729459","0.185184368737475","0.187186372745491","0.189188376753507","0.191190380761523","0.193192384769539","0.195194388777555","0.197196392785571","0.199198396793587","0.201200400801603","0.203202404809619","0.205204408817635","0.207206412825651","0.209208416833668","0.211210420841684","0.213212424849700","0.215214428857716","0.217216432865732","0.219218436873748","0.221220440881764","0.223222444889780","0.225224448897796","0.227226452905812","0.229228456913828","0.231230460921844","0.233232464929860","0.235234468937876","0.237236472945892","0.239238476953908","0.241240480961924","0.243242484969940","0.245244488977956","0.247246492985972","0.249248496993988","0.251250501002004","0.253252505010020","0.255254509018036","0.257256513026052","0.259258517034068","0.261260521042084","0.263262525050100","0.265264529058116","0.267266533066132","0.269268537074148","0.271270541082165","0.273272545090181","0.275274549098197","0.277276553106213","0.279278557114229","0.281280561122245","0.283282565130261","0.285284569138277","0.287286573146293","0.289288577154309","0.291290581162325","0.293292585170341","0.295294589178357","0.297296593186373","0.299298597194389","0.301300601202405","0.303302605210421","0.305304609218437","0.307306613226453","0.309308617234469","0.311310621242485","0.313312625250501","0.315314629258517","0.317316633266533","0.319318637274549","0.321320641282565","0.323322645290581","0.325324649298597","0.327326653306613","0.329328657314630","0.331330661322646","0.333332665330662","0.335334669338678","0.337336673346694","0.339338677354710","0.341340681362726","0.343342685370742","0.345344689378758","0.347346693386774","0.349348697394790","0.351350701402806","0.353352705410822","0.355354709418838","0.357356713426854","0.359358717434870","0.361360721442886","0.363362725450902","0.365364729458918","0.367366733466934","0.369368737474950","0.371370741482966","0.373372745490982","0.375374749498998","0.377376753507014","0.379378757515030","0.381380761523046","0.383382765531062","0.385384769539078","0.387386773547094","0.389388777555111","0.391390781563127","0.393392785571143","0.395394789579159","0.397396793587175","0.399398797595191","0.401400801603207","0.403402805611223","0.405404809619239","0.407406813627255","0.409408817635271","0.411410821643287","0.413412825651303","0.415414829659319","0.417416833667335","0.419418837675351","0.421420841683367","0.423422845691383","0.425424849699399","0.427426853707415","0.429428857715431","0.431430861723447","0.433432865731463","0.435434869739479","0.437436873747495","0.439438877755511","0.441440881763527","0.443442885771543","0.445444889779559","0.447446893787576","0.449448897795592","0.451450901803608","0.453452905811624","0.455454909819640","0.457456913827656","0.459458917835672","0.461460921843688","0.463462925851704","0.465464929859720","0.467466933867736","0.469468937875752","0.471470941883768","0.473472945891784","0.475474949899800","0.477476953907816","0.479478957915832","0.481480961923848","0.483482965931864","0.485484969939880","0.487486973947896","0.489488977955912","0.491490981963928","0.493492985971944","0.495494989979960","0.497496993987976","0.499498997995992","0.501501002004008","0.503503006012024","0.505505010020040","0.507507014028056","0.509509018036072","0.511511022044088","0.513513026052104","0.515515030060120","0.517517034068136","0.519519038076152","0.521521042084168","0.523523046092184","0.525525050100200","0.527527054108216","0.529529058116232","0.531531062124248","0.533533066132264","0.535535070140280","0.537537074148296","0.539539078156312","0.541541082164328","0.543543086172344","0.545545090180360","0.547547094188376","0.549549098196392","0.551551102204408","0.553553106212424","0.555555110220440","0.557557114228456","0.559559118236472","0.561561122244488","0.563563126252504","0.565565130260520","0.567567134268536","0.569569138276552","0.571571142284568","0.573573146292584","0.575575150300600","0.577577154308616","0.579579158316632","0.581581162324648","0.583583166332663","0.585585170340679","0.587587174348695","0.589589178356711","0.591591182364727","0.593593186372743","0.595595190380759","0.597597194388775","0.599599198396791","0.601601202404807","0.603603206412823","0.605605210420839","0.607607214428855","0.609609218436871","0.611611222444887","0.613613226452903","0.615615230460919","0.617617234468935","0.619619238476951","0.621621242484967","0.623623246492983","0.625625250500999","0.627627254509015","0.629629258517031","0.631631262525047","0.633633266533063","0.635635270541079","0.637637274549095","0.639639278557111","0.641641282565127","0.643643286573143","0.645645290581159","0.647647294589175","0.649649298597191","0.651651302605207","0.653653306613223","0.655655310621239","0.657657314629255","0.659659318637271","0.661661322645287","0.663663326653303","0.665665330661319","0.667667334669335","0.669669338677351","0.671671342685367","0.673673346693383","0.675675350701399","0.677677354709414","0.679679358717430","0.681681362725446","0.683683366733462","0.685685370741478","0.687687374749494","0.689689378757510","0.691691382765526","0.693693386773542","0.695695390781558","0.697697394789574","0.699699398797590","0.701701402805606","0.703703406813622","0.705705410821638","0.707707414829654","0.709709418837670","0.711711422845686","0.713713426853702","0.715715430861718","0.717717434869734","0.719719438877750","0.721721442885766","0.723723446893782","0.725725450901798","0.727727454909814","0.729729458917830","0.731731462925846","0.733733466933862","0.735735470941878","0.737737474949894","0.739739478957910","0.741741482965926","0.743743486973942","0.745745490981958","0.747747494989974","0.749749498997990","0.751751503006006","0.753753507014022","0.755755511022038","0.757757515030054","0.759759519038070","0.761761523046086","0.763763527054102","0.765765531062118","0.767767535070134","0.769769539078149","0.771771543086165","0.773773547094181","0.775775551102197","0.777777555110213","0.779779559118229","0.781781563126245","0.783783567134261","0.785785571142277","0.787787575150293","0.789789579158309","0.791791583166325","0.793793587174341","0.795795591182357","0.797797595190373","0.799799599198389","0.801801603206405","0.803803607214421","0.805805611222437","0.807807615230453","0.809809619238469","0.811811623246485","0.813813627254501","0.815815631262517","0.817817635270533","0.819819639278549","0.821821643286565","0.823823647294581","0.825825651302597","0.827827655310613","0.829829659318629","0.831831663326645","0.833833667334661","0.835835671342677","0.837837675350693","0.839839679358709","0.841841683366725","0.843843687374741","0.845845691382757","0.847847695390773","0.849849699398789","0.851851703406805","0.853853707414821","0.855855711422837","0.857857715430853","0.859859719438869","0.861861723446884","0.863863727454900","0.865865731462916","0.867867735470932","0.869869739478948","0.871871743486964","0.873873747494980","0.875875751502996","0.877877755511012","0.879879759519028","0.881881763527044","0.883883767535060","0.885885771543076","0.887887775551092","0.889889779559108","0.891891783567124","0.893893787575140","0.895895791583156","0.897897795591172","0.899899799599188","0.901901803607204","0.903903807615220","0.905905811623236","0.907907815631252","0.909909819639268","0.911911823647284","0.913913827655300","0.915915831663316","0.917917835671332","0.919919839679348","0.921921843687364","0.923923847695380","0.925925851703396","0.927927855711412","0.929929859719428","0.931931863727444","0.933933867735460","0.935935871743476","0.937937875751492","0.939939879759508","0.941941883767524","0.943943887775540","0.945945891783556","0.947947895791572","0.949949899799588","0.951951903807604","0.953953907815620","0.955955911823635","0.957957915831651","0.959959919839667","0.961961923847683","0.963963927855699","0.965965931863715","0.967967935871731","0.969969939879747","0.971971943887763","0.973973947895779","0.975975951903795","0.977977955911811","0.979979959919827","0.981981963927843","0.983983967935859","0.985985971943875","0.987987975951891","0.989989979959907","0.991991983967923","0.993993987975939","0.995995991983955","0.997997995991971","1.00000000000000"]; setTimeout(function() {
    $('#slider-adaptive_tolerance-50').slider({
        stepping: 1, min: 0, max: 499, startValue: 4,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-adaptive_tolerance-50-lbl').text(values[position]); interact(50, "sage.server.notebook.interact.update(50, \"adaptive_tolerance\", 21, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(50)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-adaptive_tolerance-50-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-adaptive_tolerance-50-lbl').text(values[$('#slider-adaptive_tolerance-50').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">plot_points&nbsp;</font></td><td><table><tr><td>
        <div id='slider-plot_points-50' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-plot_points-50-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100"]; setTimeout(function() {
    $('#slider-plot_points-50').slider({
        stepping: 1, min: 0, max: 99, startValue: 19,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-plot_points-50-lbl').text(values[position]); interact(50, "sage.server.notebook.interact.update(50, \"plot_points\", 22, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(50)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-plot_points-50-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-plot_points-50-lbl').text(values[$('#slider-plot_points-50').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">linestyle&nbsp;</font></td><td><table style="border:1px solid #dfdfdf;background-color:#efefef">
<tr><td><button style='border-style:inset;' value='0' onclick='$("BUTTON", this.parentNode).css("border-style", "outset"); $(this).css("border-style", "inset"); interact(50, "sage.server.notebook.interact.update(50, \"linestyle\", 23, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)")'>-</button>
<button style='border-style:outset;' value='1' onclick='$("BUTTON", this.parentNode).css("border-style", "outset"); $(this).css("border-style", "inset"); interact(50, "sage.server.notebook.interact.update(50, \"linestyle\", 23, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)")'>--</button>
<button style='border-style:outset;' value='2' onclick='$("BUTTON", this.parentNode).css("border-style", "outset"); $(this).css("border-style", "inset"); interact(50, "sage.server.notebook.interact.update(50, \"linestyle\", 23, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)")'>-.</button>
<button style='border-style:outset;' value='3' onclick='$("BUTTON", this.parentNode).css("border-style", "outset"); $(this).css("border-style", "inset"); interact(50, "sage.server.notebook.interact.update(50, \"linestyle\", 23, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)")'>:</button>
</td></tr></table></td></tr>
<tr><td align=right><font color="black">gridlines&nbsp;</font></td><td><input type='checkbox'  width=200px onchange='interact(50, "sage.server.notebook.interact.update(50, \"gridlines\", 24, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.checked)+"\"), globals());sage.server.notebook.interact.recompute(50)")'></input></td></tr>
<tr><td align=right><font color="black">fill&nbsp;</font></td><td><input type='checkbox'  width=200px onchange='interact(50, "sage.server.notebook.interact.update(50, \"fill\", 25, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.checked)+"\"), globals());sage.server.notebook.interact.recompute(50)")'></input></td></tr>
<tr><td align=right><font color="black">frame&nbsp;</font></td><td><input type='checkbox'  width=200px onchange='interact(50, "sage.server.notebook.interact.update(50, \"frame\", 26, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.checked)+"\"), globals());sage.server.notebook.interact.recompute(50)")'></input></td></tr>
<tr><td align=right><font color="black">axes&nbsp;</font></td><td><input type='checkbox' checked width=200px onchange='interact(50, "sage.server.notebook.interact.update(50, \"axes\", 27, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.checked)+"\"), globals());sage.server.notebook.interact.recompute(50)")'></input></td></tr>
<tr><td align=right><font color="black">c&nbsp;</font></td><td><table><tr><td><div id='color-selector-c-50-picker'></div></td><td>
<input type='text' id='color-selector-c-50' name='color' onchange='interact(50, "sage.server.notebook.interact.update(50, \"c\", 28, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(50)");$.farbtastic("#color-selector-c-50-picker").setColor(this.value);' value='#0000ff'/></td></tr></table><script>setTimeout(function() {
          $('#color-selector-c-50-picker').farbtastic('#color-selector-c-50');
          $.farbtastic('#color-selector-c-50-picker').linkTo(function(color) {
              var t = get_element('color-selector-c-50');
              if(color!=t.value) {
                  t.value = color;
                  t.style.backgroundColor = color; 
                  interact(50, "sage.server.notebook.interact.update(50, \"c\", 28, sage.server.notebook.interact.standard_b64decode(\""+encode64(color)+"\"), globals());sage.server.notebook.interact.recompute(50)");
              }
              return;
            })
       }, 1);</script></td></tr>
</table><div id='cell-interact-50'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

{{{id=54|

///
}}}

<p><strong>Example: </strong>I made the following using the above interactive plotter with $\sin(x^2)$.</p>
<p><img src="plotsinx2.png" alt="" /></p>

{{{id=57|

///
}}}

{{{id=56|

///
}}}

<p>You can plot many other things, including polygons, parametric plots, polar plots, implicit plots, etc.:</p>
<p style="text-align: center;"><strong>line, polygon, circle, text, polar_plot, parametric_plot, circle, implicit_plot</strong></p>
<p style="text-align: left;">You superimpose plots using <strong>+</strong>.</p>

{{{id=53|
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)
///

<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=52|

///
}}}

<p><strong>Example: </strong>Draw 3 concentric circles that are red, green and blue.&nbsp; [Hints: Use rgbcolor, and give the aspect_ratio=1 option to the show command, as above.]</p>

{{{id=98|
G = circle((0,0),1,rgbcolor='red') + circle((0,0),2,rgbcolor='green')
G = G + circle((0,0),3,rgbcolor='blue')
G.show(aspect_ratio=1)
///
}}}

{{{id=48|

///
}}}

{{{id=42|

///
}}}

<h1>3D Plotting</h1>
<p>You can also plot functions of two variables using the <strong>plot3d</strong> command.&nbsp; Also, there are <strong>line3d, sphere, text3d, cube, parametric_plot3d, </strong>etc. commands.&nbsp;&nbsp; Bill Cauchois will demo 3d plotting much more in the next talk.</p>

{{{id=65|
var('x,y')
plot3d(sin(x-y)*cos(x-y^2),(x,-2,2),(y,-2,2))
///
}}}

{{{id=69|

///
}}}

<p><strong>Example</strong>: Draw a 3d plot of the function $4x e^{-x^2-y^2}$.</p>

{{{id=73|
f(x,y) = 4*x*e^(-x^2-y^2)
plot3d(f,(x,-2,2),(y,-2,2))
///
}}}

{{{id=72|

///
}}}

{{{id=68|

///
}}}

{{{id=61|

///
}}}

{{{id=76|

///
}}}

<h1>Computing Integrals and Derivatives</h1>
<p>You can symbolically integrate or differentiate functions, compute limits, Taylor polynomials, etc.</p>

{{{id=81|
var('x')
integrate(x^2, x)
///

1/3*x^3
}}}

{{{id=82|
integrate(sin(x)+tan(2*x),x)
///

1/2*log(sec(2*x)) - cos(x)
}}}

{{{id=138|
f = sin(x) - cos(y*x) + 1/(x^3+1)
g = f.integrate(x)
show(g)
///

<html><div class="math">\frac{1}{3} \, \sqrt{3} \arctan\left(\frac{1}{3} \, {(2 \, x - 1)} \sqrt{3}\right) - \frac{\sin\left(x y\right)}{y} + \frac{1}{3} \, \ln\left(x + 1\right) - \frac{1}{6} \, \ln\left(x^{2} - x + 1\right) - \cos\left(x\right)</div></html>
}}}

{{{id=137|
sin(x^2).integrate(x, algorithm='maxima')
///

1/8*((I - 1)*sqrt(2)*erf((1/2*I - 1/2)*sqrt(2)*x) + (I + 1)*sqrt(2)*erf((1/2*I + 1/2)*sqrt(2)*x))*sqrt(pi)
}}}

{{{id=78|
f = sin(x) - cos(y*x) + 1/(x^3+1)
g = f.integrate(x)
show(g)
///

<html><div class="math">\frac{1}{3} \, \sqrt{3} \arctan\left(\frac{1}{3} \, {(2 \, x - 1)} \sqrt{3}\right) - \frac{\sin\left(x y\right)}{y} + \frac{1}{3} \, \ln\left(x + 1\right) - \frac{1}{6} \, \ln\left(x^{2} - x + 1\right) - \cos\left(x\right)</div></html>
}}}

{{{id=24|
bool(g.differentiate(x) == f)
///

True
}}}

{{{id=79|
h = sin(x)*cos(x)
show(h.taylor(x, 1, 2))
///
}}}

{{{id=84|
@interact
def ex_taylor(n=(1..10), h=sin(x)*cos(x)):
    h = SR(h)
    show(plot(h,-1,4,thickness=2) + plot(h.taylor(x,1,n),-1,4, color='red'), ymin=-1,ymax=1)
///

<html><!--notruncate--><div padding=6 id='div-interact-84'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">n&nbsp;</font></td><td><table><tr><td>
        <div id='slider-n-84' class='ui-slider ui-slider-3' style='margin:0px;'><span class='ui-slider-handle'></span></div>
        </td><td><font color='black' id='slider-n-84-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10"]; setTimeout(function() {
    $('#slider-n-84').slider({
        stepping: 1, min: 0, max: 9, startValue: 0,
        change: function (e,ui) { var position = ui.value; if(values!=null) $('#slider-n-84-lbl').text(values[position]); interact(84, "sage.server.notebook.interact.update(84, \"n\", 15, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals());sage.server.notebook.interact.recompute(84)"); },
        slide: function(e,ui) { if(values!=null) $('#slider-n-84-lbl').text(values[ui.value]); }
    });
    if(values != null) $('#slider-n-84-lbl').text(values[$('#slider-n-84').slider('value')]);
    }, 1); })();</script></td></tr>
<tr><td align=right><font color="black">h&nbsp;</font></td><td><input type='text' value="sin(x)*cos(x)" size=80 onchange='interact(84, "sage.server.notebook.interact.update(84, \"h\", 16, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals());sage.server.notebook.interact.recompute(84)")'></input></td></tr>
</table><div id='cell-interact-84'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

{{{id=140|
f = sin(x^2)
///
}}}

{{{id=139|
g =fast_float(f,x)
///
}}}

{{{id=88|
timeit('g(1.0r)')
///

625 loops, best of 3: 245 ns per loop
}}}

<p><strong><br /></strong></p>

{{{id=87|
timeit('f(x=1.0r)')
///

625 loops, best of 3: 43.7 µs per loop
}}}

{{{id=86|
43/.245
///

175.510204081633
}}}

{{{id=85|

///
}}}

{{{id=99|

///
}}}