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.
