
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 foreach
bucle, sin introducir una definición en el alcance del documento? ¿Si no, porque no?
Como otro ejemplo concreto,esta respuestautiliza foreach
pero 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 \xforeach
son 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.
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 fp
paquete. Sin embargo, explota la remember
opción de \foreach
una 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.