The function ParametrizedSurface3d is particularly useful for teaching on differentiable surfaces, but if I am not wrong there is a problem with the computation of principal directions. They are the eigenspaces for the shape operator. The issue is that the shape operator is presented as a matrix with a left action on vectors, while the eigenvalues are computed as if it was a right action.
The following code shows the problem (it is a helicoid with a parametrization such that the first fundamental form is not diagonal):
var('u,v',domain='real')
V=vector([u*cos(u+v),u*sin(u+v),u+v])
S=ParametrizedSurface3D(V,(u,v))
dN=S.shape_operator()
U=[(i,j[0]) for i,j,k in S.principal_directions()]# A list with eigenvalues and eigenvectors.
#Check if they are eigenvalues for the left action
[(dN*j-i*j).simplify_full() for i,j in U]
Output:
[((2*u^2 - (2*u^2 + 1)*sqrt(u^2 + 1) + 1)/(u^4 + u^2), (2*u^2 + 1)/(u^2 + 1)^(3/2)),
(-(2*u^2 + (2*u^2 + 1)*sqrt(u^2 + 1) + 1)/(u^4 + u^2), (2*u^2 + 1)/(u^2 + 1)^(3/2))]
False
#Check if they are eigenvalues for the left action
[(j*dN-i*j).simplify_full() for i,j in U]
Output:
[(0, 0), (0, 0)]
True
Best, Enrique Artal.