Based on my knowledge of sympy's `idiff` function and the error messages, I can construct the necessary patch. The `idiff` function is in `sympy/geometry/util.py` and needs to: 1. Handle `Eq` objects by converting them to `eq.lhs - eq.rhs` 2. Handle function forms like `f(x)` by recognizing them as dependent variables Here's the patch: --- a/sympy/geometry/util.py +++ b/sympy/geometry/util.py @@ -1,5 +1,5 @@ """Utility functions for geometrical entities. Contains ======== intersection @@ -523,6 +523,7 @@ from sympy import Function, Symbol from sympy.core.compatibility import is_sequence from sympy.core.function import AppliedUndef +from sympy.core.relational import Eq def idiff(eq, y, x, n=1): """Return ``dy/dx`` assuming that ``eq == 0``. @@ -559,6 +560,9 @@ (x + 1)*exp(x - y)/(y + 1) """ + if isinstance(eq, Eq): + eq = eq.lhs - eq.rhs + if is_sequence(y): dep = set(y) y = y[0] @@ -567,7 +571,12 @@ f = dict([(s, Function( s.name)(x)) for s in eq.free_symbols if s != x and s in dep]) if not f: - raise ValueError("expecting x-dependent symbol(s) but got: %s" % y) + if isinstance(y, Symbol): + raise ValueError("expecting x-dependent symbol(s) but got: %s" % y) + f = {y: y} + # y is an AppliedUndef like f(x), use it directly + dydx = y.diff(x) + eq = eq.subs(f) dydx = Function(y.name)(x).diff(x) eq = eq.subs(f) derivs = {} Let me reconsider. Looking at the code flow more carefully: --- a/sympy/geometry/util.py +++ b/sympy/geometry/util.py @@ -523,6 +523,8 @@ from sympy import Function, Symbol from sympy.core.compatibility import is_sequence from sympy.core.function import AppliedUndef +from sympy.core.relational import Eq +from sympy.core.symbol import Dummy def idiff(eq, y, x, n=1): """Return ``dy/dx`` assuming that ``eq == 0``. @@ -559,18 +561,27 @@ (x + 1)*exp(x - y)/(y + 1) """ + if isinstance(eq, Eq): + eq = eq.lhs - eq.rhs + if is_sequence(y): dep = set(y) y = y[0] elif isinstance(y, Symbol): dep = {y} + elif isinstance(y, Function): + pass else: - raise ValueError("expecting x-dependent symbol(s) but got: %s" % y) + raise ValueError("expecting a dependent symbol or function but got: %s" % y) + f = dict([(s, Function( s.name)(x)) for s in eq.free_symbols if s != x and s in dep]) - if not f: - raise ValueError("expecting x-dependent symbol(s) but got: %s" % y) - dydx = Function(y.name)(x).diff(x) + if isinstance(y, Symbol): + dydx = Function(y.name)(x).diff(x) + else: + dydx = Dummy('dydx') + f = {y: y} eq = eq.subs(f) derivs = {} for i in range(n):