Yeah, that could work. I was hoping that I could make it work in a way which was hidden to the user; that just using diff would work. Writing a method (or overriding one) to do this pre- and post-substitution is the only solution that I currently understand how to do; but again, it is undesirable.
-Gilbert On Jun 3, 9:09 pm, Tim Lahey <[email protected]> wrote: > On Fri, Jun 3, 2011 at 8:05 PM, Gilbert Gede <[email protected]> wrote: > > Can anyone give some insight into how I could get this desired behavior, > > taking the derivative of an expression wrt a time-differentiated symbol, to > > work in a way consistent with existing SymPy behavior? Thanks. > > -Gilbert > > I implemented Euler-Lagrange equations in Maple. I've put the code for > doing it below. Basically, I create symbols for each of the functions > and substitute these. Then, I take the derivative, and revert back. > This code is quite fast in Maple (at the time I originally wrote the > code, it was more than 2 orders of magnitude faster than Maple's > equivalent) and I think most of the functionality necessary is in > Python and SymPy. It should be fairly straightforward to convert to > SymPy. This code handles any number of variables (as a list), but it > only does the traditional Euler-Lagrange equation, not some of the > others that can arise due to Calculus of Variations. > > I hope this helps. > > Cheers, > > Tim. > > --- > # Calculate the Mass (d/dt(dL_dqv)) and Stiffness (dL_dq) contributions to the > # Euler-Lagrange equation. Note that the Stiffness contribution does > not include the negative sign. > EulerLagrange := proc(Lagrangian::anything, variables::list) > local num_list, qv_name, vel_var, qv_subs, qv_unsubs, Lagrange_subs1, > Lagrange_subs2, dL_dqv1, dL_dqv2, dL_dqv, dL_dqvt, dL_dq, dL_dq1, > dL_dq2, dL_dq3, q_name, q_subs, q_unsubs: > > # create a list of indices from 1 to the number of variables used in > the formulation > num_list := [seq(i,i=1..nops(variables))]: > > # Define a list of generalized velocity and position variables > qv_name := map2(cat,qv,num_list): > q_name := map2(cat,q,num_list): > > # Equate the time derivatives of the system variable to the > generalized velocities > # also define the reverse mapping > vel_var := map(diff,variables,t): > qv_subs := zip(equate,vel_var,qv_name): > qv_unsubs := zip(equate,qv_name,vel_var): > > # Equate the generalized positions to the system variables and define > the reverse mapping > q_subs := zip(equate,variables,q_name): > q_unsubs := zip(equate,q_name,variables): > > # Convert the Lagrangian to the generalized position and velocity > variables > Lagrange_subs1 := subs(qv_subs,Lagrangian): > Lagrange_subs2 := subs(q_subs,Lagrange_subs1): > > # Differentiate the Lagrangian with respect to the generalized > velocities and positions > dL_dqv1 := map2(diff,Lagrange_subs2,qv_name): > dL_dq1 := map2(diff,Lagrange_subs2,q_name): > > # Revert back to the system variables > dL_dq2 := map2(subs,qv_unsubs,dL_dq1): > dL_dqv2 := map2(subs,qv_unsubs,dL_dqv1): > dL_dqv := map2(subs,q_unsubs,dL_dqv2): > dL_dq := map2(subs,q_unsubs,dL_dq2): > dL_dqvt := map(diff,dL_dqv,t): > > # Return the two components of the Euler-Lagrange Equation > return (dL_dqvt, dL_dq): > end proc: > > -- > Tim Lahey > PhD Candidate, Systems Design Engineering > University of Waterloohttp://about.me/tjlahey -- 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.
