
Я хотел бы узнать, как вы строите рекуррентное отношение с помощью 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.