不连续分段函数垂直线上的 Pgfplots 问题

不连续分段函数垂直线上的 Pgfplots 问题

在这里我想定义一个分段但在某些点不连续的函数。

\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}

产生与第一种方法相同的视觉输出。

相关内容