如何绘制斐波那契数列(最好使用 tikzpicture)?
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0, xmax=30, ymin=2, ymax=3]
\addplot[samples at={1,2,...,30}, only marks] expression {<Add Fibonacci sequence here>};
\end{axis}
\end{tikzpicture}
\end{document}
编辑
由于它看起来比我想象的要复杂,所以我选择了以下解决方案:绘制连续斐波那契函数的离散版本,例如这里。我们当然仍然欢迎任何建议。
现在情况是这样的:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0, xmax=8, ymin=0, ymax=14, xlabel=$n$, ylabel=$a_n$, axis x line=center, axis y line=center]
\addplot[samples at={0,1,...,7},only marks] expression {( ((1+sqrt(5))/(2))^\x - cos(deg(\x * pi)) * ((1+sqrt(5))/(2))^(-\x) )/sqrt(5) };
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这是一个直接循环方法:
\documentclass[tikz,border=7pt]{standalone}
\begin{document}
\tikz
\foreach[
remember=\g as \h (initially 1),
remember=\f as \g (initially 0),
evaluate=\f using int(\g+\h)
] \n in {1,...,7}
\fill[green,draw=black] (\n,0) rectangle +(1,\f) node[black,scale=2,above left]{\f};
\end{document}
编辑:如果您想去 30(或更多),您可以使用xint
包。
\documentclass[tikz,border=7pt]{standalone}
\usepackage{xintexpr}
\begin{document}
\begin{tikzpicture}[xscale=.35]
\foreach[
remember=\g as \h (initially 1),
remember=\f as \g (initially 0)
] \n in{1,...,30}{
\edef\f{\thexintexpr \g + \h \relax}
\edef\ff{\thexintfloatexpr \f/10000 \relax}
\fill[green,draw=black] (\n,0) rectangle +(1,\ff);
}
\end{tikzpicture}
\end{document}
编辑:按照@jfbu 的评论,以下代码将产生相同的图像:
\documentclass[tikz,border=7pt]{standalone}
\usepackage{xintexpr}
\begin{document}
\xdef\fibs{\thexintfloatexpr rrseq(0, 1/10000 ; @1+@2, i=2..30)\relax}
\tikz[xscale=.35]
\foreach[count=\n] \f in \fibs
\fill[green,draw=black] (\n,0) rectangle +(1,\f);
\end{document}
笔记:直接使用类似下面的方法可能会更快
\foreach[count=\n] \f in {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040}{
...
}
答案2
斐波那契数列在 pgfmanual 的第 56.1 节中实现。您需要做的就是从那里进行调整。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{math}
\begin{document}
\tikzmath{
% Adapted from http://www.cs.northwestern.edu/academics/courses/110/html/fib_rec.html
function fibonacci(\n) {
if \n == 0 then {
return 0;
} else {
return fibonacci2(\n, 0, 1);
}; };
function fibonacci2(\n, \p, \q) {
if \n == 1 then {
return \q;
} else {
return fibonacci2(\n-1, \q, \p+\q);
};
};
}
\begin{tikzpicture}
\foreach \X in {0,1,...,8}{
\node[circle,fill,label=above:{\pgfmathparse{int(fibonacci(\X))}
\pgfmathresult}] at (\X,{fibonacci(\X)}) {};}
\end{tikzpicture}
\end{document}
补充说明:使用 pgfplots 绘制此函数并不是一件容易的事情。问题似乎是 pgfplots 使用了 fpu 库(但设置\pgfkeys{/pgf/fpu=false}
没有帮助)。在这个答案,通过进行外部计算可以避免该问题。但是,我在没有 MWE 可用的情况下写了答案,并遵循了“最好使用 tikzpicture”的指示 ;-)。
答案3
有一个变体https://tex.stackexchange.com/a/51422/4427,我们可以生成要输入的序列\foreach
:
\documentclass[tikz]{standalone}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \fibo #1 { \fibo_recurrence:nnnn{0}{1}{0}{#1} }
\cs_new:Npn \fibo_recurrence:nnnn #1 #2 #3 #4
{
\int_compare:nTF { #1 = #4 }
{ #3 }
{
#3 , \fibo_recurrence:ffnn
{ \int_eval:n {#1+1} }
{ \int_eval:n {#2+#3} }
{ #2 }
{ #4 }
}
}
\cs_generate_variant:Nn \fibo_recurrence:nnnn { ffnn }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\edef\fibos{\fibo{7}}
\foreach [count=\index] \f in \fibos
{
\fill[green,draw=black] (\index,0) rectangle +(1,\f)
node[black,scale=2,above left]{\f};
}
\end{tikzpicture}
\end{document}