On Mon, May 11, 2009 at 9:23 PM, Luke <hazelnu...@gmail.com> wrote: > > Would there be any reason that the following should not be implemented: > t = Symbol('t') > q1 = Function('q1')(t) > solve(q1 - 1, q1) > > Currently, the solve function gives: > --------------------------------------------------------------------------- > TypeError Traceback (most recent call last) > > /home/luke/Documents/PythonDynamics/<ipython console> in <module>() > > /var/lib/python-support/python2.6/sympy/solvers/solvers.pyc in > solve(f, *symbols, **flags) > 73 > 74 if any(not s.is_Symbol for s in symbols): > ---> 75 raise TypeError('not a Symbol') > 76 > 77 if not isinstance(f, (tuple, list, set)): > > TypeError: not a Symbol > > > In classical mechanics, the generalised coordinates are often treated > as symbols implicitly dependent upon time. Not being able to solve > for their time derivatives using solve requires tedious .subs() calls > to replace them with symbols, solve, then replace them back with > Functions.
Yes, I think this should be fixed. Could you please try to create a preliminary patch that fixes this in solve()? We'll cook it in sympy-patches for a while and get this in. > > Similarly, is there a reason we can't differentiate with respect to a > Function? For example, when using Lagrange's method for formulating > equations of motion, we need to differentiate the Lagrangian with > respect to the coordinates and with respect to the time derivatives of > the coordinates, and then take the time derivative.... Not being able > to differentiate with respect to q1.diff(t) means that one has to > create a dummy symbol for q1.diff(t), replace all occurances of it in > the Lagrangian, then take the derivative with respect to that symbol, > then back substitute to replace the symbol with the function, then > differentiate with respect to time.... a very burdensome approach > indeed. Yep, I think this was requested in the past too. Let's fix it. > This is what happens currently: > > In [12]: diff(q3-1, q3) > --------------------------------------------------------------------------- > ValueError Traceback (most recent call last) > > /home/luke/Documents/PythonDynamics/<ipython console> in <module>() > > /var/lib/python-support/python2.6/sympy/core/multidimensional.pyc in > wrapper(*args, **kwargs) > 125 result = apply_on_element(wrapper, args, kwargs, n) > 126 return result > --> 127 return f(*args, **kwargs) > 128 wrapper.__doc__ = f.__doc__ > 129 wrapper.__name__ = f.__name__ > > /var/lib/python-support/python2.6/sympy/core/function.pyc in diff(f, > x, times, evaluate) > 693 """ > 694 > --> 695 return Derivative(f,x,times, **{'evaluate':evaluate}) > 696 > 697 @vectorize(0) > > /var/lib/python-support/python2.6/sympy/core/function.pyc in > __new__(cls, expr, *symbols, **assumptions) > 476 s = sympify(s) > 477 if not isinstance(s, Symbol): > --> 478 raise ValueError('Invalid literal: %s is not a > valid variable' % s) > 479 if not expr.has(s): > 480 return S.Zero > > ValueError: Invalid literal: q3(t) is not a valid variable > > Or is there another way this can be done easily that I'm not aware of? Currently you have to do it by hand. Try to implement this in the Derivative class, so that it works. It may not be obvious how to do it so that it looks good, but try to implement it somehow so that it works and we'll then refine the patch, so that it can be pushed in. E.g. my first try would be to just do all the substitutions automatically inside Derivative, e.g. something like if isinstance(s, Function): <substitute, differentiate, substitute, return the result> Ondrej --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sympy@googlegroups.com To unsubscribe from this group, send email to sympy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---