6
$\begingroup$

Fyi, report to WRI as suggedted. [CASE:4956902]


This ode is similar to one here but for some reason DSolve could not able to solve this. This ode is from a textbook

My question is: What is the reason it can't solve this since it is similar to the one in the above link, and any workaround to make DSolve solve this one?

I solved by hand below as well. I used the Trace commands by Michael E2 from the above answer, but it did not help me figure where it went wrong and I am not good at internal tracing of Mathematica functions.

Code

ClearAll[y, x];
ode = y''[x] == y'[x]*Exp[y[x]];
ic = {y[3] == 0, y'[3] == 1};
DSolve[{ode, ic}, y[x], x]
(* {} *)

The solution it should have given is y[x]->-Log[4-x] as shown below.

Verification of solution

mysol = y -> Function[{x}, -Log[4 - x]]
ode /. mysol

Mathematica graphics

ic/.mysol

Mathematica graphics

Hand solution

\begin{align*} y^{\prime\prime} & =y^{\prime}e^{y}\\ y\left( 3\right) & =0\\ y^{\prime}\left( 3\right) & =1 \end{align*} Let $p=y^{\prime}$, then $y^{\prime\prime}=\frac{dp}{dx}=\frac{dp}{dy}\frac{dy}{dx}=\frac{dp}{dy}p$. The ode becomes \begin{align*} \frac{dp}{dy}p & =pe^{y}\\ \frac{dp}{dy} & =e^{y} \end{align*} Which has the solution \begin{equation} p=e^{y}+c_{1}\tag{1}% \end{equation} Using initial conditions given by $p\left( 3\right) =1,y\left( 3\right) =0$ the above becomes $$ 1=1+c_{1} $$ Hence $c_{1}=0$ and the solution (1) simplifies to \begin{align*} p & =e^{y}\\ \frac{dy}{dx} & =e^{y} \end{align*} This is separable. $$ e^{-y}dy=dx $$ Integrating gives \begin{equation} -e^{-y}=x+c_{2}\tag{2} \end{equation} But $y\left( 3\right) =0$, hence $$ -1=3+c_{2} $$ Therefore $c_{2}=-4$ and (2) becomes \begin{align*} -e^{-y} & =x-4\\ e^{-y} & =4-x\\ -y & =\ln\left( 4-x\right) \\ y & =-\ln\left( 4-x\right) \end{align*}

Attempt at Tracing using Michael E2's code

ClearAll[y,x];
ode=y''[x]==y'[x]*Exp[y[x]];
ic={y[3]==0,y'[3]==1};
Trace[DSolve[{ode,ic},y[x],x],s_Solve:>HoldForm[s]->s,TraceInternal->True]//Flatten//Column

Mathematica graphics

$\endgroup$
2
  • 2
    $\begingroup$ Only workaround: ode = y''[x] == y'[x]*Exp[y[x]]; ic = {y[3] == 0, y'[3] == A}; sol = DSolve[{ode, ic}, y[x], x]; Limit[y[x] /. First@sol, A -> 1]. $\endgroup$ Commented Jul 30, 2022 at 11:05
  • 1
    $\begingroup$ Thanks for all the great answers, I wish I can accept both of them. Report to WRI. $\endgroup$
    – Nasser
    Commented Jul 31, 2022 at 21:26

2 Answers 2

6
$\begingroup$

I'd report this to WRI. If buried in the DSolve code base is a way to solve this, then the decision tree misses it. Otherwise, they should implement a way. DSolve has a method to solve y''[x] == F[y[x]]. Here's is a modification of it to solve y''[x] == F[y[x], y'[x]] (tested only on this problem!).

I snatched the code for y''[x] == F[y[x]] and modified by hand. The modifications are surround by (**) on either side.

mySpecialOrder2BVP // ClearAll;
First@DownValues@DSolve`DSolveExtendedLibraryDump`SpecialOrder2BVP /. 
  s_Symbol :> 
   With[{v = Symbol@SymbolName[s]}, 
    RuleCondition[v, ! MemberQ[Context[s], $ContextPath]]] /. 
 SpecialOrder2BVP -> mySpecialOrder2BVP

Edit the output above to be the following:

(*"
 * Solves y''[x] == F[y[x], y'[x]] if LHS is integrable w.r.t x
"*)
DownValues@mySpecialOrder2BVP = {
   HoldPattern[
     mySpecialOrder2BVP[eqn_, ycond_, yprimecond_, a_, y_, x_]] :> 
    Block[{rhs, w, res1, c, res},
     rhs = eqn[[2]] /.  (**) {y[x] | y'[x] -> w}(**);
     (res1 = 
        Quiet[Solve[ (**)
          Derivative[1][y][x] == Integrate[eqn[[2]], x](**)  + c /. 
            x -> a /. {ycond, yprimecond}, c]];
       (res1 = (**)
          Derivative[1][y][x] == 
           Integrate[eqn[[2]], x](**)  + (c /. res1[[1]]);
         res = (**)
          DSolve[res1 && ycond[[1]] == ycond[[2]], {y}, {x}]; (**)
         res /; FreeQ[res, (**)DSolve(**)]) /;
        MatchQ[res1, {{c -> m_}}] && FreeQ[res1, Integrate]) /;
      FreeQ[rhs, y | x]]
   };


mySpecialOrder2BVP[ode, Sequence @@ First@Solve[ic], 3, y, x]

(*  {{y -> Function[{x}, -Log[4 - x]]}}  *)

I don't have a way to hook this into DSolve automatically.

Edit notice: I neglected to mark the change from the internal DSolve`DSolveParser to DSolve. DSolveParser[] threw a couple of Part::partw errors that could be ignored. Calling the top-level DSolve seemed the best fix for this answer. The Condition should therefore be FreeQ[res, DSolve]. It seems to me that the errors are but that arise because the internal SpecialOrder2BVP[] hasn't been updated to pass DSolveParser[] complete option value data (with the new options like IncludeSingularSolutions). I haven't noticed anyone reporting such a bug yet, though. (Also, I don't know why Integrate is called twice. It seems wasteful.)

$\endgroup$
2
  • $\begingroup$ Great response (+1)! May I suggest that you report this issue to WRI, because you have a better understanding of the matter than I or (I surmise) the OP. Thanks. $\endgroup$
    – bbgodfrey
    Commented Jul 31, 2022 at 16:35
  • $\begingroup$ @bbgodfrey Thanks! I reported it, with reference to Nasser's case number and my further observations about Part::partw and Integrate. My case number: [CASE:4957084]. $\endgroup$
    – Michael E2
    Commented Aug 1, 2022 at 16:03
5
$\begingroup$

With a bit of assistance, DSolve can obtain the desired solution. ode has a first integral, which is obtained by

Integrate[Subtract @@ ode, x, GeneratedParameters -> C] == 0
(* -E^y[x] + C[1] + Derivative[1][y][x] == 0 *)

Applying the initial conditions then yields

Solve[% /. x -> 3 /. Rule @@@ ic, C[1]] // Flatten
(* {C[1] -> 0} *)

DSolve now obtains the desired solution

DSolve[{%% /. %, ic}, y[x], x] // Flatten
(* {y[x] -> -Log[4 - x]} *)

Addendum

To answer why DSolve fails in the question, consider

s = DSolveValue[{ode, First@ic}, y[x], x, , Assumptions -> C[1] ∈ Reals]
(* -Log[-(1/C[1]) + (E^(3 C[1] - x C[1]) (1 + C[1]))/C[1]] *)

Applying the second boundary condition then yields

Solve[1 == D[s, x] /. x -> 3, C[1]] // Flatten
{C[1] -> 0}

Of course, inserting this value of C[1] into s fails.

Power::infy: Infinite expression 1/0 encountered.

On the other hand, as suggested by Mariusz Iwaniuk in a comment,

Limit[s, %]
(* -Log[4 - x] *)

does work. Apparently, DSolve does not try this.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.