tikz는 'foreach'를 사용하고 전역 정의 없이 반복 관계를 그릴 수 있나요?

tikz는 'foreach'를 사용하고 전역 정의 없이 반복 관계를 그릴 수 있나요?

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가 수행하는 다른 계산의 결과도 포함되어 있기 때문입니다.

관련 정보