¿Puede tikz trazar una relación de recurrencia usando "foreach" y sin definiciones globales?

¿Puede tikz trazar una relación de recurrencia usando "foreach" y sin definiciones globales?

Me gustaría que pudieras trazar una relación de recurrencia usando foreach, lo que requiere actualizar una variable dentro del bucle. Para hacer esto concreto sin copiar un montón de código, considereeste ejemplo existente, que utiliza copiar/pegar en lugar de foreach. ¿Se puede cambiar este ejemplo para actualizar una variable en un foreachbucle, sin introducir una definición en el alcance del documento? ¿Si no, porque no?

Como otro ejemplo concreto,esta respuestautiliza foreachpero introduce una definición global (ver la línea con \newcommand{\x}{.1}). No quiero introducir ninguna definición en el alcance del documento. Seguramente esta es alguna forma de utilizar los registros TikZ. Si no, ¿puedes decir por qué no?

De manera abstracta, el problema involucra una condición inicial, una secuencia producida por la iteración de una función y el trazado de coordenadas producidas a partir de cada par adyacente en la secuencia. Por ejemplo, dado x0 y luego x1=f(x0), traza un punto en (x0,x1). Luego, con x2=f(x1), traza un punto en (x1,x2). Y así sucesivamente, tantas veces como se solicite.

Respuesta1

Puedes hacer cálculos de punto flotante (con mayor precisión que con TikZ) usando 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} 

No se necesita ninguna declaración global, porque no es necesario ejecutar los ciclos de bucle en grupos. La variable de bucle se denota #1. Los argumentos \xforeachson el punto de partida, el punto final y el código a ejecutar.

En realidad las variablesnombresse declaran globalmente, pero eso no es un problema, porque viven en su propio espacio de nombres.

ingrese la descripción de la imagen aquí

Respuesta2

A continuación se replica el diagrama de telaraña enesta respuestaal igual que el código de @egreg (arriba). Considero que mi respuesta propuesta es más simple y más cercana a mi pregunta, a menos que me haya perdido algo, porque solo usa el fppaquete. Sin embargo, explota la rememberopción de \foreachuna manera que no puedo deducir de la documentación, por lo que espero estar usando una característica intencional en lugar de un detalle de implementación. (¿Alguien puede confirmarlo?) El truco crucial es redefinir la variable del bucle al final del bucle, de modo que la nueva definición se convierta en el valor "recordado". Vea la última línea en el cuerpo del bucle.

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

Por cierto, una cosa que descubrí mientras exploraba esto es que el análisis matemático debe ser cercano a \pgfmathresult, porque esto también contiene los resultados de otros cálculos realizados por TikZ.

información relacionada