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.