我想知道是否有办法使用 LaTeX(Tikz)绘制勒贝格奇异函数。
勒贝格奇异函数 $L_{a}\colon[0,1]\to[0,1]$
定义如下。
想象一下抛一枚不公平的硬币,$0.5\neq a\in(0, 1)$
正面的概率和 $1-a$
反面的概率都一样。让的二进制展开式 $t\in [0, 1]\colon t =\sum_{k=1}^{\infty}\frac{\omega_{k}}{2^{k}}$
通过无限次抛硬币来确定。特别是 $\omega_{k}=0$
如果 $k$
第 - 次抛硬币是正面, $\omega_{k}=1$
如果是反面。那么
$$L_{a}(x)\colon=\text{Prob}(t\leq x)$$
我不知道如何用 Tikz 手动做这件事,因为我才刚刚开始使用它。下面是如何绘制康托函数。也许可以做类似的事情?
答案1
这是使用该sagetex
包的解决方案,它使您能够访问计算机代数系统和 Python 编程。
\documentclass{article}
\usepackage{sagetex}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\begin{document}
\begin{sagesilent}
def LSF(binexp):
a = .6666
L = [0]
U = [1]
M = [1]
for i in range(1,9):
M += [(1-a)*L[len(L)-1]+a*U[len(U)-1]]
if str(binexp)[i] == "1":
L += [M[len(M)-1]]
U += [U[len(U)-1]]
else:
U += [M[len(M)-1]]
L += [L[len(L)-1]]
return U[len(U)-1]
def BTD(mystr):
sum = 0
for i in range(1,9):
sum += int(mystr[i])*(.5)^i
return sum
xcoordsb = ['.{0:08b}'.format(i) for i in range(0,2^9)]
xcoords = [BTD(xcoordsb[i]) for i in range(0,2^9)]
ycoords = [LSF(xcoordsb[j]) for j in range(0,2^9)]
plotpoints = sorted([[xcoords[i],ycoords[i]] for i in range(0,2^9)], key=lambda k: [k[1], k[0]])
output = r""
output += r"\begin{tikzpicture}[scale=.7]"
output += r"\begin{axis}[xmin=0,xmax=1,ymin= 0,ymax=1,"
output += r"title={Lebesgue singular function, $a=.6666$}]"
output += r"\addplot[thin, blue, unbounded coords=jump] coordinates {"
for i in range(0,len(plotpoints)-1):
output += r"(%s,%s) "%(plotpoints[i][0],plotpoints[i][1])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}
当 a=.6666 时,解决方案在 Cocalc 中运行。更改 a 的值然后进行编译将使您获得其他值。
我的编程技能不强,几乎肯定有更简单、更优雅的方法来实现这一点。我依靠的是丹尼尔·伯恩斯坦的论文我已链接到此。第 18 页的图表与 Sage 的输出相匹配。使用的算法在第 19 页。Sage 不是 LaTeX 发行版的一部分。开始使用它的最快方法是使用免费的Cocalc 账户。您可以在计算机上安装 Sage,这样您就不再依赖互联网帐户。搜索此网站以sagetex
获取更多信息。
答案2
计算 2 进制分数处的函数值。你可以按以下步骤执行此操作:
f(1/2) = a
do induction on n:
for 0 ≤ k < 2^{n-1}:
f(k/2^n) = f(k/2^{n-1})*a
for 2^{n-1} ≤ k < 2^n:
f(k/2^n) = f((k-2^{n-1})/2^{n-1})*(1-a)+a
因此,您得到了以下 tex 代码。此处\pgfkeys
充当数据数组。\pgfpath
部分绘制数据点。
\documentclass[border=9,tikz]{standalone}
\begin{document}
\let\PMS\pgfmathsetmacro
\let\PMT\pgfmathtruncatemacro
\def\pgfkeysgloballet#1#2{\global\expandafter\let\csname pgfk@#1\endcsname#2}
\pgfkeys{/handlers/.let/.code=\pgfkeysgloballet{\pgfkeyscurrentpath}{#1}}
\tikz[x=10cm,y=10cm]{
\draw[yellow](0,0)rectangle(1,1);
\def\a{.3}
\PMS\b{1-\a}
\def\n{9}
\pgfkeys{/Leb/0::0/.let=\a}
\foreach\dep in{1,...,\n}{
\message{^^J\dep:}
\PMT\depmo{\dep-1}
\PMT\twotodep{2^\dep}
\PMT\twotodmo{2^(\dep-1)}
\foreach\ind in{0,...,\numexpr\twotodmo-1}{
\pgfkeys{/Leb/\depmo::\ind/.get=\parentvalue}
\PMS\childvalue{\parentvalue*\a}
\pgfkeys{/Leb/\dep::\ind/.let=\childvalue}
}
\foreach\ind in{\twotodmo,...,\numexpr\twotodep-1}{
\PMT\indmod{\ind-\twotodmo}
\pgfkeys{/Leb/\depmo::\indmod/.get=\parentvalue}
\PMS\childvalue{\parentvalue*\b+\a}
\pgfkeys{/Leb/\dep::\ind/.let=\childvalue}
}
}
\pgfpathmoveto{\pgfpointorigin}
\PMT\twoton{2^\n}
\foreach\ind in{0,...,\numexpr\twoton-1}{
\pgfkeys{/Leb/\n::\ind/.get=\yvalue}
\pgfpathlineto{\pgfpointxy{(\ind+.5)/\twoton}{\yvalue}}
}
\pgfpathlineto{\pgfpointxy{1}{1}}
\pgfusepath{stroke}
}
\end{document}