我发现了以下巧妙的代码布朗尼运动这里绘制布朗运动:
\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}