tikz 可以使用「foreach」繪製遞歸關係而不使用全域定義嗎?

tikz 可以使用「foreach」繪製遞歸關係而不使用全域定義嗎?

我想知道您使用 繪製遞歸關係foreach,這需要更新循環內的變數。為了使這個具體化而不複製一堆程式碼,請考慮這個現有的例子,它使用複製/貼上而不是foreach.可以更改此範例以更新foreach循環中的變量,而不在文件範圍內引入定義嗎?如果沒有,為什麼不呢?

作為另一個具體的例子,這個答案使用foreach但引入了全域定義(請參閱帶有 的行\newcommand{\x}{.1})。我不想在文檔範圍內引入任何定義。這肯定是使用 TikZ 暫存器的某種方法嗎?如果沒有,你能說出為什麼不嗎?

抽像地講,該問題涉及初始條件、函數迭代產生的序列以及序列中每個相鄰對產生的座標的繪製。例如,給定 x0,然後 x1=f(x0),在 (x0,x1) 處繪製一個點。然後用 x2=f(x1) 在 (x1,x2) 處繪製一個點。依此類推,依要求多次。

答案1

您可以進行浮點運算(比 Ti 具有更高的精確度)kZ) 使用expl3.

\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz,fullpage}
\usetikzlibrary{arrows}
\usepackage{xfp}

\ExplSyntaxOn
\NewDocumentCommand{\xforeach}{mmm}
 {
  \int_step_inline:nnn { #1 } { #2 } { #3 }
 }
\NewDocumentCommand{\setfpvar}{mm}
 {
  \fp_zero_new:c { l__alan_fpvar_#1_fp }
  \fp_set:cn { l__alan_fpvar_#1_fp } { #2 }
 }
\NewExpandableDocumentCommand{\usefpvar}{m}
 {
  \fp_use:c { l__alan_fpvar_#1_fp }
 }
\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}[scale=10,>=latex']  
  \draw[color=blue,samples at={0,0.01,...,1.07}] plot (\x,{cos(\x r)});  
  \draw[color=green](0,0)--(1,1);
  \draw[->](0,0)--(0,1) node[above]{$y$};
  \draw[->](0,0)--(1,0) node[right]{$x$};
  % initialize “x”
  \setfpvar{x}{.2}
  % the main loop
  \xforeach{1}{7}{%
    \setfpvar{y}{cos(\usefpvar{x})}
    \draw[color=magenta](\usefpvar{x},\usefpvar{x})--
                        (\usefpvar{x},\usefpvar{y})--
                        (\usefpvar{y},\usefpvar{y});
    \draw[color=orange,dotted,line width=0.8pt]
      (\usefpvar{x},\usefpvar{x})--(\usefpvar{x},0) node[below=8pt]{$u_{#1}$};
    \draw[color=blue,dotted,line width=0.8pt]%
      (\usefpvar{x},\usefpvar{y})--(0,\usefpvar{y}) node[left=8pt] {$u_{\inteval{#1+1}}$};
    % in the next cycle “x” will take the current value of “y”
    \setfpvar{x}{\usefpvar{y}}
  }
\end{tikzpicture}

\end{document} 

不需要全域聲明,因為循環不需要成組運行。迴圈變數用 表示#1。參數\xforeach是起點、終點和要運行的程式碼。

實際上變數'名字是全域聲明的,但這不是問題,因為它們位於自己的命名空間中。

在此輸入影像描述

答案2

以下複製了蜘蛛網圖這個答案@egreg 的程式碼(上面)也是如此。我認為我提出的答案更簡單,更接近我的問題,除非我錯過了一些東西,因為它只使用了包fp。但是,它確實以我無法從文檔中推斷出的方式利用了該remember選項,因此希望我使用的是有意的功能而不是實現細節。 \foreach(有人能確認嗎?)關鍵的技巧是在循環結束時重新定義循環變量,以便新的定義成為「記住」的值。請參閱循環體中的最後一行。

\begin{tikzpicture}[scale=10,>=latex']  
  \draw[color=blue,samples at={0,0.01,...,1.07}] plot (\x,{cos(\x r)});  
  \draw[color=green!50](0,0)--(1,1);
  \draw[<->](0,1) node[above]{$y$} |- (1,0) node[right]{$x$};
  \foreach \i [remember=\i as \x (initially 0.2)] in {1,...,7}{%
    \FPeval\y{cos \x}
    \draw[color=magenta](\x,\x)--(\x,\y)--(\y,\y);
    \draw[color=orange,dotted,line width=0.8pt]%
            (\x,\x)--(\x,0) node[below=8pt]{$u_\i$};
    \draw[color=blue,dotted,line width=0.8pt] (\x,\y)--(0,\y) node[left=8pt]
         {$u_{\pgfmathparse{int(\i+1)}\pgfmathresult}$};
    \FPeval\i{\y}
  }
\end{tikzpicture}

順便說一句,我在探索這個問題時發現的一件事是數學解析必須接近\pgfmathresult,因為這也保存了 TikZ 所做的其他計算的結果。

相關內容