您好,我正在尝试编写分段函数:
这是我的代码,我认为我做得不对。
\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。