46
$\begingroup$

I'm trying to plot a phase portrait for the differential equation $$x'' - (1 - x^2) x' + x = 0.5 \cos(1.1 t)\,.$$ The primes are derivatives with respect to $t$. I've reduced this second order ODE to two first order ODEs of the form $ x_1' = x_2$ and $x_2' - (1 - x_1^2) x_2 + x_1 = 0.5 \cos(1.1 t)$. Now I wish to use mathematica to plot a phase portrait. Unfortunately, I'm unsure of how to do this because of the dependence of the second equation on an explicit $t$.

$\endgroup$
5
  • 1
    $\begingroup$ Have a look at ParametricPlot. $\endgroup$ Nov 5, 2012 at 18:42
  • 1
    $\begingroup$ you could look at this as well? mathematica.stackexchange.com/questions/14027/… $\endgroup$
    – chris
    Nov 5, 2012 at 18:43
  • $\begingroup$ Chris, this is much to complicated for me. I'm a huge mathematica newb. Could you explain more precisely? $\endgroup$
    – covertbob
    Nov 5, 2012 at 18:46
  • 5
    $\begingroup$ @covertbob If you're that new to Mathematica, then I suggest going through some tutorials and using the virtual book. Also see this answer for some introductory materials. Unfortunately, this site is not the place to learn Mathematica step-by-step from scratch. For starters, you can look at the code in the answer Chris linked to, and use the documentation center to read up on the functions used (e.g., NDSolve, ParametricPlot, StreamPlot, etc.) Just the first two should be sufficient for you to make headway on your problem. $\endgroup$
    – rm -rf
    Nov 5, 2012 at 18:55
  • $\begingroup$ Not an answer to your question - just a bunch of pretty phase portrait pictures - see drorbn.net/AcademicPensieve/Classes/12-267/…. The Mathematica notebook that produced the picture is linked at the bottom of that URL. $\endgroup$ Nov 8, 2012 at 22:07

3 Answers 3

42
$\begingroup$

The EquationTrekker package is a great package for plotting and exploring phase space

<< EquationTrekker`
EquationTrekker[x''[t] - (1 - x[t]^2) x'[t] + x[t] == 0.5 Cos[1.1 t], x[t], {t, 0, 10}]

This brings up a window where you can right click on any point and it plots the trajectory starting with that initial condition:

enter image description here

You can do more as well, such as add parameters to your equations and see what happens to the trajectories as you vary them:

 EquationTrekker[x''[t] - (1 - x[t]^2) x'[t] + x[t] == a Cos[\[Omega] t],
                 x[t], {t, 0, 10}, TrekParameters -> {a -> 0.5, \[Omega] -> 1.1}
                ]

enter image description here

$\endgroup$
3
  • 3
    $\begingroup$ This no longer works in the version I have, 11.0.0.0. It produces error messages and no output. This is what has happened every time I've tried a Mathematica package. They always seem to fail in the version I am using. Sometimes I can fix the resulting errors, but usually not. In the end I always have to go back to built-in functionality, which seldom fails in my experience. $\endgroup$ Apr 4, 2017 at 23:36
  • $\begingroup$ Hi, this package has a large number of errors in version 12.1 and cannot be used. $\endgroup$ Jul 24, 2020 at 1:01
  • 1
    $\begingroup$ See mathematica.stackexchange.com/questions/92810/… for more about how to use EquationTrekker in versions since V10.2 $\endgroup$
    – Michael E2
    Nov 1, 2020 at 0:40
47
$\begingroup$

again just a slight modification from the documentation

splot = StreamPlot[{y, (1 - x^2) y - x}, {x, -4, 4}, {y, -3, 3}, 
   StreamColorFunction -> "Rainbow"];
Manipulate[
 Show[splot, 
  ParametricPlot[
   Evaluate[
    First[{x[t], y[t]} /. 
      NDSolve[{x'[t] == y[t], 
        y'[t] == y[t] (1 - x[t]^2) - x[t] + 0.5 Cos[1.1 t], 
        Thread[{x[0], y[0]} == point]}, {x, y}, {t, 0, T}]]], {t, 0, 
    T}, PlotStyle -> Red]], {{T, 20}, 1, 100}, {{point, {3, 0}}, 
  Locator}, SaveDefinitions -> True]

Mathematica graphics

Or just to show off (again a rip off from the documentation)

splot = LineIntegralConvolutionPlot[{{y, (1 - x^2) y - x}, {"noise", 
     1000, 1000}}, {x, -4, 4}, {y, -3, 3}, 
   ColorFunction -> "BeachColors", LightingAngle -> 0, 
   LineIntegralConvolutionScale -> 3, Frame -> False];
Manipulate[
 Show[splot, 
  ParametricPlot[
   Evaluate[
    First[{x[t], y[t]} /. 
      NDSolve[{x'[t] == y[t], y'[t] == y[t] (1 - x[t]^2) - x[t]+0.5 Cos[1.1 t], 
        Thread[{x[0], y[0]} == point]}, {x, y}, {t, 0, T}]]], {t, 0, 
    T}, PlotStyle -> White]], {{T, 20}, 1, 100}, {{point, {3, 0}}, 
  Locator}, SaveDefinitions -> True]

Mathematica graphics

$\endgroup$
2
  • $\begingroup$ Just a question. Is it right, that StreamPlot[{v1[x,y],v2[x,y]}] returns a set of solutions of the differential equations x'=v1; y'=v2? It looks like an elementary information that everybody knows. But it happened that I do not know, and there is no explicit discussion of this point in the Help/StreamPlot. Please let me know. Where could I have a look at the proof, or at least, an explanation? If I understand right, the StreamPlot simply yields the phase portrait, does it? $\endgroup$ Nov 6, 2012 at 10:51
  • $\begingroup$ @AlexeiBoulbitch yes it yields a set of solutions for the homogenous set of equations. But it does not attempt to be continuous. In the previous example if you remove + 0.5 Cos[1.1 t] you will see that the red curve and the underlying flow become identical. $\endgroup$
    – chris
    Nov 7, 2012 at 17:48
26
$\begingroup$

You can solve the equation with (you might want to change the initial conditions) :

sol[t_] =  NDSolve[{x''[t] - (1 - x[t]^2) x'[t] + x[t] == 0.5 Cos[1.1 t], 
   x[0] == 0, x'[0] == 1}, x[t], {t, 0, 10}][[1, 1, 2]]

Now you can use the solution as any other function; in particular, you can plot it versus its derivative :

ParametricPlot[{sol[t], sol'[t]}, {t, 0, 10}]

enter image description here

$\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.