绘制马尔可夫链 - 如何更新 TikZ 中变量的值?

绘制马尔可夫链 - 如何更新 TikZ 中变量的值?

我想在 R^2 中绘制马尔可夫过程的模拟。基本上,我想画一条从 (x_0,y_0)=(0,2) 开始的线,然后遵循以下规则:对于每个 i=1,...,10,该线将以 1/2 的概率经过 (i,y_{i-1}+1),以 1/2 的概率经过 (i,y_{i-1}-1)。所以我设计了以下 TikZ 代码来绘制此图:

\begin{tikzpicture}[scale=0.6]
  \coordinate[label=left:$2$] (0) at (0,2){};
  \pgfmathsetmacro{\z}{2};
  \newcounter{c};
  \setcounter{c}{0};
  \pgfmathdeclarerandomlist{dir}{{-1}{1}};

  \foreach \i in {1,2,...,10}{
    \pgfmathrandomitem{\d}{dir};
    \pgfmathsetmacro{\y}{\z+\d};
    \pgfmathsetmacro{\x}{\i};

    \coordinate (\i) at (\x,\y){};
    \pgfmathtruncatemacro{\p}{\i-1};
    \draw[red] (\p)--(\i);
    \pgfmathsetmacro{\z}{\y};
  }
  \draw[dashed,thick] (\l)--(20,2);
\end{tikzpicture}

首先,我们在 (0,2) 处绘制一个坐标。然后,我们\d从 {-1,1} 中均匀随机选择并在 处绘制一个坐标,(1,2+\d)并将 设置\z2+\d。然后我们\d再次从 {-1,1} 中随机选择并在 处绘制一个坐标(2,\z+\d),依此类推...

但是,这并没有给出图片应该是什么样子。事实上,和的更新过程\z似乎\y没有发生,我不知道为什么。

答案1

问题在于 TeX 宏定义默认是局部的,并且每次循环迭代都在一个组内。因此,循环末尾的\zto定义会立即被丢弃,并替换为原始的as 2 定义。\y\z

只需替换\pgfmathsetmacro{\z}{\y};即可\xdef\z{\y};解决问题(并且速度也快得多)。但这样做的缺点是,新的定义\z现在将全局覆盖存储在中的任何宏\z(如果碰巧有的话)。

您还可以用以下代码替换,以避免任何额外的宏定义:

\usetikzlibrary{calc}

\begin{tikzpicture}[scale=0.6]
  \coordinate[label=left:$2$] (0) at (0,2){};
  \pgfmathdeclarerandomlist{dir}{{-1}{1}};

  \foreach \i in {1,2,...,10}{
    \pgfmathrandomitem{\d}{dir};
    \pgfmathtruncatemacro{\p}{\i-1};
    \coordinate (\i) at ($(\p) + (1,\d)$) {};
    \draw[red] (\p)--(\i);
  }
\end{tikzpicture}

相关内容