绘制 3 系统微分方程轨迹

绘制 3 系统微分方程轨迹

我正在阅读有关使用乳胶绘制微分方程轨迹的文章,但我想知道......有没有办法绘制这个图形?

考虑系统

x'=-y+xz^2
y'=x+yz^2
z'=-z(x^2+y^2)

下面的图片是我从 Perko 的书《微分方程和动力系统》中摘取的

在此处输入图片描述

答案1

pst-ode可以使用程序包(RKF45 方法)对 ODE 进行数值求解。

分别使用初始条件 (1e-9, 0, -1) 和 (1e-9, 0, 1) 对下半空间和上半空间分别求解给定方程。积分参数从 0 运行到 35。为了获得平滑的外观,每个轨迹以 500 个点输出解决方案向量。

latex+ dvips+ps2pdf或排版lualatex

输出点处的解向量以表格形式写入带有XYZ.dat选项的文本文件saveData\pstODEsolve[saveData, ...]{XYZ}{0 1 2}...这样就可以使用不同的绘图包,例如pgfplots。在这种情况下Ps2pdf必须使用选项 调用。-dNOSAFERps2pdf -dNOSAFER ...

在此处输入图片描述

\documentclass{standalone}

\usepackage{pst-ode,pst-3dplot}

\begin{document}

\begin{pspicture}(-2,-2)(2,2.2)%
%\pstThreeDSphere[fillstyle=solid,opacity=0.0,linewidth=0.1pt](0,0,0){1}
% lower half-space
\pstODEsolve[algebraic]{XYZa}{0 1 2}{0}{35}{500}{1e-9 0.0 -1.0}{
  -x[1]+x[0]*x[2]^2 |
  x[0]+x[1]*x[2]^2 |
  -x[2]*(x[0]^2+x[1]^2)
}
\listplotThreeD[linecolor=blue]{XYZa}
\pstThreeDCoor[xMin=-2,xMax=2,yMin=-2,yMax=2,zMin=-2,zMax=2,IIIDticks]
% upper half-space
\pstODEsolve[algebraic]{XYZb}{0 1 2}{0}{35}{500}{1e-9 0.0 1.0}{
  -x[1]+x[0]*x[2]^2 |
  x[0]+x[1]*x[2]^2 |
  -x[2]*(x[0]^2+x[1]^2)
}
  \listplotThreeD[linecolor=green,linewidth=0.4pt]{XYZb}
\end{pspicture}

\end{document}

动画展示积分参数从 0 到 35:

在此处输入图片描述

\documentclass[export]{standalone}

\usepackage{animate}
\usepackage{pst-ode,pst-3dplot}

\begin{document}

\begin{animateinline}{10}
\multiframe{71}{i=0+1,rt=0+0.5}{  
  \begin{pspicture}(-2,-2)(2,2.2)%
  %\pstThreeDSphere[fillstyle=solid,opacity=0.0,linewidth=0.1pt](0,0,0){1}
  % lower half-space
  \pstODEsolve[algebraic]{XYZa}{0 1 2}{0}{\rt}{500}{1e-9 0.0 -1.0}{
    -x[1]+x[0]*x[2]^2 |
    x[0]+x[1]*x[2]^2 |
    -x[2]*(x[0]^2+x[1]^2)
  }
  \ifnum\i>20
    \listplotThreeD[arrows=->, linecolor=blue]{XYZa}
  \else  
    \listplotThreeD[linecolor=blue]{XYZa}
  \fi
  \pstThreeDCoor[xMin=-2,xMax=2,yMin=-2,yMax=2,zMin=-2,zMax=2,IIIDticks]
  % upper half-space
  \pstODEsolve[algebraic]{XYZb}{0 1 2}{0}{\rt}{500}{1e-9 0.0 1.0}{
    -x[1]+x[0]*x[2]^2 |
    x[0]+x[1]*x[2]^2 |
    -x[2]*(x[0]^2+x[1]^2)
  }
  \ifnum\i>20
    \listplotThreeD[arrows=->, linecolor=green, linewidth=0.4pt]{XYZb}
  \else  
    \listplotThreeD[linecolor=green, linewidth=0.4pt]{XYZb}
  \fi
  \end{pspicture}
}
\end{animateinline}

\end{document}

并且对上图的初始条件稍作修改 (1e-9, 0.0, 1.0) --> (-1e-9, 0.0, 1.0):

在此处输入图片描述

相关内容