IndexError indicates a bug. Can you open an issue for it?

Aaron Meurer

On Tue, Sep 11, 2018 at 5:28 PM, Oscar Benjamin
<[email protected]> wrote:
> Thanks for the quick response. I have one more while I'm here:
>
> In [43]: eqn = exp(f(x).diff(x)-f(x))
>
>
> In [44]: eqn
>
> Out[44]:
>
>          d
>
>  -f(x) + ──(f(x))
>
>          dx
>
> ℯ
>
>
> In [45]: dsolve(eqn, f(x))
>
> ---------------------------------------------------------------------------
>
> IndexError                                Traceback (most recent call last)
>
> <ipython-input-45-b99728060ab1> in <module>()
>
> ----> 1 dsolve(eqn, f(x))
>
>
> ~/current/sympy/venv/lib/python3.6/site-packages/sympy/solvers/ode.py in
> dsolve(eq, func, hint, simplify, ics, xi, eta, x0, n, **kwargs)
>
>     662             # The key 'hint' stores the hint needed to be solved
> for.
>
>     663             hint = hints['hint']
>
> --> 664             return _helper_simplify(eq, hint, hints, simplify,
> ics=ics)
>
>     665
>
>     666 def _helper_simplify(eq, hint, match, simplify=True, ics=None,
> **kwargs):
>
>
> ~/current/sympy/venv/lib/python3.6/site-packages/sympy/solvers/ode.py in
> _helper_simplify(eq, hint, match, simplify, ics, **kwargs)
>
>     687         # attempt to solve for func, and apply any other hint
> specific
>
>     688         # simplifications
>
> --> 689         sols = solvefunc(eq, func, order, match)
>
>     690         if isinstance(sols, Expr):
>
>     691             rv =  odesimp(sols, func, order, cons(sols), hint)
>
>
> ~/current/sympy/venv/lib/python3.6/site-packages/sympy/solvers/ode.py in
> ode_lie_group(eq, func, order, match)
>
>    5460         else:
>
>    5461             y = Dummy("y")
>
> -> 5462             h = sol[0].subs(func, y)
>
>    5463
>
>    5464     if xis is not None and etas is not None:
>
>
> IndexError: list index out of range
>
>
> Not sure what the right response is here but perhaps not an IndexError.
>
> --
> Oscar
>
>
> On Wed, 12 Sep 2018 at 00:06, Aaron Meurer <[email protected]> wrote:
>>
>> The algorithms to solve it aren't implemented. In factored form, the
>> equation can be solved by integrating as you mentioned. There is an
>> issue to implement this algorithm, but it hasn't been done yet
>> https://github.com/sympy/sympy/issues/6259.
>>
>> In expanded form it is a Euler equation, but the algorithm isn't smart
>> enough to recognize it (you need to multiply through by x**2). If you
>> do that you get an answer:
>>
>> >>> dsolve((eqn.doit()*x**2).expand())
>> Eq(f(x), C1 + C2*log(x) + (x - 1)*exp(x)*log(x) -
>> Integral(x*exp(x)*log(x), x))
>>
>> I opened https://github.com/sympy/sympy/issues/15217 for this.
>>
>> I guess based on your other calculation the answer should be
>> expressible via Ei, which SymPy doesn't know how to do for that
>> integral.
>>
>> Regarding the final issue, I'm not sure why integrate() on an Eq
>> doesn't evaluate the integral, but if you call doit() it computes it.
>>
>> >>> dsolve(eqn, g(x)).integrate(x).doit()
>> Eq(Integral(g(x), x), C1*log(x) + exp(x) - Ei(x))
>>
>> I opened https://github.com/sympy/sympy/issues/15218 for this.
>>
>> Aaron Meurer
>>
>> On Tue, Sep 11, 2018 at 4:53 PM, Oscar Benjamin
>> <[email protected]> wrote:
>> > Hi,
>> >
>> > I'm not sure if I'm missing a trick but I've been trying to use dsolve
>> > and
>> > it seems it doesn't work in many simple cases. I've put some examples
>> > below,
>> > tested with sympy 1.2 installed using pip. I don't know if any of the
>> > below
>> > is me using dsolve incorrectly or should be considered a bug or is just
>> > a
>> > reflection of it being a work in progress.
>> >
>> > I want to solve the heat/diffusion equation for heat in a cylinder with
>> > an
>> > exponential heat term:
>> >
>> > $ isympy
>> >
>> > In [1]: eqn = Derivative(Derivative(f(x),x)*x,x)/x - exp(x)
>> >
>> >
>> > In [2]: eqn
>> >
>> > Out[2]:
>> >
>> >        d ⎛  d       ⎞
>> >
>> >        ──⎜x⋅──(f(x))⎟
>> >
>> >    x   dx⎝  dx      ⎠
>> >
>> > - ℯ  + ──────────────
>> >
>> >              x
>> >
>> >
>> > In [3]: dsolve(eqn, f(x))
>> >
>> >
>> > ---------------------------------------------------------------------------
>> >
>> > NotImplementedError
>> >
>> >
>> > It strikes me as odd that sympy can't solve this since it's essentially
>> > an
>> > algebraic rearrangement to get f here and all that is needed is to
>> > understand that d/dx can be integrated. Sympy can do the integrals:
>> >
>> > In [16]: res = expand((simplify(eqn * x).integrate(x) +
>> > C1)/x).integrate(x)
>> > + C2
>> >
>> >     ...:
>> >
>> >
>> > In [17]: res
>> >
>> > Out[17]:
>> >
>> >                          x
>> >
>> > C₁⋅log(x) + C₂ + f(x) - ℯ  + Ei(x)
>> >
>> >
>> > In [18]: solve(res, f(x))
>> >
>> > Out[18]:
>> >
>> > ⎡                   x        ⎤
>> >
>> > ⎣-C₁⋅log(x) - C₂ + ℯ  - Ei(x)⎦
>> >
>> >
>> > The algorithm for this is essentially the same as solving an algebraic
>> > equation. If I replace the derivatives with logs then solve can do it:
>> >
>> > In [23]: eqn = log(log(f(x))*x)/x - exp(x)
>> >
>> >
>> > In [24]: eqn
>> >
>> > Out[24]:
>> >
>> >    x   log(x⋅log(f(x)))
>> >
>> > - ℯ  + ────────────────
>> >
>> >               x
>> >
>> >
>> > In [25]: solve(eqn, f(x))
>> >
>> > Out[25]:
>> >
>> > ⎡     x⎤
>> >
>> > ⎢  x⋅ℯ ⎥
>> >
>> > ⎢ ℯ    ⎥
>> >
>> > ⎢ ─────⎥
>> >
>> > ⎢   x  ⎥
>> >
>> > ⎣ℯ     ⎦
>> >
>> >
>> > If I use f(x).diff(x) rather than Derivative then it looks more
>> > complicated
>> > but should work:
>> >
>> > In [26]: eqn = ((f(x)).diff(x)*x).diff(x)/x - exp(x)
>> >
>> >
>> > In [27]: eqn
>> >
>> > Out[27]:
>> >
>> >            2
>> >
>> >           d          d
>> >
>> >        x⋅───(f(x)) + ──(f(x))
>> >
>> >            2         dx
>> >
>> >    x     dx
>> >
>> > - ℯ  + ──────────────────────
>> >
>> >                  x
>> >
>> >
>> > In [28]: dsolve(eqn)
>> >
>> >
>> > ---------------------------------------------------------------------------
>> >
>> > NotImplementedError
>> >
>> >
>> > The automatic expansion of the product rule here leaves us in a slightly
>> > trickier position but again there is a general rule that sympy is
>> > overlooking here: Use a substitution f' = g to bring it to 1st order:
>> >
>> > In [32]: eqn = (g(x)*x).diff(x)/x - exp(x)
>> >
>> >
>> > In [33]: eqn
>> >
>> > Out[33]:
>> >
>> >          d
>> >
>> >        x⋅──(g(x)) + g(x)
>> >
>> >    x     dx
>> >
>> > - ℯ  + ─────────────────
>> >
>> >                x
>> >
>> >
>> > In [34]: dsolve(eqn, g(x))
>> >
>> > Out[34]:
>> >
>> >                   x
>> >
>> >        C₁    x   ℯ
>> >
>> > g(x) = ── + ℯ  - ──
>> >
>> >        x         x
>> >
>> >
>> > Then strangely I get:
>> >
>> > In [41]: dsolve(eqn, g(x)).integrate(x)
>> >
>> > Out[41]:
>> >
>> >             ⌠
>> >
>> >             ⎮ ⎛           x⎞
>> >
>> > ⌠           ⎮ ⎜C₁    x   ℯ ⎟
>> >
>> > ⎮ g(x) dx = ⎮ ⎜── + ℯ  - ──⎟ dx
>> >
>> > ⌡           ⎮ ⎝x         x ⎠
>> >
>> >             ⌡
>> >
>> >
>> > But if I just integrate the rhs it does the integral:
>> >
>> > In [40]: dsolve(eqn, g(x)).rhs.integrate(x)
>> >
>> > Out[40]:
>> >
>> >              x
>> >
>> > C₁⋅log(x) + ℯ  - Ei(x)
>> >
>> >
>> > --
>> > Oscar
>> >
>> > --
>> > 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 https://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/sympy/CAHVvXxROOENnFvfstx2ODdTC51JTYfaXgZMz%3DinO8HDKP2pSTA%40mail.gmail.com.
>> > 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 https://groups.google.com/group/sympy.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/sympy/CAKgW%3D6JpeWJJLZBPOgMnEFuRqsg3xc1-5gn6iiaDN9k07%2Bb4Dw%40mail.gmail.com.
>> 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 https://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/CAHVvXxROL%2BquRBfLhRBP_DSzXpV7KE64A7KeQ%3D5VpXdrMnsCkQ%40mail.gmail.com.
>
> 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 https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6LBZBMa%3Dd_ma3Eg3L3hcXGPBDuOXeNqc0dpS6BsA%3DUXaw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to