如何在 Tikz 中绘制勒贝格奇异函数?

如何在 Tikz 中绘制勒贝格奇异函数?

我想知道是否有办法使用 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}

在此处输入图片描述

相关内容