我想绘制一个振动膜,因此我需要贝塞尔函数。当我使用 pgfplots 时,我想知道是否有任何与 pgf 相关的东西可用于创建相应的输出。我提供了一个 MWE 来试用该软件包。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf, z buffer=sort, domain=0:1, y domain=0:2*pi]
({x * cos(deg(y))}, {x * sin(deg(y))}, {cos(pi*x)});
\end{axis}
\end{tikzpicture}
\end{document}
有人有解决方法或使用这些功能的方法吗?
答案1
评论
pgfplots
提供gnuplot
通过外部程序
\addplot gnuplot {<gnuplot stuff>};
请参阅第 56 页上的第 4.3.5 节“使用数学表达式计算坐标”。pgfplots 1.9 手册。
gnuplot
提供功能besj0(r)
,返回贝塞尔 J0 函数。
执行
使用arara
或pdflatex -shell-escape
。您需要gnuplot
在 中$PATH
。
% arara: pdflatex: { shell: yes }
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf,z buffer=sort,domain=-2:2,y domain=-2:2] gnuplot {besj0(x**2+y**2)};
\end{axis}
\end{tikzpicture}
\end{document}
输出
您还可以使用 LuaJITTeX(和 LuaTeX ≥ 1.0.3)中的 FFI 直接访问贝塞尔函数libm
。性能和准确性简直令人惊叹!该BesselJ
函数采用两个参数,其中第一个是贝塞尔函数的阶数,即所有阶数都可以直接访问,而无需使用递归关系。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\directlua{
ffi=require("ffi")
ffi.cdef[[
double jn(int n, double x);
]]
}
\pgfmathdeclarefunction{BesselJ}{2}{%
\edef\pgfmathresult{%
\directlua{tex.print(ffi.C.jn(\pgfmathfloatvalueof{#1},\pgfmathfloatvalueof{#2}))}%
}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf,z buffer=sort,domain=-2:2,y domain=-2:2] { BesselJ(0,x^2+y^2)) };
\end{axis}
\end{tikzpicture}
\end{document}
答案2
使用 PSTricks 只是为了好玩。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-func,amsmath}
\psset{xunit=0.25,yunit=5}
\begin{document}
\begin{pspicture}(-28,-.75)(29,1.2)
\rput(13,0.8){$\displaystyle J_n(x)=\frac{1}{\pi}\int_0^\pi\cos(x\sin t-nt)\,\mathrm{d}t$}
\psaxes[Dy=0.2,Dx=4]{->}(0,0)(-28,-.75)(28.5,1.15)[$x$,0][$y$,90]
\psset{linewidth=1pt}
\psBessel[linecolor=red]{0}{-28}{28}%
\psBessel[linecolor=blue]{1}{-28}{28}%
\psBessel[linecolor=green]{2}{-28}{28}%
\psBessel[linecolor=magenta]{3}{-28}{28}%
\end{pspicture}
\end{document}
答案3
以下是 MWE:
\documentclass[12pt]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\begin{axis}[width=\textwidth, height=0.5*\textwidth, xlabel=$x$]
\addplot+[id=parable,domain=0:20, samples=500, mark=none, width=2pt]
gnuplot{besj0(x)} node[pin=95:{$J_0(x)$}]{};
\addplot+[id=parable,domain=0:20, samples=500, mark=none, width=2pt, color=red]
gnuplot{besj1(x)} node[pin=130:{$J_1(x)$}]{};
\addplot+[id=parable2,domain=0:20, samples=500, mark=none, width=2pt, color=black]
gnuplot{2*1/x*besj1(x)-besj0(x)} node[pin=-140:{$J_2(x)$}]{};
\end{axis}
\end{tikzpicture}
\end{document}
请使用“pdflatex -shell-escape”运行
如下图所示:
答案4
也可以使用 GNUplot 来计算高阶贝塞尔函数。可以使用递归公式,http://www.encyclopediaofmath.org/index.php/Bessel_functions
%For examples, plotting besj2(x)
\addplot[color=yellow,
solid,
line width=1.0pt,
%mark=asterisk,
%mark options={solid},
domain=0:5,samples=400]
gnuplot {abs(2*1/x * besj1(x) - besj0(x))};
%Similarly besj3(x) gnuplot {abs(2*2/x * besj2(x) - besj1(x))};