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

  • Context: Graduate 
  • Thread starter Thread starter member 428835
  • Start date Start date
  • Tags Tags
    Non-linear Ode
Click For Summary

Discussion Overview

The discussion revolves around numerically solving a second-order non-linear ordinary differential equation (ODE) using Mathematica. The specific equation under consideration is ##y y'' + 2y'^2 + xy' = 0##, with participants sharing their experiences, challenges, and suggestions related to the numerical solution and boundary conditions.

Discussion Character

  • Exploratory
  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant seeks help with numerically solving the ODE in Mathematica and describes the equation and boundary conditions.
  • Another participant suggests using the NDSolve function and provides a code snippet for implementation.
  • A participant encounters an error related to singularity when attempting to apply specific boundary conditions and requests further assistance.
  • Concerns are raised about the singular nature of the differential equation at ##y=0##, which may lead to issues with existence and uniqueness of solutions.
  • Participants discuss the implications of singular points on the initial conditions and suggest trying different initial values to avoid the singularity.
  • One participant reports success after adjusting the boundary condition to a value close to zero and seeks clarification on the failure of existence and uniqueness theorems.
  • There is a discussion about integrating the numerical solution obtained from NDSolve, with participants sharing methods for performing the integration in Mathematica.
  • Clarifications are sought regarding the syntax used in Mathematica for replacing variables with solutions from NDSolve.

Areas of Agreement / Disagreement

Participants express differing views on the initial conditions and the nature of the singularity in the ODE. While some suggest modifications to the boundary conditions, others emphasize the need to understand the behavior near the singularity. The discussion remains unresolved regarding the best approach to handle the singularity and the implications for the solution.

Contextual Notes

Participants note that the differential equation is singular at ##y=0##, which complicates the application of standard existence and uniqueness theorems. There is uncertainty regarding the appropriate initial conditions and their impact on the uniqueness of the solution.

Who May Find This Useful

Individuals interested in numerical methods for solving non-linear ODEs, particularly those using Mathematica, may find this discussion relevant. It may also benefit those exploring the implications of singularities in differential equations.

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   Reactions: 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   Reactions: 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   Reactions: 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 3 ·
Replies
3
Views
3K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
Replies
3
Views
3K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K