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.
