Done:
https://github.com/sympy/sympy/issues/15219


On Wed, 12 Sep 2018 at 00:30, Aaron Meurer <[email protected]> wrote:

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

-- 
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/CAHVvXxSoSFEO23W06LMvfDK4VRMp0_GvMixE8dL%2Baw_ugPG-9g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to