Phase portrait

Phase portrait of the differential equation for a simple harmonic oscillator and a pendulum. Also see these plots of the solutions, or the Taylor approximations.
These figures are used in Ben Kilminster’s lecture notes for PHY111.

Phase portrait of a simple harmonic oscillator with a given initial condition (dark red point):

Phase portrait of two simple harmonic oscillators with different period, has a different shape:

Phase portrait of a damped harmonic oscillator spiraling to the center, which is an attractor:

Phase portrait of a pendulum with closed and open paths, separated by a separatrix. These curves were made with data produced by these MATLAB scripts. For more pendulum related figures, please see the “pendulum” tag.

Edit and compile if you like:

% Author: Izaak Neutelings (Februari 2021)
% https://mathworld.wolfram.com/PhasePortrait.html
\documentclass[border=3pt,tikz]{standalone}
\usepackage{amsmath} % for \dfrac
\usepackage{physics,siunitx}
\usepackage{tikz,pgfplots}
\usepackage{etoolbox} % ifthen
\usepackage[outline]{contour} % glow around text
\contourlength{1.1pt}
\usetikzlibrary{angles,quotes} % for pic (angle labels)
\usetikzlibrary{arrows.meta}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{bending} % for arrow head angle
\tikzset{>=latex} % for LaTeX arrow head
\usepackage{xcolor}
\pgfplotsset{compat=newest}

\colorlet{xcol}{blue!60!black}
\colorlet{myred}{red!80!black}
\colorlet{myblue}{blue!80!black}
\colorlet{mygreen}{green!40!black}
\colorlet{mypurple}{red!50!blue!90!black!80}
\colorlet{mydarkred}{myred!80!black}
\colorlet{mydarkblue}{myblue!80!black}
\tikzstyle{xline}=[xcol,thick,smooth]
\tikzstyle{width}=[{Latex[length=5,width=3]}-{Latex[length=5,width=3]},thick]
\tikzstyle{mydashed}=[dash pattern=on 1.7pt off 1.7pt]
\tikzset{
  traj/.style 2 args={xline,postaction={decorate},decoration={markings,
    mark=at position #1 with {\arrow{<}},
    mark=at position #2 with {\arrow{<}}}
  }
}
\def\tick#1#2{\draw[thick] (#1)++(#2:0.12) --++ (#2-180:0.24)}
\def\N{100} % number of samples


\begin{document}


% PHASE DIAGRAM
\begin{tikzpicture}
  \def\xmax{2.0}
  \def\A{1.7}
  \def\a{0.85}
  \def\ang{60}
  \coordinate (O) at (0,0);
  \coordinate (X) at (\A,0);
  \coordinate (R) at (\ang:\A);
  \coordinate (R') at (0:\a);
  \draw[->,thick] (-\xmax,0) -- (\xmax+0.1,0) node[right=-1] {$x$\,[m]};
  \draw[->,thick] (0,-\xmax) -- (0,\xmax+0.1) node[above=-1] {$v$\,[m/s]};
  \draw[traj={0.10}{0.60}] (0,0) circle(\A); % (\ang:\A) arc(\ang:\ang-360:\A);
  \draw[traj={0.40}{0.90}] (0,0) circle(\a);
  \draw[traj={0.40}{0.90}] (0,0) circle(0.75*\A);
  \draw[traj={0.40}{0.90}] (0,0) circle(0.25*\A);
  \tick{0,-\A-0.01}{0}; %node[left=-1,scale=1] {$A$};
  \tick{0, \A+0.01}{0} node[above=4,left=-2,scale=0.95] {$\omega A$};
  \tick{0,-\a-0.01}{0};
  \tick{0, \a+0.01}{0} node[above=4,left=-5,scale=0.95] {$\omega A'$};
  \tick{-\A-0.01,0}{90};
  \tick{-\a-0.01,0}{90};
  \tick{ \A+0.01,0}{90} node[right=3,below=-3,scale=0.95] {$A$};
  \tick{ \a+0.01,0}{90} node[right=3,below=-3,scale=0.95] {$A'$};
  \fill[myred!50!black] (R) circle (0.06) node[above right=-1] {$(x_0,v_0)$};
  \fill[myred!50!black] (R') circle (0.06); %node[below right=-2] {$(x_1,0)$};
  %\draw[->,mygreen!80!black] (\ang-15:1.1*\A) arc(\ang-15:\ang-40:0.9*\A);
  %\draw[->,mygreen!80!black] (-18:1.2*\a) arc(-18:-60:\a);
\end{tikzpicture}


% PHASE DIAGRAM - parameter
\begin{tikzpicture}
  \def\xmax{2.0}
  \def\A{1.5}
  \def\ang{50}
  \def\ry#1{\A*sin(\ang)*sqrt(1/(1-(cos(\ang)/#1)^2))}
  %\def\rell#1{ {#1*\A} and {\A*sin(\ang)*sqrt(1/(1-(cos(\ang)/#1)^2))} }
  \coordinate (O) at (0,0);
  \coordinate (X) at (\A,0);
  \coordinate (R) at (\ang:\A);
  \draw[->,thick] (-1.12*\xmax,0) -- (1.12*\xmax+0.1,0) node[right=-1] {$x$\,[m]};
  \draw[->,thick] (0,-\xmax) -- (0,\xmax+0.1) node[above=-1] {$v$\,[m/s]};
  %\draw[xline] (0,0) circle(\A);
  \draw[traj={0.055}{0.555},mypurple]
    (0,0) ellipse({0.85*\A} and \ry{0.85});
  \draw[traj={0.07}{0.57},mypurple]
    (0,0) ellipse({0.5*0.85*\A} and 0.5*\ry{0.85});
  \draw[traj={0.07}{0.57}]
    (0,0) ellipse({1.25*\A} and \ry{1.25});
  \draw[traj={0.07}{0.57}]
    (0,0) ellipse({0.5*1.25*\A} and 0.5*\ry{1.25});
  \fill[myred!50!black] (R) circle (0.06) node[above right=-1] {$(x_0,v_0)$};
  %\draw[->,mygreen!80!black] (\ang-15:1.1*\A) arc(\ang-15:\ang-40:0.9*\A);
  \node[above left,mypurple!80!black] at (110:\A) {large $\omega$};
  \node[below right,xcol!80!black] at (-35:\A) {small $\omega$};
\end{tikzpicture}


% PHASE DIAGRAM - damped
\begin{tikzpicture}
  \def\xmax{2.0}
  \def\A{1.7}
  \def\a{0.8}
  \def\ang{60}
  \def\T{0.5}  % decay constant tau
  \def\om{2.5} % decay constant tau
  \coordinate (O) at (0,0);
  \coordinate (X) at (\A,0);
  \draw[->,thick] (-\xmax,0) -- (\xmax+0.1,0) node[right=-1] {$x$\,[m]};
  \draw[->,thick] (0,-\xmax) -- (0,\xmax+0.1) node[above=-1] {$v$\,[m/s]};
  \draw[->,xline,samples=100,variable=\t]
    plot[domain=0:0.06]({\A*exp(-\t/\T)*cos(360*\om*\t)},{-\A*exp(-\t/\T)*sin(360*\om*\t)})
    --++ (-150:0.08);
  \draw[->,xline,samples=100,variable=\t]
    plot[domain=0.05:0.34]({\A*exp(-\t/\T)*cos(360*\om*\t)},{-\A*exp(-\t/\T)*sin(360*\om*\t)})
    --++ (-40:0.08);
  \draw[xline,samples=200,variable=\t] %,line cap=round
    plot[domain=0.3:2.1]({\A*exp(-\t/\T)*cos(360*\om*\t)},{-\A*exp(-\t/\T)*sin(360*\om*\t)});
  \tick{0,-\A-0.01}{0} node[left=-2,scale=1] {$-\omega_0 A_0$};
  \tick{0, \A+0.01}{0} node[left=-2,scale=1] {$\omega_0 A_0$};
  \tick{-\A-0.01,0}{90} node[below=0,scale=1] {$-A_0$};
  \tick{ \A+0.01,0}{-90} node[right=5,below=3,scale=1] {$A_0$};
  \fill[myred!50!black] (X) circle (0.06) node[above=2] {$(x_0,0)$};
  %\draw[->,mygreen!80!black] (-20:1.05*\A) arc(-20:-55:0.6*\A);
\end{tikzpicture}


% PHASE DIAGRAM - pendulum
% https://tex.stackexchange.com/questions/545590/phase-portrait-of-van-der-pol-oscillator-with-pgfplots
% http://matlab.cheme.cmu.edu/2011/08/09/phase-portraits-of-a-system-of-odes/
\begin{tikzpicture}[scale=0.9]
  \def\xmax{6.75}
  \def\ymax{3.15}
  \def\traj#1#2#3#4#5{
    \addplot[thin,xcol,postaction={decorate},decoration={markings,
             mark=at position #2 with {\arrow[thick,rotate=#4]{>}},
             mark=at position #3 with {\arrow[thick,rotate=#4]{>}}},#1]
      table {dynamics_pendulum/data/pendulum_phase-#5.txt};
    \addplot[xline,#1] table {dynamics_pendulum/data/pendulum_phase-#5.txt};
  }
  \def\pend#1#2{
    \def\R{0.55}
    \draw[mydarkblue,line width=0.9] ({(#1/180)*pi},-3.1) coordinate (O) --++ (#1-90:\R) coordinate(M);
    \draw[mydashed] (O) --++ (0,-0.9*\R) coordinate(B);
    \fill[mydarkblue!80!black] (O) circle(0.03);
    \draw[mydarkred,fill=myred] (M) circle(0.08);
    \ifnumcomp{#1}{>}{40}{
      \draw pic[-{>[flex'=1]},"$#2$"{scale=0.8},draw=black,angle radius=5,angle eccentricity=1.8] {angle = B--O--M};
    }{\ifnumcomp{#1}{<}{-40}{
      \draw pic[{<[flex'=1]}-,"$#2$"{scale=0.8},draw=black,angle radius=5,angle eccentricity=2.2] {angle = M--O--B};
    }{}}
  }
  \draw[->,thick] (-\xmax,0) -- (\xmax+0.1,0) node[right=-1] {$\theta$ [rad]};
  \draw[->,thick] (0,-\ymax) -- (0,\ymax+0.1) node[above=-2] {$\dot{\theta}$\,[rad/s]}; %\dfrac{\dd{\theta}}{\dd{t}}
  \begin{axis}[
      axis lines=none,anchor=origin,x=1cm,y=1cm,
      xmin=-2*pi,xmax=2*pi
    ]
    
    % CLOSED TRAJECTORIES
    \traj{}{0.150}{0.62}{9}{0p4}
    \traj{}{0.147}{0.61}{5}{0p8}
    \traj{}{0.145}{0.61}{2}{1p2}
    \traj{}{0.152}{0.64}{3}{1p6}
    \traj{myred}{0.130}{0.605}{0}{2p0}
    \begin{scope}[x filter/.code={\pgfmathparse{\pgfmathresult+2*pi}}]
      \traj{}{0.62}{0.81}{10}{0p4}
      \traj{}{0.61}{0.81}{5}{0p8}
      \traj{}{0.61}{0.82}{3}{1p2}
      \traj{}{0.64}{0.87}{0}{1p6}
      \traj{myred}{0.605}{0.858}{0}{2p0}
    \end{scope}
    \begin{scope}[x filter/.code={\pgfmathparse{\pgfmathresult-2*pi}}]
      \traj{}{0.150}{0.360}{10}{0p4}
      \traj{}{0.147}{0.360}{5}{0p8}
      \traj{}{0.145}{0.360}{3}{1p2}
      \traj{}{0.152}{0.382}{0}{1p6}
      \traj{myred}{0.130}{0.388}{0}{2p0}
    \end{scope}
    \draw[myred,very thick] (-pi-0.05,0) -- (-pi+0.05,0);
    \draw[myred,very thick] (pi-0.05,0) -- (pi+0.05,0);
    
    % OPEN TRAJECTORIES
    \traj{mypurple}{0.20}{0.80}{0}{2p4}
    \traj{mypurple}{0.20}{0.80}{0}{2p8}
    \begin{scope}[x filter/.code={\pgfmathparse{-\pgfmathresult}},
                  y filter/.code={\pgfmathparse{-\pgfmathresult}}]
      \traj{mypurple}{0.20}{0.80}{0}{2p4}
      \traj{mypurple}{0.20}{0.80}{0}{2p8}
    \end{scope}
    %\draw[->,thick] (-3*pi,0) -- (3*pi,0);
    
  \end{axis}
  \tick{-pi,0}{90} node[left=0.5,below=-4,scale=0.9] {\strut$-\pi$};
  \tick{ pi,0}{90} node[below=-4,scale=0.9] {\strut$\pi$};
  \tick{-2*pi,0}{90} node[left=4,below=-4,scale=0.9] {\strut\contour{white}{$-2\pi$}};
  \tick{ 2*pi,0}{90} node[right=1,below=-4,scale=0.9] {\strut\contour{white}{$2\pi$}};
  \tick{ 0, 2}{ 0} node[above=4.8,left=-6,scale=0.9] {$2\omega_0$};
  \tick{ 0,-2}{ 0} node[below=4.8,left=-6,scale=0.9] {$-2\omega_0$};
  \node[mydarkblue,scale=0.8,rotate=-57] at (1.92,0.69) {closed};
  \node[mydarkred,scale=0.8,rotate=-45] at (2.60,0.83) {separatrix};
  \node[mypurple,scale=0.8] at (3.1,2.20) {open};
  
  \pend{ 335}{};
  \pend{ 270}{};
  \pend{180}{\pi};
  \pend{  90}{}; %\;\; \dfrac{\pi}{2}
  \pend{  25}{};
  \pend{ -25}{};
  \pend{ -90}{};
  \pend{-180}{-\pi};
  \pend{-270}{};%-\dfrac{\pi}{2}\;\;\;
  \pend{-335}{};
  
\end{tikzpicture}


\end{document}

Click to download: dynamics_phaseportrait.texdynamics_phaseportrait.pdf
Open in Overleaf: dynamics_phaseportrait.tex

Leave a Reply

Your email address will not be published.