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よりも高い精度)が行えます。Z) を使用します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}

ちなみに、これを調べているときに発見したことの 1 つは、数学解析は に近い必要があるということです\pgfmathresult。これは、TikZ によって実行される他の計算の結果も保持するためです。

関連情報