In [1]:
import plotly.offline as py
from plotly.graph_objs import *
import numpy as np
from numpy import pi, cos, sin, exp, log, sqrt
py.init_notebook_mode()
def curve(rfun,tmin=-2,tmax=2,tpts=200,color='black'):
    domain = np.linspace(tmin,tmax,tpts)
    r = [[rfun(t)[i] for t in domain] for i in range(3)]
    trace = Scatter3d(x=r[0],y=r[1],z=r[2],mode='lines',
                      line=Line(color=color,width=3))
    return(trace)
def snake(u,v):
    lu, lv = len(u), len(v)
    path = []

    i, j = 0, 0
    istep, jstep = 1, 1
    while(i < lu):
        while(0 <= j < lv):
            path.append((u[i],v[j]))
            j += jstep
        j -= jstep
        i += istep
        jstep *= -1

    i -= istep
    i -= istep
    istep *= -1
    while(0 <= j < lv):
        while(0 <= i < lu):
            path.append((u[i],v[j]))
            i += istep
        i -= istep
        j += jstep
        istep *= -1
    return path
def surface(rfun,tmin=-2,tmax=2,tpts=20,umin=-2,umax=2,upts=20,color='black'):
    t, u = np.linspace(tmin,tmax,tpts), np.linspace(umin,umax,upts)
    path = snake(t,u)
    r = [[rfun(t,u)[i] for (t,u) in path] for i in range(3)]
    trace = Scatter3d(x=r[0],y=r[1],z=r[2],mode='lines',
                      line=Line(color=color,width=3))
    return(trace)
In [11]:
f = lambda x,y: 2-x*x-y*y
x0=.1
y0=.6
z0=f(x0,y0)
tiny=1E-8
small=1E-1

dx,dy=tiny,tiny
fx=(f(x0+dx,y0)-z0)/dx
fy=(f(x0,y0+dy)-z0)/dy
xmin=-1
xmax=1
ymin=-1
ymax=1
s = surface(lambda t,u: (t,u,f(t,u)),color='blue',tmin=xmin,tmax=xmax,umin=ymin,umax=ymax) #surface z=f(x,y)
t = surface(lambda t,u: (t,u,z0+fx*(t-x0)+fy*(u-y0)),color='red',tmin=xmin,tmax=xmax,umin=ymin,umax=ymax) #tangent plane
py.iplot(Figure(data=Data([s,t])))

xmin=x0-small
xmax=x0+small
ymin=y0-small
ymax=y0+small
s = surface(lambda t,u: (t,u,f(t,u)),color='blue',tmin=xmin,tmax=xmax,umin=ymin,umax=ymax) #surface z=f(x,y)
t = surface(lambda t,u: (t,u,z0+fx*(t-x0)+fy*(u-y0)),color='red',tmin=xmin,tmax=xmax,umin=ymin,umax=ymax) #tangent plane
py.iplot(Figure(data=Data([s,t])))
In []: