使用 pgf 图编写分段函数

使用 pgf 图编写分段函数

您好,我正在尝试编写分段函数:

在此处输入图片描述

这是我的代码,我认为我做得不对。

\begin{tikzpicture}[
  declare function={
    func(\t)= (1/3^k<\t \leq 1/3^k) * (3^kt-1/k)   +
              and(2/3^k < \t \leq 1/3^{k-1}) * (3-3^kt/k)     +
              (\t = 0) * (0)
   ;
  }
]
\begin{axis}[
  axis x line=middle, axis y line=middle,
  ymin=-5, ymax=5, ytick={-5,...,5}, ylabel=$y$,
  xmin=-5, xmax=5, xtick={-5,...,5}, xlabel=$x$,
  domain=-pi:pi,samples=101, % added
]

\addplot [blue,thick] {func(t)};

\end{axis}
\end{tikzpicture} 

答案1

您几乎已经做到了。您不能使用\leq或其他排版命令,但您需要<=在这里使用。您也不能在同一个表达式中同时使用<<=,您必须满足and这两个条件。(我们也可以编写一个 PGFMath 函数between。)

由于你的函数是参数化的并且采用两个变量,PGFMath 函数func也必须采用两个变量。

由于你的函数只绘制线条,并且只在 1/3 之间定义和 1/3(什么是= 0?)我只让它评估三个点,而不是绘制整个函数。

代码

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{
  compat=1.18,
  utils/samples at/.code={%
    \pgfmathparse{#1}%
    \pgfkeyssetevalue{/pgfplots/samples at}
      {\pgfkeysvalueof{/pgfplots/samples at},\pgfmathresult}},
  samples at evaluated/.style args={#1,#2}{
    samples at/.evaluated={#1}, utils/samples at/.list={#2}}}
\begin{document}
\begin{tikzpicture}[
  declare function={
    func(\k,\t)= 1/\k * (
        and(1/3^\k < \t,  \t <= 2/3^\k)     * (3^\k*\t-1)
      + and(2/3^\k < \t,  \t <= 1/3^(\k-1)) * (3-3^\k*\t));}]
\newcommand*\myK{0.2}
\begin{axis}[
  axis x line=middle, axis y line=middle,
  ymin=0, ymax=ceil(1/\myK), ylabel=$y$,
  extra x ticks = {1/3^\myK, 2/3^\myK, 1/3^(\myK-1)},
  extra x tick labels={$1/3^k = 1/3^{\myK}$, $2/3^k = 2/3^{\myK}$,
    \pgfmathparse{\myK-1}$1/3^{k-1} = 1/3^{\pgfmathprintnumber{\pgfmathresult}}$},
  extra x tick style={tick label style={rotate=90, anchor=east, scale=.5}},
  xmin=floor(1/3^\myK), xmax=ceil(1/3^(\myK-1)), xlabel=$x$,
  samples at evaluated={1/3^\myK, 2/3^\myK, 1/3^(\myK-1)},
]
\addplot [blue, thick] {func(\myK,x)};
\end{axis}
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

对我来说,绘制分段函数最简单的方法是使用忘记绘图选项。这会假装之前的绘图从未出于图例/样式等目的进行过。以下是 k=1 的示例。

\begin{tikzpicture}
\begin{axis}[
  axis x line=middle, axis y line=middle,
  ymin=-5, ymax=5, ytick={-5,...,5}, ylabel=$y$,
  xmin=-5, xmax=5, xtick={-5,...,5}, xlabel=$t$,
  domain=-pi:pi,samples=101, no markers% added
]

\addplot+[forget plot, domain=0.33:0.66] {(3*x-1)/1};
\addplot+ [forget plot, domain=0.66:1] {(3-3*x)/1};
\addplot+[domain=0:0] coordinates{(0, 0)};
\addlegendentry{Piecewise function};
\end{axis}
\end{tikzpicture}

当然,如果您不想让它变成 3D 图,您必须自己确定 k。

相关内容