Kann Tikz eine Rekurrenzbeziehung mit „foreach“ und ohne globale Definitionen darstellen?

Kann Tikz eine Rekurrenzbeziehung mit „foreach“ und ohne globale Definitionen darstellen?

Ich möchte wissen, wie Sie eine Rekurrenzbeziehung mit zeichnen foreach, was die Aktualisierung einer Variablen innerhalb der Schleife erfordert. Um dies zu konkretisieren, ohne einen Haufen Code zu kopieren, beachten Sie bittedieses bestehende Beispiel, das Kopieren/Einfügen anstelle von verwendet foreach. Kann dieses Beispiel geändert werden, um eine Variable in einer foreachSchleife zu aktualisieren, ohne eine Definition im Dokumentbereich einzuführen? Wenn nicht, warum nicht?

Ein weiteres konkretes Beispiel:diese Antwortverwendet foreach, führt aber eine globale Definition ein (siehe die Zeile mit \newcommand{\x}{.1}). Ich möchte keine Definitionen im Dokumentbereich einführen. Dies ist doch sicher eine Möglichkeit, stattdessen die TikZ-Register zu verwenden? Wenn nicht, können Sie sagen, warum nicht?

Abstrakt betrachtet umfasst das Problem eine Anfangsbedingung, eine durch Funktionsiteration erzeugte Sequenz und das Plotten der Koordinaten, die aus jedem benachbarten Paar in der Sequenz erzeugt werden. Wenn beispielsweise x0 und dann x1=f(x0) gegeben sind, zeichnen Sie einen Punkt bei (x0,x1). Zeichnen Sie dann mit x2=f(x1) einen Punkt bei (x1,x2). Und so weiter, so oft wie gewünscht.

Antwort1

Sie können Gleitkommaberechnungen durchführen (mit höherer Genauigkeit als mit TikZ) mit 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} 

Keine globale Deklaration erforderlich, da die Schleifenzyklen nicht in Gruppen ausgeführt werden müssen. Die Schleifenvariable wird mit bezeichnet #1. Die Argumente \xforeachsind der Startpunkt, der Endpunkt und der auszuführende Code.

Tatsächlich sind die VariablenNamenwerden global deklariert, aber das ist kein Problem, da sie in ihrem eigenen Namespace leben.

Bildbeschreibung hier eingeben

Antwort2

Das Folgende ist eine Reproduktion des Spinnennetz-Diagramms indiese Antwortebenso wie der Code von @egreg (oben). Ich halte meine vorgeschlagene Antwort für einfacher und näher an meiner Frage, sofern ich nichts übersehen habe, da sie nur das fpPaket verwendet. Sie nutzt jedoch die rememberOption \foreachauf eine Weise aus, die ich aus der Dokumentation nicht ableiten kann, also hoffe ich, dass ich eine beabsichtigte Funktion und kein Implementierungsdetail verwende. (Kann das jemand bestätigen?) Der entscheidende Trick besteht darin, die Schleifenvariable am Ende der Schleife neu zu definieren, sodass die neue Definition zum „gespeicherten“ Wert wird. Siehe die letzte Zeile im Schleifenkörper.

\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}

Übrigens habe ich bei meiner Untersuchung herausgefunden, dass die mathematische Analyse nahe bei liegen muss \pgfmathresult, da dies auch die Ergebnisse anderer von TikZ durchgeführter Berechnungen enthält.

verwandte Informationen