Over the weekend I was attempting to estimate the tension change in a bicycle spoke due to an applied load. After various simplifications and approximations, the problem was reduced to the following.

Given a constraint, F(x,y) = 0, and functions G(x,y) and H(x,y), find dG/dH at a particular point, here (0,0).

The constraint, F, was sufficiently complicated that solving for either variable was not feasible, so implicit differentiation seemed the best approach. Alas, I still didn't know of a way to compute the derivative. With a bit of computation I derived the rather nice formula

dG dF ^ dG

-- = -------

dH dF ^ dH

where d is the exterior derivative and ^ the exterior product. Given that, the result can be readily computed in Maple using the ?liesymm package:

with(liesymm):

setup([x,y]):

(d(F(x,y)) &^ d(G(x,y))) / (d(F(x,y)) &^ d(H(x,y)));

Engineers would probably express (and compute) this as a ratio of cross products---I don't recall such a formula, probably because electrical engineers don't deal with implicit derivatives much.

Another way to compute this in Maple, possibly more directly, is to use the ?DifferentialGeometry package. The difficulty there is that the package requires a bit of practice.

with(DifferentialGeometry):

DGsetup([x,y]):

PDEtools[declare](F(x,y),G(x,y),H(x,y)):

Now we compute the annihilator of the exterior derivative of F. This corresponds to a vector field that is tangent to the constraint.

annDF := Annihilator([ExteriorDerivative(F(x,y))])[];

Finally, use the ?LieDerivative to compute, essentially, the directional derivative of each function, in the direction of the annihilator, then form the ratio:

LieDerivative(annDF, G(x,y)) / LieDerivative(annDF, H(x,y));

**Followup**

For those not familar with the exterior calculus, see Robert Lopez's derivation of this result using standard operations. I like the exterior calculus because the computations are frequently simpler and the results easier to generalize. I found it fascinating that the result could be expressed so simply, that is, as

(1) dg/dh = (df ^ dg)/(df ^ dh)

while at the same time was annoyed at not being able to immediately visualize/comprehend this. I didn't derive (1) by doing anything clever, rather I computed the final result (see above) and realized it could be expressed more nicely as (1). To understand why (1) is correct, consider the result of applying the two-form in the numerator of the rhs of (1) to a pair of arbitrary vectors, v and w.

(2) (df ^ dg)(v,w) = df(v)*dg(w) - df(w)*dg(v) [this is, esentially, the definition of the exterior product of two one-forms]

The expression df(v) can also be expressed as v[f], where v is the differential operator corresponding to the vector v. Assume that v is tangent to the constraint f = 0. By definition, v[f] = 0. So (2) becomes

(3) (df ^ dg)(v,w) = - df(w)*dg(v) when v is tangent to f=0

Doing the same for the denominator of the rhs of (1) gives

(4) (df ^ dh)(v,w) = -df(w)*dh(v) when v is tangent to f=0.

The ratio of (3) and (4) is

(5) dg(v)/dh(v) = v[g]/v[h]

Writtten in terms of the more familar directional derivative this is

(6) Dv(g)/Dv(h), when v is tangent to f = 0

This is precisely the derivative we want. Thus we have shown that for a constraint f = 0 (more generally f = constant)

(7) dg/dh = (df ^ dg)/(dg ^ dh)

The generalization of this to higher-dimensions is straightforward. That is, in R^(n+1) with constraints f_{1}=0, ..., f_{n}=0, we have

dg/dh = (df_{1} ^ ... ^ df_{n} ^ dg) / (df_{1} ^ ... ^ df_{n} ^ dh)