How do I numerically solve a non-linear ODE in Mathematica?

  • Thread starter Thread starter member 428835
  • Start date Start date
  • Tags Tags
    Non-linear Ode
Click For Summary
The discussion focuses on numerically solving the non-linear second-order ODE, y y'' + 2y'^2 + xy' = 0, using Mathematica. The original poster encounters issues with singularities when y=0, leading to errors in their initial conditions. Suggestions include modifying the boundary conditions to avoid y=0 and using a small positive number to stabilize the solution. Participants explain that singular differential equations may not yield unique solutions with certain initial conditions, complicating the problem. Ultimately, the poster finds success by adjusting the boundary conditions and seeks guidance on integrating their numerical solution.
member 428835
Hi PF!

I am wondering if any of you have experience numerically solving second order ODE's? Basically, I'm trying to solve one and am trying to do it numerically in mathematica. Can anyone help? For those curious, the equation is ##y y'' + 2y'^2 +xy' = 0## where ##y## is a function of ##x##.

Thanks so much!

PS is anyone else unable to see latex on physics forums (mine's simply showing all statements literally)?
 
Physics news on Phys.org
I would just use NDSolve.
The code is
NDSolve[{y[x] y''[x]+2(y'[x])^2+x(y'[x])==0,y'[x1]==a,y[x1]==b},y[x],{x,x1,x2}]

I've assumed you want both initial conditions at the point x1, and the equation solved on the interval [x1,x2]
 
When I try to put that in I receive an error message, something about a singularity and 1/0. My input is below

NDSolve[{x Derivative[1][y][x] + 2 Derivative[1][y][x]^2 + y[x] (y^\[Prime]\[Prime])[x] == 0, Derivative[1][y][1] == -(1/2), y[1] == 0}, y[x], {x, 0, 1}]

the boundary conditions are ##y(1)=0## and ##y'(1)=1/2##.

Please let me know how you would proceed, and thanks so much for helping me!
 
Your differential equation is singular where y=0. Here the differential equation is essentially \left(0\right)y'' +2y'^2+xy'=0. You'll note that here there is no constraint on y'' because it is multiplied by zero. Here normal existence and uniqueness theorems fail. I suspect that your initial conditions are not uniquely specifying the solution. They are redundant. Try solving the equation with initial conditions y \ne 0. This might help show what's going wrong near y=0. You might have to adjust the domain to ensure that y does not cross zero.
 
  • Like
Likes member 428835
Thanks for taking the time to reply. So I used the only other boundary condition I know of (although this one evidently was numerically found) as ##y(0)=.345...## and I'm still getting an error. But from the text it sounds like ##y(0)=.345...## was found only after solving the initial ODE with the above listed boundary conditions.

Any other idea of how to solve, or can mathematica not do this? Again, I'd like to try and numerically solve using the first two boundary conditions.
 
I'm not sure I understand your last comment. I encourage you to try a bunch of different initial y and y', use a different domain, and a different initial x. Just pick random numbers. Avoid y=0.

There are two things going on. First numerically, I suspect that Mathematica might be running into errors associated with dividing by zero when y=0. I'm not too familiar with Mathematica, but I suspect its trying to reformulate the equation into something akin to y'' =\frac{1}{y} \times f(x,y,y'). You could try modifying the equation to (y+\epsilon)y''+2y'^2+xy'=0 where \epsilon is a small positive number. See what happens.

I also suspect that there is a fundamental error in your initial conditions. I suspect that there are multiple solutions that pass through the point y(1)=0, y'(1)=1/2. Singular differential equations often have this problem. If this is true, then your problem as stated is not well posed. There will be many solutions to the differential equation with the given initial conditions. You may be able to trick Mathematica into giving you one solution. But you really need to understand the behavior near the singularity before you trust any solution. This is why I encourage you to try many different initial conditions.
 
  • Like
Likes member 428835
OK great, I've tried setting the zero boundary condition to a number close to zero and am getting great results, so thanks!

However, can you explain what you meant when you said that
normal existence and uniqueness theorems fail.
 
joshmccraney said:
OK great, I've tried setting the zero boundary condition to a number close to zero and am getting great results, so thanks!

However, can you explain what you meant when you said that

He means that when a DE is singular at a point, boundary conditions applied there may not lead to a unique solution, or any solution.
 
Ok, thanks for explaining that. So since, as was previously stated, mathematica is probably isolating ##y''## then because ##y## is in the denominator we have a problem when ##y=0## right?

Also, I was hoping I could integrate my numerical solution I received in mathematica. Specifically, I am trying to calculate ##\int_0^1 y^2 \, dx##. Do you know how to do this? I get a result if I type
Integrate[(y[x] /. t), {x, 0, 1}]
where I used ndsolve over the above ode, but for some reason if i type
Integrate[(y[x] /. t)^2, {x, 0, 1}]
i get no answer. Any ideas?
 
Last edited by a moderator:
  • #10
joshmccraney said:
Ok, thanks for explaining that. So since, as was previously stated, mathematica is probably isolating ##y''## then because ##y## is in the denominator we have a problem when ##y=0## right?

Also, I was hoping I could integrate my numerical solution I received in mathematica. Do you know how to do this? I can give the technique used to solve it if that helps?

Sure that's easy to do.
First call your solution something, to do this you want to give your NDSolve[..] a name.
For example,
s=NDSolve[...] (where ... represents all the stuff you have inside the function)
Then after you shift-enter, you can use the function in any other operation by typing "y[x]/.s" in place of the function
If you want to integrate this function from {a,b} (And make sure the function has been solved on this interval), use
NIntegrate[y[x]/.s, {x,a,b}]
 
  • Like
Likes member 428835
  • #11
Perfect! Thanks so much! Just curious, but why is it y[x]/.s? Why divide by .s?
 
  • #12
joshmccraney said:
Perfect! Thanks so much! Just curious, but why is it y[x]/.s? Why divide by .s?

I think " /. " is the command to replace something with a predefined object, not exactly sure though.
 
  • #13
thanks!
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 24 ·
Replies
24
Views
4K
  • · Replies 3 ·
Replies
3
Views
3K
Replies
3
Views
3K
  • · Replies 11 ·
Replies
11
Views
2K
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K