SageMath code for animating a geometric view of partial derivatives.
Cavalcanti, R. T.
E.<x,y,z> = EuclideanSpace(3)
xy_plane = E.default_chart().plot(fixed_coords={z: 0}, color='gray',style='--',thickness=1.5, label_axes= False, number_values=4, step=5)
def gen_axis(origin=(0,0,0), size=1):
v0 = vector(origin)
vx = vector([size,0,0])
vy = vector([0,size,0])
vz = vector([0,0,size])
vectors = sum([v.plot(color='gray',frame=False,thickness=size, start=v0) for v in [vx,vy,vz]])
labels = text3d('x',1.1*(vx+v0),fontsize= str(11.5*size)+'%')
labels += text3d('y',1.1*(vy+v0),fontsize= str(11.5*size)+'%')
labels += text3d('z',1.1*vz+v0,fontsize= str(11.5*size)+'%')
return vectors+labels
axis_plane = xy_plane+gen_axis(origin=(-8,-8,0),size=12)
axis_plane
f = 1/3*x^2-1/4*y^2+4
my_colors = [colormaps.Set1(k)[:3] for k in range(5)]
def gen_graphics(pos_x,pos_y,partial_x = True):
if partial_x:
tangent = parametric_plot3d((x,pos_y,diff(f,x)(x=pos_x,y=pos_y)*(x-pos_x)+f(x=pos_x,y=pos_y)),
(x,pos_x-2,pos_x+2),color='black', thickness=3)
else:
tangent = parametric_plot3d((pos_x,y,diff(f,y)(x=pos_x,y=pos_y)*(y-pos_y)+f(x=pos_x,y=pos_y)),
(y,pos_y-2,pos_y+2),color='blue', thickness=3)
surf = plot3d(f,(-4,4),(-4,4),frame=True,mesh=True, color=my_colors[1],plot_points=30, alpha=.7)
plane_y = parametric_plot3d((pos_x,y,z+7),(y,-6,6),(z,-12,6),color=my_colors[4], alpha=.25, plot_points=2)
curve_y = parametric_plot3d((pos_x,y,f(x=pos_x)+.01),(y,-4,4),color=my_colors[4], thickness=4)
plane_x = parametric_plot3d((x,pos_y,z+7),(x,-6,6),(z,-12,6),color='gray', alpha=.5, plot_points=2)
curve_x = parametric_plot3d((x,pos_y,f(y=pos_y)+.01),(x,-4,4),color='gray', thickness=4)
point = sphere((pos_x,pos_y,f(x=pos_x,y=pos_y)),size=.2,color='red')
return surf+plane_x+plane_y+curve_x+curve_y+tangent+point+axis_plane
gen_graphics(-2,1.5)
vmin,vmax = -2,2
step = .5
path1 = [gen_graphics(k,vmin) for k in srange(vmin,vmax,step,include_endpoint=True)]
path2 = [gen_graphics(vmax,k,partial_x = False) for k in srange(vmin,vmax,step,include_endpoint=True)]
path3 = [gen_graphics(k,vmax) for k in srange(vmax,vmin,-step,include_endpoint=True)]
path4 = [gen_graphics(vmin,k,partial_x = False) for k in srange(vmax,vmin,-step,include_endpoint=True)]
frames = path1+path2+path3+path4
animate(frames).interactive()