
Gostaria que você plotasse uma relação de recorrência usando foreach
, o que requer a atualização de uma variável dentro do loop. Para tornar isso concreto sem copiar um monte de código, considereeste exemplo existente, que usa copiar/colar em vez de foreach
. Este exemplo pode ser alterado para atualizar uma variável em um foreach
loop, sem introduzir uma definição no escopo do documento. Se não, por que não?
Como outra ilustração concreta,esta respostausa foreach
, mas introduz uma definição global (veja a linha com \newcommand{\x}{.1}
). Não quero introduzir nenhuma definição no escopo do documento. Certamente esta é uma maneira de usar os registros TikZ? Se não, você pode dizer por que não?
Abstratamente, o problema envolve uma condição inicial, uma sequência produzida pela iteração da função e a plotagem de coordenadas produzidas a partir de cada par adjacente na sequência. Por exemplo, dado x0 e então x1=f(x0), trace um ponto em (x0,x1). Então com x2=f(x1), trace um ponto em (x1,x2). E assim sucessivamente, quantas vezes for solicitado.
Responder1
Você pode fazer cálculos de ponto flutuante (com maior precisão do que com 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}
Nenhuma declaração global é necessária, porque os ciclos de loop não precisam ser executados em grupos. A variável de loop é denotada como #1
. Os argumentos \xforeach
são o ponto inicial, o ponto final e o código a ser executado.
Na verdade as variáveisnomessão declarados globalmente, mas isso não é um problema, porque eles vivem em seu próprio namespace.
Responder2
O seguinte reproduz o diagrama de teia de aranha emesta respostaassim como o código @egreg (acima). Considero minha resposta proposta mais simples e mais próxima da minha pergunta, a menos que tenha esquecido alguma coisa, pois ela usa apenas o fp
pacote. No entanto, ele explora a remember
opção de \foreach
uma forma que não consigo deduzir da documentação, então espero estar usando um recurso intencional em vez de um detalhe de implementação. (Alguém pode confirmar?) O truque crucial é redefinir a variável do loop no final do loop, para que a nova definição se torne o valor "lembrado". Veja a última linha no corpo do loop.
\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}
A propósito, uma coisa que descobri ao explorar isso é que a análise matemática deve estar próxima de \pgfmathresult
, porque também contém os resultados de outros cálculos feitos pelo TikZ.