评论

评论

我想绘制一个振动膜,因此我需要贝塞尔函数。当我使用 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 函数。

执行

使用ararapdflatex -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))};

使用 GNUplot 和 pgfplots 的贝塞尔函数

相关内容