Instead of disallowing the name "param_sub" in the function, you can just do
param_sub = Symbol('param_sub', dummy=True)
and then it will remain unique, even if someone uses another symbol
with the exact same name.
The docstring looks better, though.
We don't use unittest. Rather, the tests should look like the other
sympy tests, i.e., just create functions named "test_whatever" to be
put in a test_whatever.py file (possibly one that already exists; any
idea where this should go in SymPy?). Then they will be run by the
test runner (./bin/test).
Aaron Meurer
On Fri, Nov 12, 2010 at 3:51 AM, Philippe <[email protected]> wrote:
> http://pastebin.com/RHKMynAd
> http://pastebin.com/yXDYCMz8
>
> both files.
> the euler-lagrange stuff and my short unittest .py
>
> hope it helps.
> we are still working on it, we have to add extra stuff to get what we
> need.
> I will post here when we get more to propose.
>
> On 12 nov, 10:18, Philippe <[email protected]> wrote:
>> Thanks for your inputs.
>>
>> I changed the definition of the Function (removed the (t))
>> About the wording. You would like me to use f, or g for the state
>> functions of time.
>> usually, those stand for some degree of freedom (x, y, ... angles...).
>>
>> but the litterature also use often: q
>> would it be ok for you if I use: q1, q2, ... ? instead of x, y, ...
>> that would make sense to me.
>>
>> On 10 nov, 18:34, "Aaron S. Meurer" <[email protected]> wrote:
>>
>> > Don't use from sympy import * in docstrings. Import each thing that you
>> > use explicitly.
>>
>> > Also, make the first line separated from the rest by another newline.
>> > Actually, the first line should be a brief description of what the
>> > function does (like "Computes the Euler-Lagrange blah blah blah"), then
>> > the stuff you currently have can go after that.
>>
>> > You can test if your doctests are correct by running ./bin/doctest
>> > your_file.py, where your_file is wherever this code is (or just
>> > ./bin/doctest will run it on all files in the sympy/ directory).
>>
>> > Aside from that, I think it would be slightly better if you just did
>>
>> > x = Function('x')
>> > …diff(x(t), t)
>>
>> > i.e., don't make x the whole evaluated Function, just the Function object.
>> > Also, is x a common name for x with this? Generally in SymPy, x is a
>> > Symbol, and things like f, g, and h are Functions, so unless it is what
>> > everybody uses, I would use f instead of x.
>>
>> > Aaron Meurer
>>
>> > On Nov 10, 2010, at 9:08 AM, Philippe wrote:
>>
>> > > also, I am not sure that I put
>> > > from sympy import *
>> > > t = Symbol('t')
>> > > at the best place.
>>
>> > > On 10 nov, 16:56, Philippe <[email protected]> wrote:
>> > >> is this correct ?
>> > >> to be honnest, it's my first docstring ...
>>
>> > >> On 10 nov, 16:50, Philippe <[email protected]> wrote:
>>
>> > >>> from sympy import *
>>
>> > >>> t = Symbol('t')
>>
>> > >>> def partial_derivative(equa, param):
>> > >>> """param is a variable, must not be named 'param_sub'
>> > >>> >>> from sympy import *
>> > >>> >>> t = Symbol('t')
>> > >>> >>> k = Symbol('k')
>> > >>> >>> x = Function('x')(t)
>> > >>> >>> partial_derivative(k*diff(x, t)**2 + k * x, x)
>> > >>> k
>> > >>> >>> partial_derivative(k*diff(x, t)**2 + k * x, diff(x, t))
>> > >>> 2*k*D(x(t), t)"""
>>
>> > >>> param_sub = Symbol('param_sub')
>> > >>> equa_subs1 = equa.subs(param, param_sub)
>> > >>> dequa_param_sub = diff(equa_subs1, param_sub)
>> > >>> dequa_param = dequa_param_sub.subs(param_sub, param)
>> > >>> return dequa_param
>>
>> > >>> def lagrange(equa, param):
>> > >>> """param is a list of Function of time
>> > >>> must not use the name 'param_sub' in the equation
>> > >>> >>> from sympy import *
>> > >>> >>> t = Symbol('t')
>> > >>> >>> k = Symbol('k')
>> > >>> >>> x = Function('x')(t)
>> > >>> >>> y = Function('y')(t)
>> > >>> >>> equa = diff(x, t)**2+diff(y, t)**2 + 5 * x
>> > >>> >>> dT_dqvt, dT_dq = lagrange(equa, [x, y])
>> > >>> >>> print dT_dqvt
>> > >>> [2*D(x(t), t, t), 2*D(y(t), t, t)]
>> > >>> >>> print dT_dq
>> > >>> [5, 0]
>> > >>> >>> equa = k*diff(x, t)**2 + k * x
>> > >>> >>> dT_dqvt, dT_dq = lagrange(equa, [x])
>> > >>> >>> print dT_dqvt
>> > >>> [2*k*D(x(t), t, t)]
>> > >>> >>> print dT_dq
>> > >>> [k]"""
>>
>> > >>> vel_var = [diff(e, t) for e in param]
>> > >>> dT_dqv = [partial_derivative(equa, p) for p in vel_var]
>> > >>> dT_dq = [partial_derivative(equa, p) for p in param]
>>
>> > >>> dT_dqvt = [diff(e, t) for e in dT_dqv]
>>
>> > >>> return dT_dqvt, dT_dq
>>
>> > >>> if __name__ == "__main__":
>> > >>> import doctest
>> > >>> doctest.testmod()
>>
>> > >>> On 10 nov, 15:15, Andy Ray Terrel <[email protected]> wrote:
>>
>> > >>>> I think this would be a great contribution to the SymPy physics
>> > >>>> module. Can you put some usage doc strings? Then, we can put it in
>> > >>>> the appropriate places.
>>
>> > >>>> -- Andy
>>
>> > >>>> On Wed, Nov 10, 2010 at 3:10 AM, Philippe <[email protected]>
>> > >>>> wrote:
>> > >>>>> some usage if needed..
>> > >>>>> this is my unittest file.
>> > >>>>> the lagrange and partial_derivative functions are in meca.py
>>
>> > >>>>> - - - - - - - - - - - -
>>
>> > >>>>> import unittest
>> > >>>>> from sympy import *
>> > >>>>> import meca
>>
>> > >>>>> class MyTest(unittest.TestCase):
>>
>> > >>>>> def test_lagrange_1(self):
>> > >>>>> t = Symbol('t')
>> > >>>>> x = Function('x')(t)
>> > >>>>> y = Function('y')(t)
>> > >>>>> dT_dqvt, dT_dq = meca.lagrange(diff(x, t)**2+diff(y, t)**2 + 5
>> > >>>>> * x, [x, y])
>>
>> > >>>>> dT_dqvt_0 = 2*diff(x, t, t)
>> > >>>>> dT_dqvt_1 = 2*diff(y, t, t)
>>
>> > >>>>> self.assertEquals(dT_dqvt, [dT_dqvt_0, dT_dqvt_1])
>> > >>>>> self.assertEquals(dT_dq, [5, 0])
>>
>> > >>>>> def test_lagrange_2(self):
>> > >>>>> t = Symbol('t')
>> > >>>>> k = Symbol('k')
>> > >>>>> x = Function('x')(t)
>> > >>>>> dT_dqvt, dT_dq = meca.lagrange(k*diff(x, t)**2 + k * x, [x])
>>
>> > >>>>> dT_dqvt_0 = 2*k*diff(x, t, t)
>>
>> > >>>>> self.assertEquals(dT_dqvt, [dT_dqvt_0])
>> > >>>>> self.assertEquals(dT_dq, [k])
>>
>> > >>>>> def test_partial_derivative_1(self):
>> > >>>>> t = Symbol('t')
>> > >>>>> k = Symbol('k')
>> > >>>>> x = Function('x')(t)
>> > >>>>> dE_q = meca.partial_derivative(k*diff(x, t)**2 + k * x, x)
>> > >>>>> dE_q_sol = k
>> > >>>>> self.assertEquals(dE_q, dE_q_sol)
>>
>> > >>>>> def test_partial_derivative_2(self):
>> > >>>>> t = Symbol('t')
>> > >>>>> k = Symbol('k')
>> > >>>>> x = Function('x')(t)
>> > >>>>> dE_q = meca.partial_derivative(k*diff(x, t)**2 + k * x,
>> > >>>>> diff(x, t))
>> > >>>>> dE_q_sol = 2*k*diff(x, t)
>> > >>>>> self.assertEquals(dE_q, dE_q_sol)
>>
>> > >>>>> if __name__ == '__main__':
>> > >>>>> unittest.main()
>>
>> > >>>>> - - - - - - - - - - - -
>>
>> > >>>>> On 9 nov, 17:18, Philippe <[email protected]> wrote:
>> > >>>>>> from sympy import *
>>
>> > >>>>>> t = Symbol('t')
>> > >>>>>> x = Function('x')(t)
>> > >>>>>> y = Function('y')(t)
>>
>> > >>>>>> def partial_derivative(equa, param):
>> > >>>>>> param_sub = Symbol('param_sub')
>> > >>>>>> equa_subs1 = equa.subs(param, param_sub)
>> > >>>>>> dequa_param_sub = diff(equa_subs1, param_sub)
>> > >>>>>> dequa_param = dequa_param_sub.subs(param_sub, param)
>> > >>>>>> return dequa_param
>>
>> > >>>>>> def lagrange(equa, param):
>> > >>>>>> """
>> > >>>>>> param is a list of Function of time
>> > >>>>>> must not use 'q1', 'q2', .... 'qv1', ... in the equation
>> > >>>>>> """
>> > >>>>>> vel_var = [diff(e, t) for e in param]
>> > >>>>>> dT_dqv = [partial_derivative(equa, p) for p in vel_var]
>> > >>>>>> dT_dq = [partial_derivative(equa, p) for p in param]
>>
>> > >>>>>> dT_dqvt = [diff(e, t) for e in dT_dqv]
>>
>> > >>>>>> return dT_dqvt, dT_dq
>>
>> > >>>>>> On 31 oct, 20:51, Tim Lahey <[email protected]> wrote:
>>
>> > >>>>>>> On Sun, Oct 31, 2010 at 3:41 PM, Aaron S. Meurer
>> > >>>>>>> <[email protected]> wrote:
>>
>> > >>>>>>>> I am still trying to fully understand the code below, but if one
>> > >>>>>>>> of the subs is trying to do something like diff(f(x), x).subs(x,
>> > >>>>>>>> g(x)), then you will get an error in SymPy for the above reason.
>>
>> > >>>>>>>> Aaron Meurer
>>
>> > >>>>>>> The basic approach is to substitute a symbol for f(x) say f1 and
>> > >>>>>>> then
>> > >>>>>>> take the derivative
>> > >>>>>>> with respect to that. You know the substitution, so you can reverse
>> > >>>>>>> it. Once the derivative
>> > >>>>>>> is done, you reverse the substitution. Then, you can take the
>> > >>>>>>> derivative with respect to
>> > >>>>>>> x.
>>
>> > >>>>>>> So, the steps become.
>>
>> > >>>>>>> 1. Build list of symbols for functions.
>> > >>>>>>> 2. Build a list of substitutions for the functions and the reverse.
>> > >>>>>>> 3. Substitute for the functions.
>> > >>>>>>> 4. Run derivatives with respect to the symbols.
>> > >>>>>>> 5. Substitute functions for the symbols.
>> > >>>>>>> 6. Take any derivatives with respect to the function variables.
>>
>> > >>>>>>> Hope that helps the explanation. A lot of what's done in the code
>> > >>>>>>> is using
>> > >>>>>>> zip and map to make the code fast, but I originally wrote it as
>> > >>>>>>> above. Python
>> > >>>>>>> has appropriate functions that this should still be fast.
>>
>> > >>>>>>> Cheers,
>>
>> > >>>>>>> Tim.
>>
>> > >>>>>>> --
>> > >>>>>>> Tim Lahey
>> > >>>>>>> PhD Candidate, Systems Design Engineering
>> > >>>>>>> University of Waterloohttp://www.linkedin.com/in/timlahey
>>
>> > >>>>> --
>> > >>>>> You received this message because you are subscribed to the Google
>> > >>>>> Groups "sympy" group.
>> > >>>>> To post to this group, send email to [email protected].
>> > >>>>> To unsubscribe from this group, send email to
>> > >>>>> [email protected].
>> > >>>>> For more options, visit this group
>> > >>>>> athttp://groups.google.com/group/sympy?hl=en.
>>
>> > > --
>> > > You received this message because you are subscribed to the Google
>> > > Groups "sympy" group.
>> > > To post to this group, send email to [email protected].
>> > > To unsubscribe from this group, send email to
>> > > [email protected].
>> > > For more options, visit this group
>> > > athttp://groups.google.com/group/sympy?hl=en.
>>
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sympy?hl=en.
>
>
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sympy?hl=en.