绘制斐波那契数列 (使用 tikzpicture)

绘制斐波那契数列 (使用 tikzpicture)

如何绘制斐波那契数列(最好使用 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}

在此处输入图片描述

相关内容