带有 pgfplot 的布朗桥

带有 pgfplot 的布朗桥

我发现了以下巧妙的代码布朗尼运动这里绘制布朗运动:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots, pgfplotstable}


% Create a function for generating inverse normally distributed numbers using the Box–Muller transform
\pgfmathdeclarefunction{invgauss}{2}{%
  \pgfmathparse{sqrt(-2*ln(#1))*cos(deg(2*pi*#2))}%
}
% Code for brownian motion
\makeatletter
\pgfplotsset{
    table/.cd,
    brownian motion/.style={
        create on use/brown/.style={
            create col/expr accum={
                (\coordindex>0)*(
                    max(
                        min(
                            invgauss(rnd,rnd)*0.1+\pgfmathaccuma,
                            \pgfplots@brownian@max
                        ),
                        \pgfplots@brownian@min
                    )
                ) + (\coordindex<1)*\pgfplots@brownian@start
            }{\pgfplots@brownian@start}
        },
        y=brown, x expr={\coordindex},
        brownian motion/.cd,
        #1,
        /.cd
    },
    brownian motion/.cd,
            min/.store in=\pgfplots@brownian@min,
        min=-inf,
            max/.store in=\pgfplots@brownian@max,
            max=inf,
            start/.store in=\pgfplots@brownian@start,
        start=0
}
\makeatother
%

% Initialise an empty table with a certain number of rows
\pgfplotstablenew{201}\loadedtable % How many steps?


\begin{document}
\pgfplotsset{
        no markers,
        xmin=0,
        enlarge x limits=false,
        scaled y ticks=false,
        ymin=-1, ymax=1
}
\tikzset{line join=bevel}
\pgfmathsetseed{3}
\begin{tikzpicture}
\begin{axis}
   \addplot table [brownian motion] {\loadedtable};
   \addplot table [brownian motion] {\loadedtable};
\end{axis}
\end{tikzpicture}

\end{document} 

但是我对 LaTeX/pgfplot/Tikz 的了解不够深入,无法理解如何以及在何处进行更改以得到布朗桥而不是布朗运动。

感谢您的帮助

答案1

在你等待 Tikz 帮助时,这里有一个努力元帖子,这样可能更容易遵循/适应。这包含在内,luamplib因此您必须使用 进行编译lualatex

我关注了这个统计答案

在此处输入图片描述

蓝线是常规布朗随机游走,其中 y 值每次增加一个正态偏差。红线是布朗桥,它是从常规游走中减去最终 y 值的适当加权比例而得出的。

为了使示例具体化,我使用了 200 个样本和一个固定的随机种子,因此步行的最终值为w[n]17.8543——红线的每个点bb[i]都是w[i] - (i/n) * (b - w[n])。这意味着正如所期望的bb[n]那样w[n] - (n/n) * (b - w[n]) = b

这是代码。用它编译lualatex可得到如上图所示的 PDF。

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\mplibshowlog{enable}
\begin{mplibcode}
% randomseed := uniformdeviate infinity;
randomseed := 778.58453;
beginfig(1);
% parameters: n number of samples, a = start, b = target
numeric n, a, b; n = 200; a = b = 0;

% x and y scales
numeric u, v; u = 2; v = 8;

% base line
draw ((0, a) -- (n, b)) xscaled u yscaled v;

% w[] is the regular brownian random walk
% bb[] is the brownian bridge
numeric w[], bb[]; 
w0 = a;
for i=1 upto n: 
  w[i] = w[i-1] + normaldeviate;
endfor
for i=0 upto n:
  bb[i] = w[i] + (i/n) * (b - w[n]);
endfor

draw ((0, a) for i=1 upto n: -- (i, w[i]) endfor) 
    xscaled u yscaled v withcolor blue; 
draw ((0, a) for i=1 upto n: -- (i, bb[i]) endfor) 
    xscaled u yscaled v withcolor red; 

label.rt("$(" & decimal n & "," & decimal w[n] & ")$", (n*u, w[n]*v));

endfig;
\end{mplibcode}
\end{document}

相关内容