Ask Your Question

Revision history [back]

click to hide/show revision 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)                                                                 
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)