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...

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.

Reply via email to