我正在尝试绘制勒让德多项式,这可以通过调用递归函数轻松完成。例如,在 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}
无论如何,我同意 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}