summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-08-16 22:48:03 +0000
committerKarl Berry <karl@freefriends.org>2012-08-16 22:48:03 +0000
commit9eafcfc80979b4c1fed5bdcf48308fccdbf8b56e (patch)
treee6a7979c4f1fe7af3b2c1596b9ca63a20d095efe
parenteb49231093d1336c3166b1b979ad69342430b282 (diff)
new pstricks package pst-ode (16aug12)
git-svn-id: svn://tug.org/texlive/trunk@27431 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/ChangeLog2
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/README15
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/lorenz.tex46
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/ode.tex18
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/particle.tex55
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.pdfbin0 -> 121611 bytes
-rw-r--r--Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.tex291
-rw-r--r--Master/texmf-dist/dvips/pst-ode/pst-ode.pro136
-rw-r--r--Master/texmf-dist/tex/generic/pst-ode/pst-ode.tex192
-rw-r--r--Master/texmf-dist/tex/latex/pst-ode/pst-ode.sty5
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-pstricks.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/pst-ode.tlpsrc0
13 files changed, 762 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/generic/pst-ode/ChangeLog b/Master/texmf-dist/doc/generic/pst-ode/ChangeLog
new file mode 100644
index 00000000000..a56317fdb42
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/ChangeLog
@@ -0,0 +1,2 @@
+2012-08-16
+ * initial release (v0.1) to CTAN
diff --git a/Master/texmf-dist/doc/generic/pst-ode/README b/Master/texmf-dist/doc/generic/pst-ode/README
new file mode 100644
index 00000000000..428d9b6d409
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/README
@@ -0,0 +1,15 @@
+==========================
+ pst-ode PSTricks package
+==========================
+
+Alexander Grahn, (c) 2012
+
+
+`pst-ode' defines \pstODEsolve for solving initial value problems for sets
+of Ordinary Differential Equations (ODE) using the Runge-Kutta-Fehlberg
+(RKF45) method with automatic step size adjustment.
+
+
+This material is subject to the LaTeX Project Public License. See
+ http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+for the details of that license.
diff --git a/Master/texmf-dist/doc/generic/pst-ode/lorenz.tex b/Master/texmf-dist/doc/generic/pst-ode/lorenz.tex
new file mode 100644
index 00000000000..3150ec923bb
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/lorenz.tex
@@ -0,0 +1,46 @@
+\documentclass{article}
+\usepackage{pst-ode,pst-3dplot}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}%
+
+\begin{document}
+\begin{center}
+\pstVerb{
+ /alpha 10 def
+ /beta 28 def
+ /gamma 8 3 div def
+}%
+\pstODEsolve[algebraic]{lorenzXYZ}{0 1 2}{0}{25}{2501}{10 10 30}{
+ alpha*(x[1]-x[0]) |
+ x[0]*(beta-x[2]) - x[1] |
+ x[0]*x[1] - gamma*x[2]
+}
+\begin{pspicture}(-6,-2)(6,10)
+\psset{unit=0.17cm,Alpha=160,Beta=15}
+\listplotThreeD{lorenzXYZ}
+\psset{unit=0.425cm,linestyle=dashed}
+\pstThreeDNode(0,0,0){O}
+\pstThreeDNode(0,0,5){Z}
+\pstThreeDNode(5,0,0){X}
+\pstThreeDNode(0,5,0){Y}
+\pstThreeDNode(-10,-10,0){A}
+\pstThreeDNode(-10,-10,20){B}
+\pstThreeDNode(-10,10,20){C}
+\pstThreeDNode(-10,10,0){D}
+\pstThreeDNode(10,-10,0){E}
+\pstThreeDNode(10,-10,20){F}
+\pstThreeDNode(10,10,20){G}
+\pstThreeDNode(10,10,0){H}
+\pspolygon(A)(B)(C)(D)
+\pspolygon(E)(F)(G)(H)
+\psline(A)(E)
+\psline(B)(F)
+\psline(D)(H)
+\psline(C)(G)
+\psset{linestyle=solid,linecolor=red}
+\psline{->}(O)(X)
+\psline{->}(O)(Y)
+\psline{->}(O)(Z)
+\end{pspicture}
+\end{center}
+\end{document}
diff --git a/Master/texmf-dist/doc/generic/pst-ode/ode.tex b/Master/texmf-dist/doc/generic/pst-ode/ode.tex
new file mode 100644
index 00000000000..59d529f3bce
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/ode.tex
@@ -0,0 +1,18 @@
+\documentclass{article}
+\usepackage{pst-ode,pst-plot}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}%
+
+\begin{document}
+\begin{center}
+\psset{unit=3cm}
+\begin{pspicture}(-0.3,-0.4)(.2,1)
+ \psset{xAxisLabelPos={c,-5ex},yAxisLabelPos={-3ex,c}}
+ \begin{psgraph}[axesstyle=frame,Ox=-1,](0,0)(0,0)(4,1){10cm}{2.5cm}
+ \rput(1,0){\psplot[algebraic]{-1}{3}{Euler^(-x^2)}}
+ \pstODEsolve[algebraicIC,algebraic]{TY}{(t) 0}{-1}{3}{5}{1/Euler}{-2*t*y[0]}
+ \rput(1,0){\listplot[plotstyle=dots,dotsize=0.05,linecolor=red]{TY}}
+ \end{psgraph}
+\end{pspicture}
+\end{center}
+\end{document}
diff --git a/Master/texmf-dist/doc/generic/pst-ode/particle.tex b/Master/texmf-dist/doc/generic/pst-ode/particle.tex
new file mode 100644
index 00000000000..b1010b08c32
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/particle.tex
@@ -0,0 +1,55 @@
+\documentclass{article}
+\usepackage{pst-ode,pst-3dplot}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}%
+
+\begin{document}
+\begin{center}
+\psset{unit=0.74cm,Alpha=40,Beta=20}
+\begin{pspicture}(-10,-2)(6,13)
+\newpsstyle{vecteurA}{arrowinset=0.1,arrowsize=0.15,linecolor={[rgb]{0 0.5 1}}}
+\pstVerb{
+ /wc 5 def
+ /tau 5 def
+ /vx 20 def
+ /vz 2 def
+}
+\pstODEsolve[algebraic]{particleXYZ}{0 1 2}{0}{25}{1000}{0 0 0 vx 0 vz}{
+ y[3] | y[4] | y[5] | wc*y[4] - y[3]/tau | -wc*y[3] - y[4]/tau | -y[5]/tau
+}
+\listplotThreeD{particleXYZ}
+\pstThreeDNode(0,0,0){O}
+\pstThreeDNode(0,0,1){Z}
+\pstThreeDNode(1,0,0){X}
+\pstThreeDNode(0,1,0){Y}
+\pstThreeDNode(-5,-9,0){A}
+\pstThreeDNode(-5,-9,10){B}
+\pstThreeDNode(-5,2,10){C}
+\pstThreeDNode(-5,2,0){D}
+\pstThreeDNode(5,-9,0){E}
+\pstThreeDNode(5,-9,10){F}
+\pstThreeDNode(5,2,10){G}
+\pstThreeDNode(5,2,0){H}
+\pstThreeDNode(0,0,0){M0}
+\pstThreeDNode(vx 5 div,0,vz 5 div){V}
+\pstThreeDNode(vx 5 div,0,0){Vx}
+{\psset{linestyle=dashed}
+\pspolygon(A)(B)(C)(D)
+\pspolygon(E)(F)(G)(H)
+\psline(A)(E)
+\psline(B)(F)
+\psline(D)(H)
+\psline(C)(G)}%
+\psline[linecolor=red]{->}(M0)(V)
+\psline[linecolor=cyan]{->}(M0)(Vx)
+\uput{0.1}[l](V){\red$\overrightarrow{v}_0$}
+{\psset{linestyle=solid,linecolor=red}
+\psline[style=vecteurA]{->}(O)(X)
+\psline[style=vecteurA]{->}(O)(Y)
+\psline[style=vecteurA]{->}(O)(Z)}%
+\uput[u](Z){$z$}
+\uput[dl](X){$x$}
+\uput[r](Y){$y$}
+\end{pspicture}
+\end{center}
+\end{document}
diff --git a/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.pdf b/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.pdf
new file mode 100644
index 00000000000..6e51efc0675
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.tex b/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.tex
new file mode 100644
index 00000000000..0139f79811f
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pst-ode/pst-ode-doc.tex
@@ -0,0 +1,291 @@
+\documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings
+ headexclude,footexclude,oneside,dvips]{pst-doc}
+\usepackage[UKenglish]{babel}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{attachfile2}
+\attachfilesetup{date={},color=1 0 0}
+\usepackage[latin1]{inputenc}
+\usepackage{amsmath}
+\usepackage{pst-3dplot}
+\usepackage{pst-plot}
+\usepackage{pst-ode}
+\let\pstFV\fileversion
+\let\belowcaptionskip\abovecaptionskip
+
+\makeatletter
+\renewcommand*\l@subsection{\bprot@dottedtocline{2}{1.5em}{3.6em}}
+\renewcommand*\l@subsubsection{\bprot@dottedtocline{3}{3.8em}{4.5em}}
+\makeatother
+
+\def\bgImage{%
+\pstVerb{
+ /alpha 10 def
+ /beta 28 def
+ /gamma 8 3 div def
+}%
+\pstODEsolve[algebraic]{lorenzXYZ}{0 1 2}{0}{25}{2501}{10 10 30}{
+ alpha*(x[1]-x[0]) |
+ x[0]*(beta-x[2]) - x[1] |
+ x[0]*x[1] - gamma*x[2]
+}
+\begin{pspicture}(-8,-4)(6,12)
+\psset{unit=0.17cm,Alpha=160,Beta=15}
+\listplotThreeD{lorenzXYZ}
+\psset{unit=0.425cm,linestyle=dashed}
+\pstThreeDNode(0,0,0){O}
+\pstThreeDNode(0,0,5){Z}
+\pstThreeDNode(5,0,0){X}
+\pstThreeDNode(0,5,0){Y}
+\pstThreeDNode(-10,-10,0){A}
+\pstThreeDNode(-10,-10,20){B}
+\pstThreeDNode(-10,10,20){C}
+\pstThreeDNode(-10,10,0){D}
+\pstThreeDNode(10,-10,0){E}
+\pstThreeDNode(10,-10,20){F}
+\pstThreeDNode(10,10,20){G}
+\pstThreeDNode(10,10,0){H}
+\pspolygon(A)(B)(C)(D)
+\pspolygon(E)(F)(G)(H)
+\psline(A)(E)
+\psline(B)(F)
+\psline(D)(H)
+\psline(C)(G)
+\psset{linestyle=solid,linecolor=red}
+\psline{->}(O)(X)
+\psline{->}(O)(Y)
+\psline{->}(O)(Z)
+\end{pspicture}
+}
+\lstset{explpreset={pos=l,width=-99pt,overhang=0pt,hsep=\columnsep,vsep=\bigskipamount,rframe={}},
+ escapechar=?}
+\def\textat{\char064}%
+\let\verbI\texttt
+
+
+\def\parsedate#1/#2/#3\relax{
+ \def\year{#1}
+ \def\month{#2}
+ \def\day{#3}
+}
+
+\begin{document}
+\author{Alexander Grahn}
+\expandafter\parsedate\filedate\relax %set current date to package date
+\title{pst-ode}
+\subtitle{A PSTricks package for solving initial value problems for sets of Ordinary Differential Equations (ODE), v\pstFV}
+\maketitle
+
+\tableofcontents
+
+%\clearpage
+\begin{abstract}
+ \noindent The \LPack{pstricks-add} package already provides \Lcs{psplotDiffEqn} for solving ODEs. However, as its name suggests, the macro always produces a plot of the computed result. While any number of coupled differential equations can be integrated simultaneously, only two-dimensional plots are supported. The user has to select the two components of the computed state vectors to be used in the plot. Package \LPack{pst-ode} separates solving the equations from plotting the result. The result is stored as a \PS{} object and can be plotted later using macros from other PSTricks packages, such as \Lcs{listplot} (\LPack{pst-plot}) and \Lcs{listplotThreeD} (\LPack{pst-3dplot}), or be further processed by user-defined \PS{} procedures. Optionally, the computed state vectors can be written as a table to a textfile.
+
+Package \LPack{pst-ode} uses the Runge-Kutta-Fehlberg (RKF45) method with automatic step size control for integrating the differential equations. Thus, the precision of the result does not depend on the number of plotpoints specified, as it would be the case with the classical Runge-Kutta (RK4) method.
+\end{abstract}
+
+\section{Introduction}
+An initial value problem involves finding the solution $\mathbf{x}=f(t)$ of a set of first order differential equations
+\begin{equation}
+ \frac{\mathrm{d}\mathbf{x}}{\mathrm{d}t}=\mathbf{f}(t,\mathbf{x})
+\end{equation}
+by integrating them with respect to the independent variable $t$ starting at $t_0$ up to $t_\mathrm{e}$. If the set consists of $n$ differential equations,
+a vector of initial conditions
+\begin{equation}
+ \mathbf{x}(t_0)=\mathbf{x}_0
+\end{equation}
+of the same length $n$ is required. For $n=1$ the initial value problem is one-dimensional:
+\begin{gather}
+ \frac{\mathrm{d}x}{\mathrm{d}t}=f(t,x)\quad\text{for}\ t \in [t_0, t_\mathrm{e}]\text{, where}\label{eq:1dode}\\
+ x(t_0) = x_0.\label{eq:1ini}
+\end{gather}
+
+Instead of producing analytical expressions of the solution functions $\mathbf{x}(t)$, the numerical method gives only approximate values $\mathbf{x}_i$ at $N$ discrete points $t_i$ of the integration interval $I=[t_0, t_\mathrm{e}]$:
+\begin{equation}
+\mathbf{x}_i\approx\mathbf{x}(t_i).
+\end{equation}
+The computed approximations $\mathbf{x}_i$ of the solution as well as the initial condition vector $\mathbf{x}_0$ are called `state vectors'. In the case of a single equation problem, Eqs.~\eqref{eq:1dode}, \eqref{eq:1ini}, the state vectors have only one component.
+
+\section{Commands}
+\begin{BDef}
+ \Lcs{pstODEsolve}\OptArgs\Largb{result}\Largb{output format}\Largb{$t_0$}\Largb{$t_\mathrm{e}$}\Largb{$N$}\Largb{$\mathbf{x}_0$}\Largb{$\mathbf{f}(t,\mathbf{x})$}
+\end{BDef}
+is the main user command for solving initial value problems.
+
+The first mandatory argument \Larg{result} is a simple identifier composed of letters and possibly numbers. It is used to create a \PS{} object of the same name, which takes the computed state vectors $\mathbf{x}_i$, formatted according to the second argument \Larg{output format}, as a long list of values. \Larg{result} can be directly used as the \Larg{data} argument of \Lcs{listplot}\Largb{data} (package \LPack{pst-plot}) or \Lcs{listplotThreeD}\Largb{data} (package \LPack{pst-3dplot}). When put on the \PS{} operand stack, \Larg{result} is immediately executed, that is, the list of values contained in \Larg{result} is pushed onto the operand stack. The scope of \Larg{result} is global and thus its content survives page breaks.
+
+The second argument \Larg{output format} determines which of the components of the state vectors $\mathbf{x}_i$ and possibly the independent variable $t$ are stored into \Larg{result}. The keyword \Lkeyword{(t)} (parentheses required) inserts the integration parameter value $t_i$ into the result list; numbers (\Lkeyword{0}, \Lkeyword{1}, \Lkeyword{2}, \dots, $n-1$) in arbitrary order specify the components of vector $\mathbf{x}_i$ to be inserted, as well as their order of insertion. The elements of \Larg{output format} are to be separated by spaces.
+
+Arguments $t_0$ and $t_\mathrm{e}$ define the interval of integration $I=[t_0, t_\mathrm{e}]$.
+
+$N$ is the number of \emph{equally} spaced output points, including $t_0$ and $t_\mathrm{e}$; it must be $\ge 2$. In order to divide the interval of integration into $K$ output steps, $N$ must be set to $K+1$. Note that the precision of the solution does \emph{not} depend on $N$; internal integration steps are automatically inserted and resized according to the changes in the solution.
+
+$\mathbf{x}_0$ is a list of $n$ space separated initial values, one for each differential equation. Alternatively, $\mathbf{x}_0$ can be given as a \PS{} procedure pushing the initial values on the stack, or as an algebraic expression where the elements are separated by `\Lkeyword{|}'. Algebraic notation requires option \Lkeyword{algebraicIC}. This argument can be left empty. In that case, the last computed state vector of the preceding \Lcs{pstODEsaveState} call is used as initial condition. Of course, the number of equations $n$ must be the same as in the preceding calculation.
+
+$\mathbf{f}(t,\mathbf{x})$ is the right-hand side of the differential equations. Equations can be entered in either algebraic or \PS{} notation. Algebraic notation requires option \Lkeyword{algebraic}, and equations have to be separated by `\Lkeyword{|}'. The $n$ current state vector components can be referred to as \Lkeyword{x[0]}, \Lkeyword{x[1]}, \dots, \Lkeyword{x[}$n-1$\Lkeyword{]} or \Lkeyword{y[0]}, \Lkeyword{y[1]}, \dots, \Lkeyword{y[}$n-1$\Lkeyword{]}, and the current independent variable value as `\Lkeyword{t}'. If given in \PS{} notation, the provided procedure must first pop the current state vector components in reverse order(!) from the operand stack and then push the first derivatives in regular order back to it. Again, the independent variable value can be accessed using `\Lkeyword{t}'.\\[1ex]
+\Lcs{pstODEsolve} accepts a few \OptArgs: \Lkeyword{append}, \Lkeyword{saveData}, \Lkeyword{algebraicIC}, \Lkeyword{algebraic}, \Lkeyword{silent} and \Lkeyword{varsteptol}.
+
+With \Lkeyword{append}, the computed result is appended to \Larg{result} which must already exist, e.\, g. from a previous use of \Lcs{pstODEsolve}. Usually, the initial condition vector argument is left empty in order to continue integration from the last computed or from a restored state (see \Lcs{pstODEsetOrRestoreState}).
+
+If option \Lkeyword{saveData} is set, the formatted state vectors are written as a table to a textfile named `\Larg{result}\Lkeyword{.dat}'. Note that \Lkeyword{ps2pdf} must be called with option \Lkeyword{-dNOSAFER} to enable writing of external files.
+
+With \Lkeyword{algebraicIC}, the initial condition vector $\mathbf{x}_0$ can be given in algebraic notation. Vector components have to be separated by `\Lkeyword{|}'. Default is \PS{} notation.
+
+With \Lkeyword{algebraic}, the right-hand side of differential equations $\mathbf{f}(t,\mathbf{x})$ can be given in algebraic notation. Equations are to be separated by `\Lkeyword{|}'. Default is \PS{} notation.
+
+Option \Lkeyword{silent} suppresses the terminal output of stepping information.
+
+The tolerance for the automatic integration step size calculation can be set with \Lkeyword{varsteptol} \Lkeyword{=}\Larg{value}. The default value is \Lkeyword{1e-6}. It may be necessary to enlarge it using this option in cases that fail with `\Lkeyword{error: step size underflow in ODEINT}'.\\[1ex]
+
+\begin{BDef}
+\Lcs{pstODEsaveState}\Largb{state}
+\end{BDef}
+is a user command to save the last computed state vector into a \PS{} object with global scope. \Larg{state} is an identifier composed of letters and possibly numbers which is used to create the \PS{} object of the same name. The object is executable, that is, it expands to the saved values of the state vector components. It can be used as the initial condition argument $\mathbf{x}_0$ of a later \Lcs{pstODEsolve} invocation, or to restore the state vector by means of \Lcs{pstODEsetOrRestoreState}.\\[1ex]
+
+\begin{BDef}
+\Lcs{pstODEsetOrRestoreState}\Largb{state}
+\end{BDef}
+is a user command to set the current state vector from a user provided list of space separated values, or to restore a previously saved state. In the latter case, \Larg{state} is a \PS{} object previously created with \Lcs{pstODEsaveState}. After setting or restoring a state, \Lcs{pstODEsolve} can be called with an empty initial condition argument. Of course, the number of differential equations and the length of the set or restored state vector must match.
+
+\section{Examples}
+\subsection[Lorenz Attractor]{Lorenz Attractor (\textattachfile{lorenz.tex}{lorenz.tex})}
+The Lorenz Attractor depicted on the title page is governed by
+\begin{align*}
+ \frac{\mathrm{d}x}{\mathrm{d}t}& = \alpha (y-x)\\
+ \frac{\mathrm{d}y}{\mathrm{d}t}& = x(\beta-z)-y\\
+ \frac{\mathrm{d}z}{\mathrm{d}t}& = x y - \gamma z.
+\end{align*}
+This system of differential equations is known to display chaotic behaviour due to the non-linear combination (products) of the dependent functions $x(t)$, $y(t)$ and $z(t)$. The trajectory of solution is susceptible to slight changes in the initial conditions and hence to slight discrepancies in the computed intermediate state vectors, which in turn can be regarded as initial conditions for the continuation of the solution. This is known as the `butterfly effect', a term coined by Lorenz. Although an adaptive stepping algorithm is used, the solution of this initial problem \emph{does} therefore depend on the number of output points chosen. To some extent, this fact contrasts with the statement made in the abstract of this documentation. However, for linear problems which only know one distinct solution it still holds. In the present case, the values $\alpha=10$, $\beta=28$, $\gamma=8/3$ and the initial condition $\mathbf{x}_0=(10,10,30)$ where chosen. The integration parameter $t$ is running from $0$ to $25$ and the state vector is output at $2501$ points of the integration interval.
+
+\begin{verbatim}
+\pstVerb{
+ /alpha 10 def
+ /beta 28 def
+ /gamma 8 3 div def
+}
+\pstODEsolve[algebraic]{lorenzXYZ}{0 1 2}{0}{25}{2501}{10 10 30}{
+ alpha*(x[1]-x[0]) |
+ x[0]*(beta-x[2]) - x[1] |
+ x[0]*x[1] - gamma*x[2]
+}
+\listplotThreeD{lorenzXYZ}
+\end{verbatim}
+As the plot is three-dimensional, all three components of the state vectors are stored in the \PS{} variable \Lkeyword{lorenzXYZ} by setting the \Larg{output format} argument to `\Lkeyword{0 1 2}'.
+
+\subsection[Charged particle movement in a vertical electrical field]{Charged particle movement in a vertical electrical field (\textattachfile{particle.tex}{particle.tex})}
+The trajectory $\mathbf{x}(t)$ of the particle shown below is governed by a set of three second order differential equations:
+\begin{subequations}
+\begin{align}
+\ddot{x} &= \omega\dot{y}-\dfrac{\dot{x}}{\tau}\\
+\ddot{y} &= -\omega\dot{x}-\dfrac{\dot{y}}{\tau}\\
+\ddot{z} &= -\dfrac{\dot{z}}{\tau},
+\end{align}
+\end{subequations}
+where $\omega$ and $\tau$ are constants. An initial value problem of this type needs $3\times2=6$ initial conditions. These are given as the initial position $\mathbf{x}_0=(x_0, y_0, z_0)$ and the initial velocity $\mathbf{\dot{x}}_0=(\dot{x}_0, \dot{y}_0, \dot{z}_0)=(u_0, v_0, w_0) = \mathbf{v}_0$ of the particle.
+
+In order to solve the equations above numerically, they have to be rewritten as a set of six first order differential equations:
+\begin{subequations}
+\begin{align}
+\dot{x} &= u\\
+\dot{y} &= v\\
+\dot{z} &= w\\
+\dot{u} &= \omega v-\frac{u}{\tau}\\
+\dot{v} &= -\omega u-\dfrac{v}{\tau}\\
+\dot{w} &= -\dfrac{w}{\tau}.
+\end{align}
+\end{subequations}
+
+Here, $\omega$ and $\tau$ are both set to the value of $5$, the initial position of the particle is defined as $\mathbf{x}_0=(0, 0, 0)$ and its initial velocity vector as $\mathbf{v}_0=(20, 0, 2)$. The integration parameter $t$ is running from $0$ to $25$ and the state vector is output at $1000$ points of the integration interval.
+\begin{verbatim}
+\pstVerb{
+ /wc 5 def
+ /tau 5 def
+}
+\pstODEsolve[algebraic]{particleXYZ}{0 1 2}{0}{25}{1000}{0 0 0 20 0 2}{
+ x[3] | x[4] | x[5] | wc*x[4] - x[3]/tau | -wc*x[3] - x[4]/tau | -x[5]/tau
+}
+\listplotThreeD{particleXYZ}
+\end{verbatim}
+Since we are interested in plotting the particle positions, only the first three components of the state vectors are stored in \Lkeyword{particleXYZ}.
+\begin{center}
+\psset{unit=0.8cm,Alpha=40,Beta=20}
+\begin{pspicture}(-10,-2)(6,13)
+\newpsstyle{vecteurA}{arrowinset=0.1,arrowsize=0.15,linecolor={[rgb]{0 0.5 1}}}
+\pstVerb{
+ /wc 5 def
+ /tau 5 def
+ /vx 20 def
+ /vz 2 def
+}
+\pstODEsolve[algebraic]{particleXYZ}{0 1 2}{0}{25}{1000}{0 0 0 vx 0 vz}{
+ y[3] | y[4] | y[5] | wc*y[4] - y[3]/tau | -wc*y[3] - y[4]/tau | -y[5]/tau
+}
+\listplotThreeD{particleXYZ}
+\pstThreeDNode(0,0,0){O}
+\pstThreeDNode(0,0,1){Z}
+\pstThreeDNode(1,0,0){X}
+\pstThreeDNode(0,1,0){Y}
+\pstThreeDNode(-5,-9,0){A}
+\pstThreeDNode(-5,-9,10){B}
+\pstThreeDNode(-5,2,10){C}
+\pstThreeDNode(-5,2,0){D}
+\pstThreeDNode(5,-9,0){E}
+\pstThreeDNode(5,-9,10){F}
+\pstThreeDNode(5,2,10){G}
+\pstThreeDNode(5,2,0){H}
+\pstThreeDNode(0,0,0){M0}
+\pstThreeDNode(vx 5 div,0,vz 5 div){V}
+\pstThreeDNode(vx 5 div,0,0){Vx}
+{\psset{linestyle=dashed}
+\pspolygon(A)(B)(C)(D)
+\pspolygon(E)(F)(G)(H)
+\psline(A)(E)
+\psline(B)(F)
+\psline(D)(H)
+\psline(C)(G)}%
+\psline[linecolor=red]{->}(M0)(V)
+\psline[linecolor=cyan]{->}(M0)(Vx)
+\uput{0.1}[l](V){\red$\overrightarrow{v}_0$}
+{\psset{linestyle=solid,linecolor=red}
+\psline[style=vecteurA]{->}(O)(X)
+\psline[style=vecteurA]{->}(O)(Y)
+\psline[style=vecteurA]{->}(O)(Z)}%
+\uput[u](Z){$z$}
+\uput[dl](X){$x$}
+\uput[r](Y){$y$}
+\end{pspicture}
+\end{center}
+
+\subsection[One more first order differential equation]{One more first order differential equation (\textattachfile{ode.tex}{ode.tex})}
+The aim of the last example is to demonstrate that precision does not depend on the number of output steps. Moreover, the integration parameter $t$ appears on the right-hand side and the solution is plotted against the integration parameter $t$.
+
+The equation to be solved here reads
+\begin{equation}
+y'=-2xy.
+\end{equation}
+For $y(-1)=1/e$ the analytical solution is
+\begin{equation}
+y(x)=e^{-x^2}.
+\end{equation}
+\begin{verbatim}
+\pstODEsolve[algebraicIC,algebraic]{TY}{(t) 0}{-1}{3}{5}{1/Euler}{-2*t*y[0]}
+\listplot[plotstyle=dots]{TY}
+\end{verbatim}
+The integration parameter must be referred to as `\Lkeyword{t}' when writing the right-hand side of the differential equation, because `\Lkeyword{x[..]}' is already defined as the state vector and can be used instead of `\Lkeyword{y[..]}'. The initial condition is given as an algebraic expression, which requires option \Lkeyword{algebraicIC}; in \PS{} notation it would read `\Lkeyword{1 Euler div}'. The integration parameter and the one available state vector component are stored into the \PS{} object `\Lkeyword{TY}' by setting \Larg{output format} to `\Lkeyword{(t) 0}'.
+\begin{center}
+\psset{unit=3cm}
+\begin{pspicture}(-0.3,-0.4)(.2,1)%\psgrid
+ \psset{xAxisLabelPos={c,-5ex},yAxisLabelPos={-3ex,c}}
+ \begin{psgraph}[axesstyle=frame,Ox=-1,](0,0)(0,0)(4,1){10cm}{2.5cm}
+ \rput(1,0){\psplot[algebraic]{-1}{3}{Euler^(-x^2)}}
+ \pstODEsolve[algebraicIC,algebraic]{TY}{(t) 0}{-1}{3}{5}{1/Euler}{-2*t*y[0]}
+ \rput(1,0){\listplot[plotstyle=dots,dotsize=0.05,linecolor=red]{TY}}
+ \end{psgraph}
+\end{pspicture}
+\end{center}
+The plot contains the analytical solution and the five output points of the numerical solution as red dots. They lie exactly on the analytic solution.
+
+\section{Acknowledgements}
+I'd like to thank Manuel Luque for the inspiring examples on his site \url{http://pstricks.blogspot.fr}, some of which I used as a basis for this documentation.
+\end{document}
diff --git a/Master/texmf-dist/dvips/pst-ode/pst-ode.pro b/Master/texmf-dist/dvips/pst-ode/pst-ode.pro
new file mode 100644
index 00000000000..22b347cd546
--- /dev/null
+++ b/Master/texmf-dist/dvips/pst-ode/pst-ode.pro
@@ -0,0 +1,136 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PostScript prologue for pst-ode.tex.
+% Version 0.1, 2012/07/20
+%
+% Alexander Grahn (C) 2012
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN archives
+% in directory macros/latex/base/lppl.txt.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+/tx@odeDict 1 dict def
+tx@odeDict begin
+%some constants for step size calculation
+/sfty 0.9 def /pgrow -0.2 def /pshrink -0.25 def
+%helper functions
+/addvect { % [1 2 3] [4 5 6] addvect => [5 7 9]
+ aload pop xlength1 -1 roll {xlength1 -1 roll add} forall
+ xlength array astore
+} bind def
+/subvect { % [1 2 3] [4 5 6] subvect => [-3 -3 -3]
+ aload pop xlength1 -1 roll {xlength1 -1 roll sub} forall
+ xlength array astore
+} bind def
+/mulvect { % [1 2 3] 4 mulvect => [4 8 12]
+ /mul cvx 2 array astore cvx forall xlength array astore
+} bind def
+/edivvect { % [1 2 3] [4 5 6] edivvect => [0.25 0.4 0.5]
+ aload pop xlength1 -1 roll {xlength1 -1 roll div} forall
+ xlength array astore
+} bind def
+/eabsvect { % [-1 2 -3] eabsvect => [1 2 3]
+ {abs} forall xlength array astore
+} bind def
+%/revstack { % (a) (b) (c) (d) 3 revstack => (a) (d) (c) (b)
+% -1 2 {dup 1 sub neg roll} for
+%} bind def
+/min { 2 copy gt { exch } if pop } bind def
+/max { 2 copy lt { exch } if pop } bind def
+%coefficient table (Butcher table) of RKF45
+/a41 25 216 div def /a43 1408 2565 div def
+/a44 2197 4104 div def /a45 1 5 div neg def
+/a51 16 135 div def /a53 6656 12825 div def
+/a54 28561 56430 div def /a55 9 50 div neg def
+/a56 2 55 div def
+/b21 1 4 div def /b31 3 32 div def /b32 9 32 div def
+/b41 1932 2197 div def /b42 7200 2197 div neg def /b43 7296 2197 div def
+/b51 439 216 div def /b52 8 neg def /b53 3680 513 div def
+/b54 845 4104 div neg def /b61 8 27 div neg def /b62 2 def
+/b63 3544 2565 div neg def /b64 1859 4104 div def /b65 11 40 div neg def
+%Runge-Kutta-Fehlberg (RKF45) method
+%performs one integration step over tentative step size ddt
+%[state vector x(t)] RKF45 => [x(t)] [x(t+ddt) by RKF4] errmax
+/RKF45 {
+ /t tcur def
+ dup ODESET ddt mulvect /k1 exch def
+ /t tcur ddt 4 div add def
+ dup k1 b21 mulvect addvect ODESET ddt mulvect /k2 exch def
+ /t tcur ddt 3 mul 8 div add def
+ dup k1 b31 mulvect addvect k2 b32 mulvect addvect ODESET ddt mulvect
+ /k3 exch def
+ /t tcur ddt 12 mul 13 div add def
+ dup k1 b41 mulvect addvect k2 b42 mulvect addvect k3 b43 mulvect addvect
+ ODESET ddt mulvect /k4 exch def
+ /t tcur ddt add def
+ dup k1 b51 mulvect addvect k2 b52 mulvect addvect k3 b53 mulvect addvect
+ k4 b54 mulvect addvect ODESET ddt mulvect /k5 exch def
+ /t tcur ddt 2 div add def
+ dup k1 b61 mulvect addvect k2 b62 mulvect addvect k3 b63 mulvect addvect
+ k4 b64 mulvect addvect k5 b65 mulvect addvect ODESET ddt mulvect
+ /k6 exch def % => [x(t)]
+ %fourth order solution (increment dx)
+ dup dup k1 a41 mulvect k3 a43 mulvect addvect k4 a44 mulvect addvect
+ k5 a45 mulvect addvect dup
+ % => [x(t)] [x(t)] [x(t)] [dx by RKF4] [dx by RKF4]
+ %fifth order solution (abs. error)
+ k1 a51 mulvect k3 a53 mulvect addvect k4 a54 mulvect addvect
+ k5 a55 mulvect addvect k6 a56 mulvect addvect subvect
+ % => [x(t)] [x(t)] [x(t)] [dx by RKF4] [err]
+ 5 1 roll addvect 4 -2 roll % => [x(t)] [x(t+ddt) by RKF4] [err] [x(t)]
+ %scaling vector for step size adjustment (Numerical Recipies)
+ eabsvect k1 eabsvect addvect {1e-30 add} forall xlength array astore
+ % => [x(t)] [x(t+ddt) by RKF4] [err] [xscale]
+ %maximum rel. error
+ /errmax 0 def
+ edivvect {abs dup errmax gt {/errmax exch def}{pop} ifelse} forall errmax
+ % => [x(t)] [x(t+ddt) by RKF4] errmax
+} bind def
+/ODEINT { % performs integration over output step [t,t+dt]
+ % [ state vector x(t) ] ODEINT => [ state vector x(t+dt) ]
+ %decrease overshooting step size
+ tcur ddt add tout sub tcur ddt add tout sub dt add mul 0 gt
+ {/ddt tout tcur sub def} if
+ RKF45
+ ode@tol div dup 1 gt {
+ %failed step -> reduce step size
+ exch pop pshrink exp 0.1 max sfty mul ddt mul /ddt exch def
+ (-) odeprint tcur ddt add tcur eq {
+ (error: step size underflow in ODEINT) print quit
+ } if
+ ODEINT %repeat step with new ddt
+ }{
+ %success
+ 3 -1 roll pop % remove previous state vector
+ /tcur tcur ddt add def
+ pgrow exp 5 min sfty mul ddt mul /ddt exch def
+ %output step completed?
+ tcur tout sub dt mul 0 ge {
+ (o) odeprint /tcur tout def /tout tout dt add def
+ }{
+ (+) odeprint ODEINT %continue integration
+ } ifelse
+ }ifelse
+} bind def
+/writeresult { %assembles state vector for output into file + writes it
+ outvect {
+ dup (t) eq {
+ pop tcur 20 string cvs statefile exch writestring
+ }{
+ ode@laststate exch get 20 string cvs statefile exch writestring
+ } ifelse
+ statefile ( ) writestring
+ } forall
+ statefile (\n) writestring
+} bind def
+/assembleresult { %assembles state vector for building table of results
+ outvect {
+ dup (t) eq {
+ pop tcur
+ }{
+ ode@laststate exch get
+ } ifelse
+ } forall
+} bind def
+end
diff --git a/Master/texmf-dist/tex/generic/pst-ode/pst-ode.tex b/Master/texmf-dist/tex/generic/pst-ode/pst-ode.tex
new file mode 100644
index 00000000000..fe391d0a71f
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pst-ode/pst-ode.tex
@@ -0,0 +1,192 @@
+%%
+%% This is file `pst-ode.tex',
+%%
+%% Alexander Grahn, (C) 2012
+%%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License Distributed from CTAN archives
+%% in directory macros/latex/base/lppl.txt.
+%%
+%% `pst-ode' defines \pstODEsolve for integrating systems of first order
+%% ODEs using the Runge-Kutta-Fehlberg (RKF45) method with automatic
+%% step size adjustment
+%%
+\def\fileversion{0.1}
+\def\filedate{2012/08/16}
+
+\csname PSTODELoaded\endcsname
+\let\PSTODELoaded\endinput
+%
+% Requires some packages
+\ifx\PSTricksLoaded\endinput\else \input pstricks \fi
+%
+\message{`pst-ode' v\fileversion, \filedate\space (ag)}
+%
+\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
+\pst@addfams{pst-ode}
+%% prologue for postcript
+\pstheader{pst-ode.pro}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% pstODEsolve
+%
+% LaTeX command for integrating systems of first order ODEs using the Runge-
+% Kutta-Fehlberg method with automatic step size adjustment;
+% values of the integration parameter `t' as well as the solution (= state)
+% vectors `x(t)' at output points are stored as a long list in a Postscript
+% object; its content can be plotted using the listplot* functions
+% of pst-plot and pst-3dplot packages.
+%
+% Optionally, the result can be written to a file (ps2pdf -dNOSAFER ...)
+%
+% Usage:
+%
+% \pstODEsolve[Options]
+% {result}{output vector}{ta}{tb}{number of output points}
+% {initial cond.}{function}
+%
+% options:
+% * append result appended to <result> which must already exist (e. g.
+% from previous use of \pstODEsolve); usually the initial
+% condition vector argument is left empty in order to continue
+% integration from the last state
+% * saveData result is written to file <result>.dat
+% * algebraic (system of) ODE given in infix notation
+% * silent suppress output of stepping information
+% * varsteptol relative tolerance for step size adjustment
+%
+% arguments:
+%
+% #1: Postscript identifier taking the result as a long list of state vectors
+% calculated at the output points
+% #2: output vector format, e. g. `(t) 0 1'; specifies which data to be written
+% to #1; (t) (parentheses required) puts value of integration parameter `t'
+% into the output list; 0, 1, 2, etc. specify the elements of the state
+% vector to be put into the output list
+% #3: start value of integration parameter (ta)
+% #4: end value of integration parameter (tb)
+% #5: number of output points, including ta and tb; must be >= 2
+% #6: initial condition vector; if empty, continue integration from the last
+% state vector of the previous \pstODEsolve usage or from state vector set
+% by \pstODEsetRestorestate macro
+% #7: right hand side of ODE system; if given in Postscript notation (algebraic=
+% false), the function provided should pop (in reverse order!) the elements
+% of the current state vector from the operand stack and push the first
+% derivatives (right hand side of ODE system) back to it; inside the
+% function, the integration parameter can be accessed using `t'
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\define@boolkey[psset]{pst-ode}[Pst@]{append}[true]{}%
+\define@boolkey[psset]{pst-ode}[Pst@]{saveData}[true]{}%
+\define@boolkey[psset]{pst-ode}[Pst@]{algebraicIC}[true]{}%
+\define@boolkey[psset]{pst-ode}[Pst@]{algebraic}[true]{}%
+\define@boolkey[psset]{pst-ode}[Pst@]{silent}[true]{}%
+\define@key[psset]{pst-ode}{varsteptol}{\def\ode@varsteptol{#1}}%
+\def\pstODEsolve{\def\pst@par{}\pst@object{pstODEsolve}}%
+\def\pstODEsolve@i#1#2#3#4#5#6#7{%
+ \pst@killglue%
+ \begingroup%
+ \use@par%
+ \def\filemode{w}%
+ \ifPst@append\def\filemode{a}\fi%
+ \edef\ode@init{#6{}}%
+ \edef\ode@init{\expandafter\ode@zapspace\ode@init\@nil}%
+ \edef\ode@arg{#7{}}%
+ \pstVerb{
+ tx@odeDict begin
+ \ifPst@silent
+ userdict /odeprint systemdict /pop get put
+ \else
+ userdict /odeprint {print flush} put
+ \fi
+ /ode@tol \ode@varsteptol\space def % rel. tolerance for step size adjustment
+ %process arguments
+ \ifPst@saveData /statefile (#1.dat) (\filemode) file def \fi
+ /outvect [#2] def
+ /tStart #3 def
+ /tEnd #4 def
+ /dt tEnd tStart sub #5\space 1 sub div def % output step size
+ \ifx\@empty#6\@empty\else
+ \ifPst@algebraicIC
+ true setglobal globaldict /ode@laststate [
+ tx@Dict begin (\ode@init) AlgParser cvx
+ exec end
+ ] put false setglobal
+ \else
+ true setglobal
+ globaldict /ode@laststate [tx@Dict begin 1 dict begin #6 end end] put
+ false setglobal
+ \fi
+ \fi%
+ /xlength ode@laststate length def % number of equations
+ /xlength1 xlength 1 add def % number of equations plus 1
+ \ifPst@algebraic
+ /ode@rpn (\expandafter\ode@zapspace\ode@arg\@nil) AlgParser cvx def
+ /ODESET {%system of ODEs
+ tx@Dict begin /x exch def /y x def ode@rpn end xlength array astore
+ } bind def
+ \else
+ /ODESET {
+ aload pop tx@Dict begin 0 begin #7 end end xlength array astore
+ } bind def
+ %ensure local scope of user defined variables in #7
+ /ODESET load 5 1 dict put
+ \fi
+ %perform ode integration
+ (\string\n pstODEsolve RKF45 method; '-' failed step, '+' successful step, %
+ 'o' output step : \string\n) odeprint
+ /tcur tStart def % current parameter t value
+ /tout tStart dt add def % next output t
+ /ddt dt def % initial integration step size
+ \ifPst@append\else
+ \ifPst@saveData writeresult \fi
+ [ assembleresult true setglobal ]
+ globaldict exch /#1 exch cvx put
+ false setglobal
+ (o) odeprint
+ \fi
+ #5\space 1 sub {
+ ode@laststate ODEINT [ exch aload pop true setglobal ]
+ globaldict exch /ode@laststate exch put false setglobal
+ \ifPst@saveData writeresult \fi
+ [ #1 assembleresult true setglobal ]
+ globaldict exch /#1 exch cvx put
+ false setglobal
+ } repeat
+ \ifPst@saveData statefile closefile \fi
+ end % tx@odeDict
+ }%
+ \endgroup%
+ \ignorespaces%
+}
+
+\def\ode@zapspace#1#2\@nil{% helper for stripping spaces from argument
+ \ifx#1 \relax\else#1\fi%
+ \ifx\@empty#2\@empty\else\ode@zapspace#2\@nil\fi%
+}
+
+%macro for saving last state vector into PS object
+\def\pstODEsaveState#1{% #1: identifier
+ \pstVerb{
+ true setglobal
+ globaldict /#1 [ode@laststate cvx exec] cvx put
+ false setglobal
+ }%
+}
+
+%macro for restoring state vector from PS object or setting it from
+%literal vector
+\def\pstODEsetOrRestoreState#1{% #1: identifier or
+ \pstVerb{ % space separated list of numbers
+ true setglobal
+ globaldict /ode@laststate [#1] put
+ false setglobal
+ }%
+}
+
+\psset[pst-ode]{append=false,saveData=false,algebraicIC=false,
+ algebraic=false,silent=false,varsteptol=1e-6}
+\catcode`\@=\PstAtCode\relax
+
+%% END: pst-ode.tex
+\endinput
diff --git a/Master/texmf-dist/tex/latex/pst-ode/pst-ode.sty b/Master/texmf-dist/tex/latex/pst-ode/pst-ode.sty
new file mode 100644
index 00000000000..cd60648d5a2
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/pst-ode/pst-ode.sty
@@ -0,0 +1,5 @@
+\RequirePackage{pstricks}
+\input{pst-ode.tex}
+\ProvidesPackage{pst-ode}[\filedate\space v\fileversion\space package wrapper for pst-ode.tex (ag)]
+\ProvidesFile{pst-ode.tex}[\filedate\space v\fileversion\space `pst-ode' (ag)]
+\endinput
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index 5b0f8bb633c..5eda3a2a217 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -334,7 +334,7 @@ my @TLP_working = qw(
pst-gantt pst-geo pst-gr3d pst-grad pst-graphicx
pst-infixplot pst-jtree pst-knot pst-labo pst-layout
pst-lens pst-light3d pst-magneticfield pst-math pst-mirror pst-node
- pst-ob3d pst-optexp pst-optic
+ pst-ob3d pst-ode pst-optexp pst-optic
pst-osci pst-pad pst-pdgr pst-platon pst-plot pst-poly pst-pdf pst-pulley
pst-qtree pst-rubans
pst-sigsys pst-slpe pst-solarsystem pst-solides3d pst-soroban pst-spectra
diff --git a/Master/tlpkg/tlpsrc/collection-pstricks.tlpsrc b/Master/tlpkg/tlpsrc/collection-pstricks.tlpsrc
index 6bfc05e5cb9..6d1d3152585 100644
--- a/Master/tlpkg/tlpsrc/collection-pstricks.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-pstricks.tlpsrc
@@ -54,6 +54,7 @@ depend pst-math
depend pst-mirror
depend pst-node
depend pst-ob3d
+depend pst-ode
depend pst-optexp
depend pst-optic
depend pst-osci
diff --git a/Master/tlpkg/tlpsrc/pst-ode.tlpsrc b/Master/tlpkg/tlpsrc/pst-ode.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/pst-ode.tlpsrc