On Tue, Feb 17, 2015 at 10:41 PM, Petr Baudis <[email protected]> wrote:
> On Tue, Feb 17, 2015 at 02:58:35AM -0800, Petr Baudis wrote:
>>
>> On Tuesday, February 17, 2015 at 3:54:32 AM UTC+9, Jason Moore wrote:
>> >
>> > Here is one way to do it:
>> >
>> > https://gist.github.com/moorepants/858503aa180df60a7829
>>
>> Oh, thanks a lot! I didn't think about approaching it this way, and it
>> makes a lot of sense.
>> I'll play with this more, but it's a big step forward for me!
>
> I have rewrote your solution a bit to lend better to autogeneration from
> predicate form that I use as an intermediate form:
>
>         import sympy as sym
>         from sympy import init_printing
>         t = sym.symbols('t', real=True)
>         eqs = []
>
>         g = sym.symbols('g', real=True, positive=True)
>
>         x_r, v_r = sym.symbols('x_r, v_r', cls=sym.Function)  # functions of 
> time
>         x0_r, v0_r = sym.symbols('x0_r, v0_r', real=True)
>         accel_r = sym.Eq(x_r(t).diff(t, 2), -g)
>         position_r = sym.dsolve(accel_r, x_r(t)).subs({'C1': x0_r, 'C2': 
> v0_r})
>         eqs.append(position_r)
>         velocity_r = sym.dsolve(accel_r.subs({x_r(t).diff(t): v_r(t)}), 
> v_r(t)).subs({'C1': v0_r})
>         eqs.append(velocity_r)
>
>         h = sym.symbols('h', real=True)
>         eqs.append(position_r.subs({x_r(t): h, t: 0}))
>         eqs.append(velocity_r.subs({v_r(t): 0, t: 0}))
>
>         t_e2 = sym.symbols('t_e2', real=True)
>         eqs.append(position_r.subs({x_r(t): 0, t: t_e2}))
>
>         print(eqs)
>         print(sym.solve(eqs, v_r(t)))
>
> So one curious observation I have is that even if sym.solve() is given
> multiple equations and only a single variable, it does yield a solution
> in this case.  I'm still confused about what the exact API contract of
> sym.solve() is.  Working "sometimes" leaves me unsure about what I can
> or cannot rely on...

Sadly, there is none. Part of this is due to algorithmic limitations
(solve() is basically a bunch of heuristics, there are few guarantees
that it will find a solution if it exists). But a lot of it is just
poor design. We are trying to make the design better with the new
solveset module.

Aaron Meurer

>
> Of course, the much more important problem for me is that this will
> again generate just a formula of v_r(t) depending on t, instead of the
> other parameters, and I see no easy way to ask SymPy for a solution
> without t in it.  Jason's solution is to first compute the time:
>
>         # Remove position_r, velocity_r from eqs
>         sol = sym.solve(eqs, t_e2, x0_r, v0_r, dict=True)
>         final_velocity = velocity.subs({t: tf}).subs(sol[0])
>
> but that's the problem - I need to know I need to compute the time
> first, and it's not clear what kind of rules to figure out what to
> compute I will need with different combinations of equations.  (In other
> words, I would have hoped a CAS would have this figured out already. :-)
>
> (The other thing of also including x0_r, v0_r in solve set is not so
> bad, that might be fixed by a simple semi-automated substitution step.)
>
> Right now I'm inclined to conclude that what I want to do *is* rather
> hard and I'd have to come up with some new algorithms to deal with this.
> (Or likely take a look at some other CASes first if any handle this case
> for me already.)
>
> --
>                                 Petr Baudis
>         If you do not work on an important problem, it's unlikely
>         you'll do important work.  -- R. Hamming
>         http://www.cs.virginia.edu/~robins/YouAndYourResearch.html
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sympy/20150218044144.GI6082%40machine.or.cz.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6LcGaCDCJWcvHwsrTq39nEuYY8xopbYLesa839bHk6MGA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to