答案1
本例使用PSTricks包pst-ode
以该方法对微分方程进行数值求解RKF45
。
PSTricks 需要latex
--> dvips
-->ps2pdf
工作流程进行排版。由于我们pgfplots
在这里使用,使用命令解决 ODE\pstODEsolve
被外包到辅助文档中,并将解决方案写入文件table.dat
。因此,为了排版下面列出的代码,请使用选项运行pdflatex
或。lualatex
--shell-escape
请注意,对于RKF45
,结果的精度不取决于所选的输出点数。该方法使用自适应步长控制。为了进行比较,只有 4 个输出点的解决方案(吨_0,吨_1,吨_2,吨_e) 是根据具有 250 个输出点的细粒度解决方案绘制的。
用 排版pdflatex --shell-escape example.tex
。
example.tex
:
\documentclass{standalone}
%%%%%%%%%%%%%%%%%%%%%%% solve ODE in auxiliary document %%%%%%%%%%%%%%%%%%%%%%%%
\begin{filecontents}[overwrite]{solve.tex}
\documentclass{article}
\usepackage{pst-ode}
\begin{document}
% arguments:
% algebraicAll --> all arguments in algebraic notation
% saveData --> also write result into file `table.dat'
% `table' --> PostScript variable that takes result
% t | x[0] --> output format in `table' and `table.dat'
% 0, 10 --> integration interval t_0, t_e
% 250 --> number of saved output points t_0, t_1, ..., t_e
% 10 --> initial value
% 9.81 - ... --> right-hand side of ODE
\pstODEsolve[algebraicAll,saveData]{table}{ t | y[0] }{ 0 }{ 10 }{ 250 }{ 10 }{
9.81 - 1.15*10^-3 / (58*10^-3) * y[0]^2
}
% for comparison: 4 output points
\pstODEsolve[algebraicAll,saveData]{table2}{ t | y[0] }{ 0 }{ 10 }{ 4 }{ 10 }{
9.81 - 1.15*10^-3 / (58*10^-3) * y[0]^2
}
dummy text
\end{document}
\end{filecontents}
\immediate\write18{latex solve}
\immediate\write18{dvips solve}
\immediate\write18{ps2pdf -dNOSAFER solve.ps}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel=$t$,
ylabel=$v$,
ylabel style={rotate=-90}
]
\addplot [thin,black] table {table2.dat}; % solution with 4 output points
\addplot [blue] table {table.dat};
\end{axis}
\end{tikzpicture}
\end{document}
或者,如果没有,可以在排版主文档之前手动排版--shell-escape
辅助文档:solve.tex
example.tex
latex solve
dvips solve
ps2pdf -dNOSAFER solve.ps
pdflatex example
pdflatex example
ps2pdf
必须使用选项运行-dNOSAFER
才能允许它写入文件(table.dat
)。