1 | initial version |
Building on @Emmanuel_Charpentier's comment, the closest thing you can do to use the chain rule with unspecified differential forms is something like
sage: E.<x,y> = EuclideanSpace()
sage: z = E.scalar_field(function('Z')(x,y), name='z')
sage: z.display()
z: E^2 --> R
(x, y) |--> Z(x, y)
sage: diff(z)
1-form dz on the Euclidean plane E^2
sage: diff(z).display()
dz = d(Z)/dx dx + d(Z)/dy dy
sage: diff(1/z)
1-form d1/z on the Euclidean plane E^2
sage: diff(1/z).display()
d1/z = -d(Z)/dx/Z(x, y)^2 dx - d(Z)/dy/Z(x, y)^2 dy
sage: diff(1/z) == -1/z^2 * diff(z)
True
sage: diff(z).wedge(diff(1/z))
2-form dz/\d1/z on the Euclidean plane E^2
sage: diff(z).wedge(diff(1/z)).display()
dz/\d1/z = 0
But as you can see, all computations use the underlying coordinates (x,y), even in assessing coordinate-free statements like in
sage: diff(1/z) == -z^(-2) * diff(z)
True