![不连续分段函数垂直线上的 Pgfplots 问题](https://linux22.com/image/440655/%E4%B8%8D%E8%BF%9E%E7%BB%AD%E5%88%86%E6%AE%B5%E5%87%BD%E6%95%B0%E5%9E%82%E7%9B%B4%E7%BA%BF%E4%B8%8A%E7%9A%84%20Pgfplots%20%E9%97%AE%E9%A2%98.png)
在这里我想定义一个分段但在某些点不连续的函数。
\pgfmathdeclarefunction{b}{1}{\pgfmathparse{((3*#1+1/6)*(!(#1<0)&&(#1<1/2))+(#1+2/3)*(!(#1<1/2)&&(#1<3/4))+(-3*#1+2)*(!(#1<3/4)&&(#1<1)))}}
但该图是一条连续的线,其中有一些垂直线段连接相邻的不连续部分。这根本不是一个真正的数学图。
我搜索了一些相关问题,但答案都是关于单独定义每个部分。我坚持将它们定义为一个的原因是我想对这个分段函数进行迭代。因此,将其视为迭代过程的一个参数更为自然。我想知道是否有一个通用的解决方案可以避免这些垂直段,同时保持声明的完整性。
我的Latex代码如下所示
\documentclass[border=2pt]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{tkz-fct}
\pgfplotsset{compat = newest}
\pgfmathdeclarefunction{b}{1}{\pgfmathparse{((3*#1+1/6)*(!(#1<0)&&(#1<1/2))+(#1+2/3)*(!(#1<1/2)&&(#1<3/4))+(-3*#1+2)*(!(#1<3/4)&&(#1<1)))}}
\pgfmathdeclarefunction{a}{1}{\pgfmathparse{(2*#1-5/3)}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines = middle,
xmin=-0.1,
xmax=1.15,
every axis x label/.style={at={(current axis.right of origin)},anchor=west},
width = 0.8\textwidth,
height = 0.8\textwidth,
xlabel = {$x$},
ylabel = {$f(x)$},]
\addplot[
domain=0:1,
samples=200,
%smooth,
color=blue,
]{b(x-0.1)};
%\addplot[
%samples=200,
%smooth,
%color=red,
%]{c(a(x))};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
只是不要在你的情节中使用你出于某种原因想要的声明。
函数值以 x 值计算samples=200
,并在每个结果点之间画一条线。PGFPlots 无法知道何时不画线(可以通过一些严格的过滤来实现,但这会很手动而且很丑陋)。
\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat = newest}
\pgfmathdeclarefunction{b}{1}{\pgfmathparse{((3*#1+1/6)*(!(#1<0)&&(#1<1/2))+(#1+2/3)*(!(#1<1/2)&&(#1<3/4))+(-3*#1+2)*(!(#1<3/4)&&(#1<1)))}}
%\pgfmathdeclarefunction{a}{1}{\pgfmathparse{(2*#1-5/3)}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
axis lines = middle,
xmin=-0.1, xmax=1.15,
every axis x label/.style={at={(current axis.right of origin)},anchor=west},
width = 0.8\textwidth, height = 0.8\textwidth,
xlabel = {$x$}, ylabel = {$f(x)$},
]
\addplot[blue] coordinates {
(0,0) (0.1,0)
(0.1,1/6) (0.6,5/3)
(0.6, 7/6) (0.85,17/12)
(0.85,-0.25) (1,-0.7)};
\end{axis}
\end{tikzpicture}
\end{document}
编辑-另一种方式:
\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{tkz-fct}
\pgfplotsset{compat = newest}
\pgfmathdeclarefunction{b}{1}{\pgfmathparse{((3*#1+1/6)*(!(#1<0)&&(#1<1/2))+(#1+2/3)*(!(#1<1/2)&&(#1<3/4))+(-3*#1+2)*(!(#1<3/4)&&(#1<1)))}}
\pgfmathdeclarefunction{a}{1}{\pgfmathparse{(2*#1-5/3)}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
axis lines = middle,
%xmin=-0.1, xmax=1.15,
every axis x label/.style={at={(current axis.right of origin)},anchor=west},
width = 0.8\textwidth,
height = 0.8\textwidth,
xlabel = {$x$},
ylabel = {$f(x)$},]
\addplot[
blue,
only marks, mark size=0.4, mark =*,
domain=0:1,
samples=400,
]{b(x-0.1)};
\addplot[
red,
only marks, mark size=0.4, mark =*,
domain=3/2:7/4,
samples=200,
]{b(4*x-5)};
\end{axis}
\end{tikzpicture}
\end{document}
编辑-另一种方式:
\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{tkz-fct}
\pgfplotsset{compat = newest}
\pgfmathdeclarefunction{b}{1}{\pgfmathparse{(#1==0)||(#1==0.5)||(#1==0.75)?nan:((3*#1+1/6)*(!(#1<0)&&(#1<1/2))+(#1+2/3)*(!(#1<1/2)&&(#1<3/4))+(-3*#1+2)*(!(#1<3/4)&&(#1<1))))}}
\pgfmathdeclarefunction{a}{1}{\pgfmathparse{(2*#1-5/3)}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
axis lines = middle,
%xmin=-0.1, xmax=1.15,
every axis x label/.style={at={(current axis.right of origin)},anchor=west},
width = 0.8\textwidth,
height = 0.8\textwidth,
xlabel = {$x$},
ylabel = {$f(x)$},]
\addplot[
blue,
domain=0:1,
samples=101,
unbounded coords=jump,
]{b(x-0.1)};
\end{axis}
\end{tikzpicture}
\end{document}
产生与第一种方法相同的视觉输出。