pgfplots 中的递归函数

pgfplots 中的递归函数

我正在尝试绘制勒让德多项式,这可以通过调用递归函数轻松完成。例如,在 Python 中,这将如下所示:

def legendre(xi, p):
    if p==0:
        return 1.
    elif p==1:
        return xi
    elif p>=2:
        return (1/p)*((2*p-1)*xi* legendre(xi, p-1) + (1-p)*legendre(xi, p-2))

但是,如果我想在 pgfplots 中绘制这些,这已经变得非常困难。我尝试遵循这个答案,但由于该函数的递归性质(使用两个不同的多项式值调用该函数),我无法按照发布的斐波那契数列答案中的方式实现它。这是我目前所拥有的:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[
    evaluate={
        function legendre(\x,\p) {
            if \p == 0 then {
                return 1;
            } else {
                return legendre2(\x, \p);
            };
        };
        function legendre2(\x, \p) {
            if \p == 1 then {
                return \x;
            } else {
                return (1/\p)*((2*\p-1)*\x* legendre2(\x, \p-1) + (1-\p)*legendre2(\x, \p-2))
            };
        };
    },
]
\begin{axis}
  \addplot+ [domain=-1:1] {legendre(x,0)};
  \addplot+ [domain=-1:1] {legendre(x,1)};
  \addplot+ [domain=-1:1] {legendre(x,2)};

\end{axis}
\end{tikzpicture}
\end{document}

它可以绘制前 2 个勒让德多项式。对于第 3 个,我进入了无限循环,因为我没有调用正确的函数。我想知道是否有解决方法(我没有找到一种方法来放置一个简单的或语句,if \p == 0 or \p == 1 then以便我可以在这种情况下区分前两个顺序。

答案1

您已经非常接近解决方案了。问题是 legendre2 不必调用 legendre2 本身,而是必须调用 legendre:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[
    evaluate={
        function legendre(\x,\p) {
            if \p == 0 then {
                return 1;
            } else {
                return legendre2(\x, \p);
            };
        };
        function legendre2(\x, \p) {
            if \p == 1 then {
                return \x;
            } else {
                return (1/\p)*((2*\p-1)*\x* legendre(\x, \p-1) + (1-\p)*legendre(\x, \p-2));
            };
        };
    },
]
\begin{axis}[no markers]
  \addplot+ [domain=-1:1] {legendre(x,0)};
  \addplot+ [domain=-1:1] {legendre(x,1)};
  \addplot+ [domain=-1:1] {legendre(x,2)};
  \addplot+ [domain=-1:1] {legendre(x,3)};
  \addplot+ [domain=-1:1] {legendre(x,4)};
  \addplot+ [domain=-1:1] {legendre(x,5)};



\end{axis}
\end{tikzpicture}
\end{document}

lengedre_多项式

无论如何,我同意 John Kormylo 的观点。您可以使用 lua,因为这里或者 gnuplot:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \usetikzlibrary{math}
\begin{document}
\newcommand{\defgnuplotfunc}{
  leg(x,p) = 
  (p==0) ? 1 :
  (p==1) ? x : 
  (1./p)*( (2.*p -1.) * x *leg(x,p-1) + (1.-p)*leg(x,p-2));
}
\begin{tikzpicture}
\begin{axis}
  \addplot+  gnuplot[raw gnuplot] {\defgnuplotfunc plot [-1:1] leg(x,0)};
  \addplot+  gnuplot[raw gnuplot] {\defgnuplotfunc plot [-1:1] leg(x,1)};
  \addplot+  gnuplot[raw gnuplot] {\defgnuplotfunc plot [-1:1] leg(x,2)};
  \addplot+  gnuplot[raw gnuplot] {\defgnuplotfunc plot [-1:1] leg(x,3)};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容