Может ли 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.

Связанный контент