Differences between revisions 30 and 117 (spanning 87 versions)
 ⇤ ← Revision 30 as of 2009-06-16 04:42:21 → Size: 43275 Editor: NickAlexander Comment: ← Revision 117 as of 2020-08-11 14:10:09 → ⇥ Size: 63144 Editor: kcrisman Comment: Deletions are marked like this. Additions are marked like this. Line 6: Line 6: Line 9: Line 10: {{{ {{{#!sagecell Line 26: Line 27: raise ValueError, "f must have a sign change in the interval (%s,%s)"%(a,b) raise ValueError("f must have a sign change in the interval (%s,%s)"%(a,b)) Line 28: Line 29: html("

Double Precision Root Finding Using Bisection

")@interactdef _(f = cos(x) - x, a = float(0), b = float(1), eps=(-3,(-16..-1))): pretty_print(html("

Double Precision Root Finding Using Bisection

"))@interactdef _(f = cos(x) - x, a = float(0), b = float(1), eps=(-3,(-16, -1))): Line 32: Line 33: print "eps = %s"%float(eps) print("eps = %s" % float(eps)) Line 34: Line 35: time c, intervals = bisect_method(f, a, b, eps) c, intervals = bisect_method(f, a, b, eps) Line 36: Line 37: print "f must have opposite sign at the endpoints of the interval" print("f must have opposite sign at the endpoints of the interval") Line 39: Line 40: print "root =", c         print "f(c) = %r"%f(c)         print "iterations =", len(intervals) print("root =", c)         print("f(c) = %r" % f(x=c))         print("iterations =", len(intervals)) Line 56: Line 57: {{{ https://cloud.sagemath.com/projects/19575ea0-317e-402b-be57-368d04c113db/files/pub/2801-2901/2824-Double%20Precision%20Root%20Finding%20Using%20Newton's%20Method.sagews {{{#!sagecell Line 66: Line 69: for i in xrange(maxiter): for i in range(maxiter): Line 72: Line 75: html("

Double Precision Root Finding Using Newton's Method

")@interactdef _(f = x^2 - 2, c = float(0.5), eps=(-3,(-16..-1)), interval=float(0.5)): var('x') pretty_print(html("

Double Precision Root Finding Using Newton's Method

"))@interactdef _(f = x^2 - 2, c = float(0.5), eps=(-3,(-16, -1)), interval=float(0.5)): Line 76: Line 81: print "eps = %s"%float(eps)     time z, iterates = newton_method(f, c, eps)     print "root =", z     print "f(c) = %r"%f(z) print("eps = %s"%float(eps))     z, iterates = newton_method(f, c, eps)     print("root = {}".format(z))     print("f(c) = %r" % f(x=z)) Line 81: Line 86: print "iterations =", n     html(iterates)     P = plot(f, z-interval, z+interval, rgbcolor='blue') print("iterations = {}".format(n))     pretty_print(html(iterates))     P = plot(f, (x,z-interval, z+interval), rgbcolor='blue') Line 94: Line 99: {{{ https://cloud.sagemath.com/projects/19575ea0-317e-402b-be57-368d04c113db/files/pub/2801-2901/2823.sagews{{{#!sagecell Line 101: Line 108: C = contour_plot(f, (-2,2), (-2,2), plot_points=30, contours=15, cmap=cmap) C = contour_plot(f, (x,-2,2), (y,-2,2), plot_points=30, contours=15, cmap=cmap) Line 110: Line 117: {{{html('

Tangent line grapher

') {{{#!sagecellpretty_print(html('

Tangent line grapher

')) Line 118: Line 125: tanf = f(x0i) + df(x0i)*(x-x0i) tanf = f(x=x0i) + df(x=x0i)*(x-x0i) Line 120: Line 127: print 'Tangent line is y = ' + tanf._repr_() print('Tangent line is y = ' + tanf._repr_()) Line 122: Line 129: fmax = f.find_maximum_on_interval(prange[0], prange[1])[0]    fmin = f.find_minimum_on_interval(prange[0], prange[1])[0] fmax = f.find_local_maximum(prange[0], prange[1])[0]    fmin = f.find_local_minimum(prange[0], prange[1])[0] Line 130: Line 137: {{{ {{{#!sagecell Line 139: Line 146: midys = [func(x_val) for x_val in midxs] midys = [func(x=x_val) for x_val in midxs] Line 145: Line 152: min_y = find_minimum_on_interval(func,a,b)[0]    max_y = find_maximum_on_interval(func,a,b)[0]    html('

Numerical integrals with the midpoint rule

')    html('$\int_{a}^{b}{f(x) dx} {\\approx} \sum_i{f(x_i) \Delta x}$')    print "\n\nSage numerical answer: " + str(integral_numerical(func,a,b,max_points = 200)[0])    print "Midpoint estimated answer: " + str(RDF(dx*sum([midys[q] for q in range(n)]))) min_y = min(0, find_local_minimum(func,a,b)[0])    max_y = max(0, find_local_maximum(func,a,b)[0])    pretty_print(html('

Numerical integrals with the midpoint rule

'))    pretty_print(html(r'$\int_{a}^{b}{f(x) dx} {\approx} \sum_i{f(x_i) \Delta x}$'))    print("\n\nSage numerical answer: " + str(integral_numerical(func,a,b,max_points = 200)[0]))    print("Midpoint estimated answer: " + str(RDF(dx*sum([midys[q] for q in range(n)])))) Line 158: Line 165: {{{# by Nick Alexander (based on the work of Marshall Hampton) {{{#!sagecell Line 169: Line 174: t = sage.calculus.calculus.var('t') t = var('t') Line 183: Line 188: x = find_maximum_on_interval(func, q*dx + a, q*dx + dx + a)[1] x = find_local_maximum(func, q*dx + a, q*dx + dx + a)[1] Line 186: Line 191: x = find_minimum_on_interval(func, q*dx + a, q*dx + dx + a)[1] x = find_local_minimum(func, q*dx + a, q*dx + dx + a)[1] Line 197: Line 202: min_y = min(0, find_minimum_on_interval(func,a,b)[0])    max_y = max(0, find_maximum_on_interval(func,a,b)[0])    # html('

Numerical integrals with the midpoint rule

') min_y = min(0, find_local_minimum(func,a,b)[0])    max_y = max(0, find_local_maximum(func,a,b)[0])    pretty_print(html('

Numerical integral with the {} rule

'.format(endpoint_rule))) Line 208: Line 213: sum_html = "%s \cdot \\left[ %s \\right]" % (dx, ' + '.join([ "f(%s)" % cap(i) for i in xs ]))    num_html = "%s \cdot \\left[ %s \\right]" % (dx, ' + '.join([ str(cap(i)) for i in xs ])) sum_html = "%s \\cdot \\left[ %s \\right]" % (dx, ' + '.join([ "f(%s)" % cap(i) for i in xs ]))    num_html = "%s \\cdot \\left[ %s \\right]" % (dx, ' + '.join([ str(cap(i)) for i in ys ])) Line 214: Line 219: html(r'''
\begin{align*}   \int_{a}^{b} {f(x) \, dx} & = %s \\\   \sum_{i=1}^{%s} {f(x_i) \, \Delta x}      & = %s \\\   & = %s \\\   & = %s .    \end{align*}
\begin{align*}   \int_{a}^{b} {f(x) \, dx} & = %s \\\   \sum_{i=1}^{%s} {f(x_i) \, \Delta x} & = %s \\\   & = %s \\\   & = %s . \end{align*}
'''                       % (numerical_answer, number_of_subdivisions, sum_html, num_html, estimated_answer))) Line 227: Line 229: == Some polar parametric curves ==by Marshall Hampton.This is not very general, but could be modified to show other families of polar curves.{{{#!sagecell@interactdef para(n1 = slider(1,5,1,default = 2), n2 = slider(1,5,1,default = 3), a1 = slider(1,10,1/10,6/5), a2 = slider(1,10,1/10,6), b = slider(0,2,1/50,0)):    var('t')    pretty_print(html('$r=' + latex(b+sin(a1*t)^n1 + cos(a2*t)^n2)+'$'))    p = parametric_plot((cos(t)*(b+sin(a1*t)^n1 + cos(a2*t)^n2), sin(t)*(b+sin(a1*t)^n1 + cos(a2*t)^n2)), (t,0, 20*pi), plot_points = 1024, rgbcolor = (0,0,0))    show(p, figsize = [5,5], xmin = -2-b, xmax = 2+b, ymin = -2-b, ymax = 2+b, axes = False)}}}{{attachment:polarcurves1.png}} Line 231: Line 246: {{{ {{{#!sagecell Line 242: Line 257: except TypeError, msg:        print msg[-200:]        print "Unable to make sense of f,g, or a as symbolic expressions." except TypeError as msg:        print(msg[-200:])        print("Unable to make sense of f,g, or a as symbolic expressions.") Line 309: Line 324: html('
$f = %s$
'%latex(f))    html('
$g = %s$
'%latex(g))    html('
$h = %s = %s$
'%(lbl, latex(h))) pretty_print(html('
$f = %s$
'%latex(f)))    pretty_print(html('
$g = %s$
'%latex(g)))    pretty_print(html('
$h = %s = %s$
'%(lbl, latex(h)))) Line 329: Line 344: {{{ {{{#!sagecell Line 359: Line 374: vertical_alignment="bottom" if f(x0) < 0 else "top" ) vertical_alignment="bottom" if f(x=x0) < 0 else "top" ) Line 375: Line 390: fi = RR(f(xi))        fpi = RR(df(xi)) fi = RR(f(x=xi))        fpi = RR(df(x=xi)) Line 411: Line 426: vertical_alignment="bottom" if f(xip1) < 0 else "top" ) vertical_alignment="bottom" if f(x=xip1) < 0 else "top" ) Line 427: Line 442: html( t ) pretty_print(html( t )) Line 435: Line 450: {{{ {{{#!sagecell Line 441: Line 452: # polar coordinates#(x,y)=(u*cos(v),u*sin(v)); (u_range,v_range)=([0..6],[0..2*pi,step=pi/12])# weird example(x,y)=(u^2-v^2,u*v+cos(u*v)); (u_range,v_range)=([-5..5],[-5..5])thickness=4square_length=.05 Line 444: Line 464: def trans(x=input_box(u2-v2, label="x=",type=SR), \         y=input_box(u*v+cos(u*v), label="y=",type=SR), \         t_val=slider(0,10,0.2,6, label="Length of curves"), \         u_percent=slider(0,1,0.05,label="u", default=.7),         v_percent=slider(0,1,0.05,label="v", default=.7),         u_range=input_box(range(-5,5,1), label="u lines"),         v_range=input_box(range(-5,5,1), label="v lines")):     thickness=4     u_val = min(u_range)+(max(u_range)-min(u_range))*u_percent     v_val = min(v_range)+(max(v_range)-min(v_range))*v_percent     t_min = -t_val     t_max = t_val     g1=sum([parametric_plot((i,v), t_min,t_max, rgbcolor=(1,0,0)) for i in u_range])     g2=sum([parametric_plot((u,i), t_min,t_max, rgbcolor=(0,0,1)) for i in v_range])     vline_straight=parametric_plot((u,v_val), t_min,t_max, rgbcolor=(0,0,1), linestyle='-',thickness=thickness)     uline_straight=parametric_plot((u_val, v), t_min,t_max,rgbcolor=(1,0,0), linestyle='-',thickness=thickness)     (g1+g2+vline_straight+uline_straight).save("uv_coord.png",aspect_ratio=1, figsize=[5,5], axes_labels=['$u$','$v$'])     xuv = fast_float(x,'u','v')     yuv = fast_float(y,'u','v')     xvu = fast_float(x,'v','u')     yvu = fast_float(y,'v','u')     g3=sum([parametric_plot((partial(xuv,i),partial(yuv,i)), t_min,t_max, rgbcolor=(1,0,0)) for i in u_range])     g4=sum([parametric_plot((partial(xvu,i),partial(yvu,i)), t_min,t_max, rgbcolor=(0,0,1)) for i in v_range])     vline=parametric_plot((partial(xvu,v_val),partial(yvu,v_val)), t_min,t_max, rgbcolor=(0,0,1), linestyle='-',thickness=thickness)     uline=parametric_plot((partial(xuv,u_val),partial(yuv,u_val)), t_min,t_max,rgbcolor=(1,0,0), linestyle='-',thickness=thickness)     (g3+g4+vline+uline).save("xy_coord.png", aspect_ratio=1, figsize=[5,5], axes_labels=['$x$','$y$'])     print jsmath("x=%s, \: y=%s"%(latex(x), latex(y)))     print "
" def trans(x=input_box(x, label="x",type=SR),         y=input_box(y, label="y",type=SR),         u_percent=slider(0,1,0.05,label="u", default=.7),         v_percent=slider(0,1,0.05,label="v", default=.7),         t_val=slider(0,10,0.2,6, label="Length"),         u_range=input_box(u_range, label="u lines"),         v_range=input_box(v_range, label="v lines")):    x(u,v)=x    y(u,v)=y    u_val = min(u_range)+(max(u_range)-min(u_range))*u_percent    v_val = min(v_range)+(max(v_range)-min(v_range))*v_percent    t_min = -t_val    t_max = t_val    uvplot=sum([parametric_plot((i,v), (v,t_min,t_max), color='red',axes_labels=['u','v'],figsize=[5,5]) for i in u_range])    uvplot+=sum([parametric_plot((u,i), (u,t_min,t_max), color='blue',axes_labels=['u','v']) for i in v_range])    uvplot+=parametric_plot((u,v_val), (u,t_min,t_max), rgbcolor=(0,0,1), linestyle='-',thickness=thickness)    uvplot+=parametric_plot((u_val, v), (v,t_min,t_max),rgbcolor=(1,0,0), linestyle='-',thickness=thickness)    pt=vector([u_val,v_val])    du=vector([(t_max-t_min)*square_length,0])    dv=vector([0,(t_max-t_min)*square_length])    uvplot+=polygon([pt,pt+dv,pt+du+dv,pt+du],color='purple',alpha=0.7)    uvplot+=line([pt,pt+dv,pt+du+dv,pt+du],color='green')    T(u,v)=(x,y)    xuv = fast_float(x,'u','v')    yuv = fast_float(y,'u','v')    xvu = fast_float(x,'v','u')    yvu = fast_float(y,'v','u')    xyplot=sum([parametric_plot((partial(xuv,i),partial(yuv,i)), (v,t_min,t_max), color='red', axes_labels=['x','y'],figsize=[5,5]) for i in u_range])    xyplot+=sum([parametric_plot((partial(xvu,i),partial(yvu,i)), (u,t_min,t_max), color='blue') for i in v_range])    xyplot+=parametric_plot((partial(xuv,u_val),partial(yuv,u_val)),(v,t_min,t_max),color='red', linestyle='-',thickness=thickness)    xyplot+=parametric_plot((partial(xvu,v_val),partial(yvu,v_val)), (u,t_min,t_max), color='blue', linestyle='-',thickness=thickness)    jacobian(u,v)=abs(T.diff().det()).simplify_full()    t_vals=[0..1,step=t_val*.01]    vertices=[(x(*c),y(*c)) for c in [pt+t*dv for t in t_vals]]    vertices+=[(x(*c),y(*c)) for c in [pt+dv+t*du for t in t_vals]]    vertices+=[(x(*c),y(*c)) for c in [pt+(1-t)*dv+du for t in t_vals]]    vertices+=[(x(*c),y(*c)) for c in [pt+(1-t)*du for t in t_vals]]    xyplot+=polygon(vertices,color='purple',alpha=0.7)    xyplot+=line(vertices,color='green')    pretty_print(html("$T(u,v)=%s$"%(latex(T(u,v)))))    pretty_print(html("Jacobian: $%s$"%latex(jacobian(u,v))))    pretty_print(html("A very small region in $xy$ plane is approximately %0.4g times the size of the corresponding region in the $uv$ plane"%jacobian(u_val,v_val).n()))    show(graphics_array([uvplot,xyplot])) Line 481: Line 517: {{{ {{{#!sagecell Line 486: Line 522: dot = point((x0,f(x0)),pointsize=80,rgbcolor=(1,0,0))@interactdef _(order=(1..12)): dot = point((x0,f(x=x0)),pointsize=80,rgbcolor=(1,0,0))@interactdef _(order=[1..12]): Line 491: Line 527: html('$f(x)\;=\;%s$'%latex(f))    html('$\hat{f}(x;%s)\;=\;%s+\mathcal{O}(x^{%s})$'%(x0,latex(ft),order+1)) pretty_print(html(r'$f(x)\;=\;%s$'%latex(f)))    pretty_print(html(r'$\hat{f}(x;%s)\;=\;%s+\mathcal{O}(x^{%s})$'%(x0,latex(ft),order+1))) Line 504: Line 540: {{{html("

Limits: ε-δ

")html("This allows you to estimate which values of δ guarantee that f is within ε units of a limit.")html("
• Modify the value of f to choose a function.
• ")html("
• Modify the value of a to change the x-value where the limit is being estimated.
• ")html("
• Modify the value of L to change your guess of the limit.
• ")html("
• Modify the values of δ and ε to modify the rectangle.
")html("If the blue curve passes through the pink boxes, your values for δ and/or ε are probably wrong.")@interactdef delta_epsilon(f = input_box(default=(x^2-x)/(x-1)), a=input_box(default=1), L = input_box(default=1), delta=input_box(label="δ",default=0.1), epsilon=input_box(label="ε",default=0.1), xm=input_box(label="xmin",default=-1), xM=input_box(label="xmax",default=4)): {{{#!sagecellpretty_print(html("

Limits: ε-δ

"))pretty_print(html("This allows you to estimate which values of δ guarantee that f is within ε units of a limit."))pretty_print(html("
• Modify the value of f to choose a function.
• "))pretty_print(html("
• Modify the value of a to change the x-value where the limit is being estimated.
• "))pretty_print(html("
• Modify the value of L to change your guess of the limit.
• "))pretty_print(html("
• Modify the values of δ and ε to modify the rectangle.
"))pretty_print(html("If the blue curve passes through the pink boxes, your values for δ and/or ε are probably wrong."))@interactdef delta_epsilon(f = input_box(default=(x^2-x)/(x-1), label="$f$"), a=input_box(default=1, label="$a$"), L = input_box(default=1, label="$L$"), delta=input_box(label=r"$\delta$",default=0.1), epsilon=input_box(label=r"$\varepsilon$",default=0.1), xm=input_box(label=r"$x_{min}$",default=-1), xM=input_box(label=r"$x_{max}$",default=4)): Line 531: Line 567: {{{ {{{#!sagecell Line 535: Line 571: html('

A graphical illustration of $\lim_{x -> 0} \sin(x)/x =1$

')    html('Below is the unit circle, so the length of the red line is |sin(x)|')    html('and the length of the blue line is |tan(x)| where x is the length of the arc.')     html('From the picture, we see that |sin(x)| $\le$ |x| $\le$ |tan(x)|.')    html('It follows easily from this that cos(x) $\le$ sin(x)/x $\le$ 1 when x is near 0.')    html('As $\lim_{x ->0} \cos(x) =1$, we conclude that $\lim_{x -> 0} \sin(x)/x =1$.') pretty_print(html(r'

A graphical illustration of $\lim_{x -> 0} \sin(x)/x =1$

'))    pretty_print(html(r'Below is the unit circle, so the length of the red line is |sin(x)|'))    pretty_print(html(r'and the length of the blue line is |tan(x)| where x is the length of the arc.'))    pretty_print(html(r'From the picture, we see that |sin(x)| $\le$ |x| $\le$ |tan(x)|.'))    pretty_print(html(r'It follows easily from this that cos(x) $\le$ sin(x)/x $\le$ 1 when x is near 0.'))    pretty_print(html(r'As $\lim_{x ->0} \cos(x) =1$, we conclude that $\lim_{x -> 0} \sin(x)/x =1$.')) Line 555: Line 591: == Quadric Surface Plotter ==by Marshall Hampton. This is pretty simple, so I encourage people to spruce it up. In particular, it isn't set up to show all possible types of quadrics.{{{#!sagecellvar('x,y,z')quadrics = {'Ellipsoid':x^2+y^2+z^2-1,'Elliptic paraboloid':x^2+y^2-z,'Hyperbolic paraboloid':x^2-y^2-z, '1-Sheeted Hyperboloid':x^2+y^2-z^2-1,'2-Sheeted Hyperboloid':x^2-y^2-z^2-1, 'Cone':x^2+y^2-z^2}@interactdef quads(q = selector(list(quadrics)), a = slider(0,5,1/2,default = 1)):    f = quadrics[q].subs({x:x*a^(1/2)})    if a==0 or q=='Cone': pretty_print(latex(f), " (degenerate)")    else: pretty_print(latex(f))    p = implicit_plot3d(f,(x,-2,2),(y,-2,2),(z,-2,2), plot_points = 75)    show(p)}}}{{attachment:quadrics.png}} Line 557: Line 608: {{{ {{{#!sagecell Line 576: Line 627: sin,cos = math.sin,math.cos html("

The midpoint rule for a function of two variables

") pretty_print(html(r"

The midpoint rule for a function of two variables

")) Line 582: Line 633: dely = (y_end - y_start)/nx dely = (y_end - y_start)/ny Line 592: Line 643: html("$$\int_{"+str(R16(y_start))+"}^{"+str(R16(y_end))+"} "+ "\int_{"+str(R16(x_start))+"}^{"+str(R16(x_end))+"} "+func+"\ dx \ dy$$")    html('

Numerical approximation: ' + str(num_approx)+'

') pretty_print(html(r"$\int_{"+str(R16(y_start))+r"}^{"+str(R16(y_end))+r"} "+ r"\int_{"+str(R16(x_start))+r"}^{"+str(R16(x_end))+r"} "+latex(SR(func))+r"\ dx \ dy$"))    pretty_print(html(r'

Numerical approximation: ' + str(num_approx)+r'

')) Line 603: Line 654: {{{from scipy.special.orthogonal import p_roots {{{#!sagecellimport scipyimport numpyfrom scipy.special.orthogonal import p_roots, t_roots, u_roots Line 607: Line 660: from numpy import linspace from numpy import linspace, asanyarray, diff Line 613: Line 666: 'Chebyshev': {'w': 1/sqrt(1-x**2), 'xmin': -1, 'xmax': 1, 'func': t_roots},                'Chebyshev2': {'w': sqrt(1-x**2), 'xmin': -1, 'xmax': 1, 'func': u_roots},                'Trapezoid': {'w': 1, 'xmin': -1, 'xmax': 1, 'func': lambda n: (linspace(-1r,1,n), numpy.array([1.0r]+[2.0r]*(n-2)+[1.0r])*1.0r/n)},                'Simpson': {'w': 1, 'xmin': -1, 'xmax': 1, 'func': lambda n: (linspace(-1r,1,n), numpy.array([1.0r]+[4.0r,2.0r]*int((n-3.0r)/2.0r)+[4.0r,1.0r])*2.0r/(3.0r*n))}} 'Chebyshev': {'w': 1/sqrt(1-x**2), 'xmin': -1, 'xmax': 1, 'func': t_roots},     'Chebyshev2': {'w': sqrt(1-x**2), 'xmin': -1, 'xmax': 1, 'func': u_roots},     'Trapezoid': {'w': 1, 'xmin': -1, 'xmax': 1,          'func': lambda n: (linspace(-1r,1,n), numpy.array([1.0r]+[2.0r]*(n-2)+[1.0r])*1.0r/n)},     'Simpson': {'w': 1, 'xmin': -1, 'xmax': 1,          'func': lambda n: (linspace(-1r,1,n),             numpy.array([1.0r]+[4.0r,2.0r]*int((n-3.0r)/2.0r)+[4.0r,1.0r])*2.0r/(3.0r*n))}} Line 620: Line 676: return polygon([(center-width2,0),(center+width2,0),(center+width2,height),(center-width2,height)],**kwds) return polygon([(center-width2,0),        (center+width2,0),(center+width2,height),(center-width2,height)],**kwds) Line 624: Line 681: def weights(n=slider(1,30,1,default=10),f=input_box(default=3*x+cos(10*x)),show_method=["Legendre", "Chebyshev", "Chebyshev2", "Trapezoid","Simpson"]): def weights(n=slider(1,30,1,default=10),f=input_box(default=3*x+cos(10*x),type=SR),    show_method=["Legendre", "Chebyshev", "Chebyshev2", "Trapezoid","Simpson"]): Line 633: Line 691: scaled_ff = fast_float(scaled_func) scaled_ff = fast_float(scaled_func, 'x') Line 641: Line 699: stems = sum(line([(x,0),(x,scaled_ff(x))],rgbcolor=(1-y,1-y,1-y),thickness=2,markersize=6,alpha=y) for x,y in coords_scaled)    points = sum([point([(x,0),(x,scaled_ff(x))],rgbcolor='black',pointsize=30) for x,_ in coords]) stems = sum(line([(x,0),(x,scaled_ff(x))],rgbcolor=(1-y,1-y,1-y),        thickness=2,markersize=6,alpha=y) for x,y in coords_scaled)    points = sum([point([(x,0),        (x,scaled_ff(x))],rgbcolor='black',pointsize=30) for x,_ in coords]) Line 647: Line 707: show(graph,xmin=plot_min,xmax=plot_max) show(graph,xmin=plot_min,xmax=plot_max,aspect_ratio="auto") Line 652: Line 712: y_val = map(scaled_ff,x_val) y_val = [*map(scaled_ff,x_val)] Line 655: Line 715: html("$$\sum_{i=1}^{i=%s}w_i\left(%s\\right)= %s\\approx %s =\int_{-1}^{1}%s \,dx$$"%(n,latex(f.subs(x="x_i")), approximation, integral, latex(scaled_func))) pretty_print(html(r"$$\sum_{i=1}^{i=%s}w_i\left(%s\right)= %s\approx %s =\int_{-1}^{1}%s \,dx$$"%(n,        latex(f), approximation, integral, latex(scaled_func)))) Line 657: Line 718: print "Trapezoid: %s, Simpson: %s, \nMethod: %s, Real: %s"%tuple(error_data) print("Trapezoid: %s, Simpson: %s, \nMethod: %s, Real: %s" % tuple(error_data)) Line 668: Line 729: {{{ {{{#!sagecell Line 695: Line 756: path = parametric_plot( position(t).list(), (t, start, stop), color = "black" ) path = parametric_plot( position.list(), (t, start, stop), color = "black" ) Line 699: Line 760: velocity = derivative( position(t) )acceleration = derivative(velocity(t)) velocity = derivative(position, t)acceleration = derivative(velocity, t) Line 702: Line 763: speed_deriv = derivative(speed) speed_deriv = derivative(speed, t) Line 704: Line 765: dT = derivative(tangent(t)) dT = derivative(tangent, t) Line 725: Line 786: pos_tzero = position(t0) pos_tzero = position(t=t0) Line 729: Line 790: speed_component = speed(t0)    tangent_component = speed_deriv(t0)    normal_component = sqrt( acceleration(t0).norm()^2 - tangent_component^2 ) speed_component = speed(t=t0)    tangent_component = speed_deriv(t=t0)    normal_component = sqrt( acceleration(t=t0).norm()^2 - tangent_component^2 ) Line 737: Line 798: tan = arrow(pos_tzero, pos_tzero + tangent(t0), rgbcolor=(0,1,0) )    vel = arrow(pos_tzero, pos_tzero + velocity(t0), rgbcolor=(0,0.5,0))    nor = arrow(pos_tzero, pos_tzero + normal(t0), rgbcolor=(0.5,0,0))    acc = arrow(pos_tzero, pos_tzero + acceleration(t0), rgbcolor=(1,0,1))    tancomp = arrow(pos_tzero, pos_tzero + tangent_component*tangent(t0), rgbcolor=(1,0,1) )    norcomp = arrow(pos_tzero, pos_tzero + normal_component*normal(t0), rgbcolor=(1,0,1)) tan = arrow(pos_tzero, pos_tzero + tangent(t=t0), rgbcolor=(0,1,0) )    vel = arrow(pos_tzero, pos_tzero + velocity(t=t0), rgbcolor=(0,0.5,0))    nor = arrow(pos_tzero, pos_tzero + normal(t=t0), rgbcolor=(0.5,0,0))    acc = arrow(pos_tzero, pos_tzero + acceleration(t=t0), rgbcolor=(1,0,1))    tancomp = arrow(pos_tzero, pos_tzero + tangent_component*tangent(t=t0), rgbcolor=(1,0,1) )    norcomp = arrow(pos_tzero, pos_tzero + normal_component*normal(t=t0), rgbcolor=(1,0,1)) Line 764: Line 825: print "Position vector defined as r(t)=", position(t)    print "Speed is ", N(speed(t0))    print "Curvature is ", N(curvature) print("Position vector defined as r(t)={}".format(position))    print("Speed is {}".format(N(speed(t=t0))))    print("Curvature is {}".format(N(curvature))) Line 780: Line 841: {{{ {{{#!sagecell Line 796: Line 857: assume(t, 'real') Line 813: Line 875: path = parametric_plot3d( position(t).list(), (t, start, stop), color = "black" ) path = parametric_plot3d( position.list(), (t, start, stop), color = "black" ) Line 817: Line 879: velocity = derivative( position(t) )acceleration = derivative(velocity(t)) velocity = derivative( position, t)acceleration = derivative(velocity, t) Line 820: Line 882: speed_deriv = derivative(speed) speed_deriv = derivative(speed, t) Line 822: Line 884: dT = derivative(tangent(t)) dT = derivative(tangent, t) Line 825: Line 887: ## dB = derivative(binormal(t)) ## dB = derivative(binormal, t) Line 846: Line 908: pos_tzero = position(t0) pos_tzero = position(t=t0) Line 850: Line 912: speed_component = speed(t0)    tangent_component = speed_deriv(t0)    normal_component = sqrt( acceleration(t0).norm()^2 - tangent_component^2 ) speed_component = speed(t=t0)    tangent_component = speed_deriv(t=t0)    normal_component = sqrt( acceleration(t=t0).norm()^2 - tangent_component^2 ) Line 859: Line 921: tan = arrow3d(pos_tzero, pos_tzero + tangent(t0), rgbcolor=(0,1,0) )    vel = arrow3d(pos_tzero, pos_tzero + velocity(t0), rgbcolor=(0,0.5,0))    nor = arrow3d(pos_tzero, pos_tzero + normal(t0), rgbcolor=(0.5,0,0))    bin = arrow3d(pos_tzero, pos_tzero + binormal(t0), rgbcolor=(0,0,0.5))    acc = arrow3d(pos_tzero, pos_tzero + acceleration(t0), rgbcolor=(1,0,1))    tancomp = arrow3d(pos_tzero, pos_tzero + tangent_component*tangent(t0), rgbcolor=(1,0,1) )    norcomp = arrow3d(pos_tzero, pos_tzero + normal_component*normal(t0), rgbcolor=(1,0,1)) tan = arrow3d(pos_tzero, pos_tzero + tangent(t=t0), rgbcolor=(0,1,0) )    vel = arrow3d(pos_tzero, pos_tzero + velocity(t=t0), rgbcolor=(0,0.5,0))    nor = arrow3d(pos_tzero, pos_tzero + normal(t=t0), rgbcolor=(0.5,0,0))    bin = arrow3d(pos_tzero, pos_tzero + binormal(t=t0), rgbcolor=(0,0,0.5))    acc = arrow3d(pos_tzero, pos_tzero + acceleration(t=t0), rgbcolor=(1,0,1))    tancomp = arrow3d(pos_tzero, pos_tzero + tangent_component*tangent(t=t0), rgbcolor=(1,0,1) )    norcomp = arrow3d(pos_tzero, pos_tzero + normal_component*normal(t=t0), rgbcolor=(1,0,1)) Line 889: Line 951: print "Position vector: r(t)=", position(t)    print "Speed is ", N(speed(t0))    print "Curvature is ", N(curvature)    ## print "Torsion is ", N(torsion)    print    print "Right-click on graphic to zoom to 400%"    print "Drag graphic to rotate" print("Position vector: r(t)=", position)    print("Speed is ", N(speed(t=t0)))    print("Curvature is ", N(curvature))    ## print("Torsion is ", N(torsion))    print()    print("Right-click on graphic to zoom to 400%")    print("Drag graphic to rotate") Line 903: Line 965: == Multivariate Limits by Definition ==by John Travishttp://sagenb.mc.edu/home/pub/97/{{{#!sagecell## An interactive way to demonstrate limits of multivariate functions of the form z = f(x,y)#### John Travis## Mississippi College## ## Spring 2011### Starting point for radius values before collapsing in as R approaches 0.# Functions ought to be "reasonable" within a circular domain of radius R surrounding # the desired (x_0,y_0).var('x,y,z')Rmin=1/10Rmax=2@interact(layout=dict(top=[['f'],['x0'],['y0']], bottom=[['in_3d','curves','R','graphjmol']]))def _(f=input_box((x^2-y^2)/(x^2+y^2),width=30,label='$f(x)$'),        R=slider(Rmin,Rmax,1/10,Rmax,label=',   $R$'),        x0=input_box(0,width=10,label='$x_0$'),        y0=input_box(0,width=10,label='$y_0$'),        curves=checkbox(default=false,label='Show curves'),        in_3d=checkbox(default=false,label='3D'),        graphjmol=checkbox(default=true,label='Interactive graph')):    if graphjmol:        view_method = 'jmol'    else:        view_method = 'tachyon'# converting f to cylindrical coordinates.     g(r,t) = f(x=r*cos(t)+x0,y=r*sin(t)+y0)# Sage graphing transformation used to see the original surface.    cylinder = (r*cos(t)+x0,r*sin(t)+y0,z)    surface = plot3d(g,(t,0,2*pi),(r,1/100,Rmax),transformation=cylinder,opacity=0.2)    # Regraph the surface for smaller and smaller radii controlled by the slider.    collapsing_surface = plot3d(g,(t,0,2*pi),(r,1/100,R),transformation=cylinder,rgbcolor=(0,1,0))        G = surface+collapsing_surface    pretty_print(html('Enter $(x_0 ,y_0 )$ above and see what happens as $R \\rightarrow 0$.'))    pretty_print(html('The surface has a limit as $(x,y) \\rightarrow$ ('+str(x0)+','+str(y0)+') if the green region collapses to a point.'))# If checked, add a couple of curves on the surface corresponding to limit as x->x0 for y=x^(3/5),# and as y->y0 for x=y^(3/5). Should make this more robust but perhaps using # these relatively obtuse curves could eliminate problems.    if curves:        curve_x = parametric_plot3d([x0-t,y0-t^(3/5),f(x=x0-t,y=y0-t^(3/5))],(t,Rmin,Rmax),color='red',thickness=10)        curve_y = parametric_plot3d([x0+t^(3/5),y0+t,f(x=x0+t^(3/5),y=y0+t)],(t,Rmin,Rmax),color='red',thickness=10)        R2 = Rmin/4        G += arrow((x0-Rmin,y0-Rmin^(3/5),f(x=x0-Rmin,y=y0-Rmin^(3/5))),(x0-R2,y0-R2^(3/5),f(x=x0-R2,y=y0-R2^(3/5))),size=30 )        G += arrow((x0+Rmin^(3/5),y0+Rmin,f(x=x0+Rmin^(3/5),y=y0+Rmin)),(x0+R2^(3/5),y0+R2,f(x=x0+R2^(3/5),y=y0+R2)),size=30 )         limit_x = limit(f(x=x0-t,y=y0-t^(3/5)),t=0)        limit_y = limit(f(x=x0+t^(3/5),y=y0+t),t=0)        text_x = text3d(limit_x,(x0,y0,limit_x))        text_y = text3d(limit_y,(x0,y0,limit_y))        G += curve_x+curve_y+text_x+text_y              pretty_print(html('The red curves represent a couple of trajectories on the surface. If they do not meet, then'))        pretty_print(html('there is also no limit. (If computer hangs up, likely the computer can not do these limits.)'))        pretty_print(html(r'
$\lim_{(x,?)\rightarrow(x_0,y_0)} f(x,y) =%s$'%str(limit_x)+r' and $\lim_{(?,y)\rightarrow(x_0,y_0)} f(x,y) =%s$
'%str(limit_y)))            if in_3d:        show(G,stereo="redcyan",viewer=view_method)    else:        show(G,perspective_depth=true,viewer=view_method)}}}{{attachment:3D_Limit_Defn.png}}{{{#!sagecell## An interactive way to demonstrate limits of multivariate functions of the form z = f(x,y)## This one uses contour plots and so will work with functions that have asymptotic behavior.#### John Travis## Mississippi College## ## Spring 2011### An increasing number of contours for z = f(x,y) are utilized surrounding a desired (x_0,y_0).# A limit can be shown to exist at (x_0,y_0) provided the point stays trapped between adjacent # contour lines as the number of lines increases. If the contours change wildly near the point,# then a limit does not exist.# Looking for two different paths to approach (x_0,y_0) that utilize a different selection of colors# will help locate paths to use that exhibit the absence of a limit.var('x,y,z,u')@interact(layout=dict(top=[['f'],['x0'],['y0']], bottom=[['N'],['R']]))def _(f=input_box(default=(x*y^2)/(x^2+y^4),width=30,label='$f(x)$'),        N=slider(5,100,1,10,label='Number of Contours'),        R=slider(0.1,1,0.01,1,label='Radius of circular neighborhood'),        x0=input_box(0,width=10,label='$x_0$'),        y0=input_box(0,width=10,label='$y_0$')):    pretty_print(html(r'Enter $(x_0 ,y_0 )$ above and see what happens as the number of contour levels $\rightarrow \infty$.'))    pretty_print(html('A surface will have a limit in the center of this graph provided there is not a sudden change in color there.'))# Need to make certain the min and max contour lines are not huge due to asymptotes. If so, clip and start contours at some reasonable# values so that there are a nice collection of contours to show around the desired point.    surface = contour_plot(f,(x,x0-1,x0+1),(y,y0-1,y0+1),cmap=True,colorbar=True,fill=False,contours=N)    surface += parametric_plot([R*cos(u),R*sin(u)],[0,2*pi],color='black')# Nice to use if f=x*y^2/(x^2 + y^4) # var('u')# surface += parametric_plot([u^2,u],[u,-1,1],color='black')     limit_point = point((x0,y0),color='red',size=30)# show(limit_point+surface)    show(surface)}}}{{attachment:3D_Limit_Defn_Contours.png}} Line 907: Line 1092: {{{ {{{#!sagecell Line 960: Line 1145: {{{%hide%auto {{{#!sagecell Line 977: Line 1160: html(r'Function $f(x,y)=%s$ '%latex(f(x,y))) pretty_print(html(r'Function $f(x,y)=%s$ '%latex(f(x,y)))) Line 991: Line 1174: html(r'
$\quad f(%s,%s)\quad $$\quad %s \quad f(%s,%s)\quad$$\quad %s$
\              '%(latex(x0),latex(y0),z0.n())) pretty_print(html(r'\              '%(latex(x0),latex(y0),z0.n()))) Line 1021: Line 1204: {{{ {{{#!sagecell Line 1025: Line 1208: html('Points x0 and y0 are values where the exact value of the function \ pretty_print(html('Points x0 and y0 are values where the exact value of the function \ Line 1027: Line 1210: and approximation by differential at shifted point are compared.') and approximation by differential at shifted point are compared.')) Line 1045: Line 1228: html(r'Function $f(x,y)=%s \approx %s$ '%(latex(f(x,y)),latex(tangent(x,y))))  html(r' $f %s = %s$'%(latex((x0,y0)),latex(exact_value_ori)))  html(r'Shifted point $%s$'%latex(((x0+deltax),(y0+deltay))))  html(r'Value of the function in shifted point is $%s$'%f(x0+deltax,y0+deltay))  html(r'Value on the tangent plane in shifted point is $%s$'%latex(approx_value))  html(r'Error is $%s$'%latex(abs_error)) pretty_print(html(r'Function $f(x,y)=%s \approx %s$ '%(latex(f(x,y)),latex(tangent(x,y)))))  pretty_print(html(r' $f %s = %s$'%(latex((x0,y0)),latex(exact_value_ori))))  pretty_print(html(r'Shifted point $%s$'%latex(((x0+deltax),(y0+deltay)))))  pretty_print(html(r'Value of the function in shifted point is $%s$'%f(x0+deltax,y0+deltay)))  pretty_print(html(r'Value on the tangent plane in shifted point is $%s$'%latex(approx_value)))  pretty_print(html(r'Error is $%s$'%latex(abs_error))) Line 1059: Line 1242: {{{ {{{#!sagecell Line 1061: Line 1244: var('xx yy', ns=1) var('xx yy') Line 1068: Line 1251: order=(1..10)): order=[1..10]): Line 1087: Line 1270: html('$F(x,y) = e^{-(x^2+y^2)/2} \\cos(y) \\sin(x^2+y^2)$') pretty_print(html('$F(x,y) = e^{-(x^2+y^2)/2} \\cos(y) \\sin(x^2+y^2)$')) Line 1091: Line 1274: == Volumes over non-rectangular domains ==by John Travishttps://cloud.sagemath.com/projects/19575ea0-317e-402b-be57-368d04c113db/files/pub/2801-2901/2829.sagews{{{#!sagecell## Graphing surfaces over non-rectangular domains ## John Travis## Spring 2011###### An updated version of this worksheet may be available at http://sagenb.mc.edu#### Interact allows the user to input up to two inequality constraints on the## domain when dealing with functional surfaces#### User inputs:## f = "top" surface with z = f(x,y)## g = "bottom" surface with z = g(x,y)## condition1 = a single boundary constraint. It should not include && or | to join two conditions.## condition2 = another boundary constraint. If there is only one constraint, just enter something true## or even just an x (or y) in the entry blank.#### var('x,y')# f is the top surface# g is the bottom surfaceglobal f,g# condition1 and condition2 are the inequality constraints. It would be nice# to have any number of conditions connected by  or | global condition1,condition2@interactdef _(f=input_box(default=(1/3)*x^2 + (1/4)*y^2 + 5,label='$f(x)=$'),        g=input_box(default=-1*x+0*y,label='$g(x)=$'),        condition1=input_box(default= x^2+y^2<8,label='$Constraint_1=$'),        condition2=input_box(default=yLateral Surface Area = $%s$ '%latex(line_integral))    line_integral_approx = numerical_integral(A,a,b)[0]    pretty_print(html(r'Lateral Surface $\approx$ %s'%str(line_integral_approx)))# Plot the top function z = f(x,y) that is being integrated.    G = plot3d(f,(x,xx[0],xx[1]),(y,yy[0],yy[1]),opacity=0.2)    G += plot3d(g,(x,xx[0],xx[1]),(y,yy[0],yy[1]),opacity=0.2)# Add space curves on the surfaces "above" the domain curve (u(t),v(t))     G += parametric_plot3d([u,v,g(x=u,y=v)],(t,a,b),thickness=2,color='red')    G += parametric_plot3d([u,v,f(x=u,y=v)],(t,a,b),thickness=2,color='red')    k=0    if smoother:        delw = 0.025        lat_thick = 3    else:        delw = 0.10        lat_thick = 10    for w in (a,a+delw,..,b):        G += parametric_plot3d([u(t=w),v(t=w),s*f(x=u(t=w),y=v(t=w))+(1-s)*g(x=u(t=w),y=v(t=w))],(s,0,1),thickness=lat_thick,color='yellow',opacity=0.9)            if in_3d:        show(G,stereo='redcyan',spin=true)    else:        show(G,perspective_depth=true,spin=true)}}}{{attachment:Lateral_Surface.png}}== Parametric surface example ==by Marshall HamptonNote that this works in Sage cell, but causes a zip file error in Jupyter.{{{#!sagecellvar('u,v')npi = RDF(pi)@interactdef viewer(mesh = checkbox(default = False, label = 'Show u,v meshlines'), uc = slider(-2,2,1/10,0, label = 'Constant u value'), vc = slider(-2,2,1/10,0, label = 'Constant v value'), functions = input_box([u,v^2,u^2+v])):    f1(u,v) = functions[0]    f2(u,v) = functions[1]    f3(u,v) = functions[2]    surface_plot = parametric_plot3d([f1,f2,f3], (u,-2,2), (v,-2,2), mesh = mesh, opacity = .8)    constant_u = line3d([[f1(uc,q), f2(uc,q), f3(uc,q)] for q in srange(-2,2,.01)], rgbcolor = (1,0,0), thickness = 3)    constant_v = line3d([[f1(q,vc), f2(q,vc), f3(q,vc)] for q in srange(-2,2,.01)], rgbcolor = (0,1,0), thickness = 3)    show(surface_plot + constant_u + constant_v, frame = False)}}}{{attachment:parametric_surface.png}}== Line Integrals in 3D Vector Field ==by John Travishttps://cloud.sagemath.com/projects/19575ea0-317e-402b-be57-368d04c113db/files/pub/2801-2901/2827-$%20%5Cint_%7BC%7D%20%5Cleft%20%5Clangle%20M,N,P%20%5Cright%20%5Crangle%20dr%20$%20=%20$%20%25s%20$.sagews{{{#!sagecell## This worksheet interactively computes and displays the line integral of a 3D vector field ## over a given smooth curve C## ## John Travis## Mississippi College## 06/16/11#### An updated version of this worksheet may be available at http://sagenb.mc.edu##var('x,y,z,t,s')@interactdef _(M=input_box(default=x*y*z,label="$M(x,y,z)$"),        N=input_box(default=-y*z,label="$N(x,y,z)$"),        P=input_box(default=z*y,label="$P(x,y,z)$"),        u=input_box(default=cos(t),label="$x=u(t)$"),        v=input_box(default=2*sin(t),label="$y=v(t)$"),        w=input_box(default=t*(t-2*pi)/pi,label="$z=w(t)$"),        tt = range_slider(-2*pi, 2*pi, pi/6, default=(0,2*pi), label='t Range'),        xx = range_slider(-5, 5, 1, default=(-1,1), label='x Range'),        yy = range_slider(-5, 5, 1, default=(-2,2), label='y Range'),        zz = range_slider(-5, 5, 1, default=(-3,1), label='z Range'),        in_3d=checkbox(true)):# setup the parts and then compute the line integral    u(t) = u    v(t) = v    w(t) = w    dr = [derivative(u(t),t),derivative(v(t),t),derivative(w(t),t)]    A = (M(x=u(t),y=v(t),z=w(t))*dr[0]        +N(x=u(t),y=v(t),z=w(t))*dr[1]        +P(x=u(t),y=v(t),z=w(t))*dr[2])    global line_integral    line_integral = integral(A(t=t),t,tt[0],tt[1])        pretty_print(html(r'

$\int_{C} \left \langle M,N,P \right \rangle dr$ = $%s$

'%latex(line_integral)))    G = plot_vector_field3d((M,N,P),(x,xx[0],xx[1]),(y,yy[0],yy[1]),(z,zz[0],zz[1]),plot_points=6)    G += parametric_plot3d([u,v,w],(t,tt[0],tt[1]),thickness='5',color='yellow')    if in_3d:        show(G,stereo='redcyan',spin=true)    else:        show(G,perspective_depth=true)}}}{{attachment:3D_Line_Integral.png}}

# Sage Interactions - Calculus

by William Stein

## Newton's Method

Note that there is a more complicated Newton's method below.

by William Stein

by William Stein

## A simple tangent line grapher

by Marshall Hampton

## Numerical integrals with the midpoint rule

by Marshall Hampton

## Numerical integrals with various rules

by Nick Alexander (based on the work of Marshall Hampton)

## Some polar parametric curves

by Marshall Hampton. This is not very general, but could be modified to show other families of polar curves.

## Function tool

Enter symbolic functions f, g, and a, a range, then click the appropriate button to compute and plot some combination of f, g, and a along with f and g. This is inspired by the Matlab funtool GUI.

## Newton-Raphson Root Finding

by Neal Holtz

This allows user to display the Newton-Raphson procedure one step at a time. It uses the heuristic that, if any of the values of the controls change, then the procedure should be re-started, else it should be continued.

by Jason Grout

## Taylor Series

by Harald Schilly

## Illustration of the precise definition of a limit

by John Perry

I'll break tradition and put the image first. Apologies if this is Not A Good Thing.

## A graphical illustration of sin(x)/x -> 1 as x-> 0

by Wai Yan Pong

by Marshall Hampton. This is pretty simple, so I encourage people to spruce it up. In particular, it isn't set up to show all possible types of quadrics.

## The midpoint rule for numerically integrating a function of two variables

by Marshall Hampton

by Jason Grout

The output shows the points evaluated using Gaussian quadrature (using a weight of 1, so using Legendre polynomials). The vertical bars are shaded to represent the relative weights of the points (darker = more weight). The error in the trapezoid, Simpson, and quadrature methods is both printed out and compared through a bar graph. The "Real" error is the error returned from scipy on the definite integral.

## Vector Calculus, 2-D Motion

By Rob Beezer

A fast_float() version is available in a worksheet

## Vector Calculus, 3-D Motion

by Rob Beezer

Available as a worksheet

by John Travis

## Directional Derivatives

This interact displays graphically a tangent line to a function, illustrating a directional derivative (the slope of the tangent line).

## 3D graph with points and curves

By Robert Marik

This sagelet is handy when showing local, constrained and absolute maxima and minima in two variables. Available as a worksheet

by Robert Marik

## Taylor approximations in two variables

by John Palmieri

This displays the nth order Taylor approximation, for n from 1 to 10, of the function sin(x2 + y2) cos(y) exp(-(x2+y2)/2).

by John Travis

## Lateral Surface Area

by John Travis

Note that this works in Sage cell, but causes a zip file error in Jupyter

## Parametric surface example

by Marshall Hampton

Note that this works in Sage cell, but causes a zip file error in Jupyter.

## Line Integrals in 3D Vector Field

by John Travis

interact/calculus (last edited 2020-08-11 14:10:09 by kcrisman)