
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}
그런데, 이것을 탐색하면서 발견한 한 가지는 수학 구문 분석이 에 가까워야 한다는 것입니다 \pgfmathresult
. 왜냐하면 여기에는 TikZ가 수행하는 다른 계산의 결과도 포함되어 있기 때문입니다.