绘制分段函数图像最清晰的方法是什么?

绘制分段函数图像最清晰的方法是什么?

我有一个函数定义为:

在此处输入图片描述

我如何使用函数而不是坐标来绘制图形?我目前正在使用 pgfplots,但如果有更好的选择,我愿意尝试其他方法。

答案1

您的职能

在此处输入图片描述

有 3 个不连续点,分别为t=0t=1t=2。下图从数学角度来看是正确的。

在此处输入图片描述

\documentclass[border=0bp]{standalone}

\usepackage{pst-plot}

\begin{document}

\psset{unit=1.5cm}
\begin{pspicture}[showgrid=false](-2.75,-0.75)(4,2)
    \psframe*[linecolor=yellow,opacity=0.5](-2.75,-0.75)(4,2)
    \psaxes[linecolor=lightgray]{->}(0,0)(-2.5,-0.5)(3.5,1.5)[$t$,0][$F(t)$,90]
    \psset{algebraic,linewidth=1.5pt,linecolor=red}
    \psplot[arrows=-o]{-2.5}{-1}{0}
    \psset{arrows=*-o}
    \psplot{-1}{0}{(x+1)/4}
    \psplot{0}{1}{1/2}
    \psplot{1}{2}{(x+7)/12}
    \psplot[arrows=*-]{2}{3.5}{1}
\end{pspicture}

\end{document}

编辑3

尽管必须避免使用垂直线连接不连续点,但这样做很容易,因为图形将不再告诉我们有关函数的信息。

在此处输入图片描述

\documentclass[border=0bp]{standalone}

\usepackage{pst-plot}

\begin{document}

\psset{unit=1.5cm}
\begin{pspicture}[showgrid=false](-2.75,-0.75)(4,2)
    \psframe*[linecolor=yellow,opacity=0.5](-2.75,-0.75)(4,2)
    \psaxes[linecolor=lightgray]{->}(0,0)(-2.5,-0.5)(3.5,1.5)[$t$,0][$F(t)$,90]
    \psset{algebraic,linewidth=1.5pt,linecolor=red}
    \pscustom
    {
        \psplot{-2.5}{-1}{0}
        \psplot{-1}{0}{(x+1)/4}
        \psplot{0}{1}{1/2}
        \psplot{1}{2}{(x+7)/12}
        \psplot{2}{3.5}{1}
    }
\end{pspicture}

\end{document}

编辑3.1

我忘了告诉你,你需要用xelatex或 序列latex后跟 来dvips编译它(以获得紧密的 PDF 图像) ps2pdf

使用 从输入文件中导入 PDF 图像,\includegraphics并使用 编译主输入文件pdflatex。我猜你的场景是这样的。

编辑 3.14

我在前言中添加了一些宏,用于调整画布和边框的大小。希望对你有用。

在此处输入图片描述

\documentclass[border=0bp]{standalone}

\usepackage{pst-plot}

% to adjust the unit
\psset
{
    xunit=1cm,
    yunit=3cm,
}


% to adjust the axes
\def\L{-2.5}
\def\R{3.5}
\def\B{-0.2}
\def\T{1.2}


% to adjust the borders
\def\dL{2pt}
\def\dR{12pt}
\def\dB{2pt}
\def\dT{18pt}

\begin{document}

\begin{pspicture}[showgrid=false]
        (\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
        (\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)

    %comment the following \psframe* if you DON'T need a colored background.

    \psframe*[linecolor=blue,opacity=0.1]
        (\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
        (\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)

        \psaxes[linecolor=lightgray]{->}(0,0)(\L,\B)(\R,\T)[$t$,0][$F(t)$,90]
        \psset{algebraic,linewidth=1.5pt,linecolor=red}
        \psplot[arrows=-o]{\L}{-1}{0}
        \psset{arrows=*-o}
        \psplot{-1}{0}{(x+1)/4}
        \psplot{0}{1}{1/2}
        \psplot{1}{2}{(x+7)/12}
        \psplot[arrows=*-]{2}{\R}{1}
\end{pspicture}

\end{document}

编辑 3.141

我刚刚意识到,使用默认值plotpoints(即20)时,每个空心点都有一个不好的特性。幸运的是,您的函数频率较低,因此我可以减少plotpoints到而2不会产生副作用,以隐藏不好的特性。

在此处输入图片描述

\documentclass[border=0bp]{standalone}

\usepackage{pst-plot}

% to adjust the unit
\psset
{
    xunit=1cm,
    yunit=3cm,
}


% to adjust the axes
\def\L{-2.5}
\def\R{3.5}
\def\B{-0.2}
\def\T{1.2}


% to adjust the borders
\def\dL{2pt}
\def\dR{12pt}
\def\dB{2pt}
\def\dT{18pt}

\begin{document}

\begin{pspicture}[showgrid=false]
    (\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
    (\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)

    %comment the following \psframe* if you DON'T need a colored background.
    %\psframe*[linecolor=blue,opacity=0.1]
    %(\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
    %(\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)

    \psaxes[linecolor=lightgray]{->}(0,0)(\L,\B)(\R,\T)[$t$,0][$F(t)$,90]
    \psset{algebraic,linewidth=1.5pt,linecolor=red,plotpoints=2}
    \psplot[arrows=-o]{\L}{-1}{0}
    \psset{arrows=*-o}
    \psplot{-1}{0}{(x+1)/4}
    \psplot{0}{1}{1/2}
    \psplot{1}{2}{(x+7)/12}
    \psplot[arrows=*-]{2}{\R}{1}
\end{pspicture}

\end{document}

如果你的函数频率很高,那么降低频率plotpoints会使图变得不再平滑。为了避免这种副作用,我们必须增加plotpoints并用实心圆覆盖空心点。

答案2

如果您正在使用,pgfplots您可以使用pgfmathdeclarefunction来指定函数,然后像使用内置函数一样使用它。如果您希望连接端点,则可以一次绘制所有内容,或者分别绘制每个部分:

在此处输入图片描述

参考:

代码:

\documentclass[border=3pt]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\usetikzlibrary{calc}

\newcommand*{\PhM}{\phantom{-}}%

\newcommand{\pLabel}{%
$F(t) = \begin{cases}
  0                     & \PhM t < -1 \\[0.8ex]
  \frac{1}{4}t+\frac{1}{4}  & -1\le t <0 \\[0.8ex]
  \frac{1}{2}           & \PhM 0\le t <1\\[0.8ex]
  \frac{1}{12}t+\frac{7}{12} & \PhM 1\le t <2\\[0.8ex]
  1                     & \PhM t\ge 2
\end{cases}
$
}

\pgfmathdeclarefunction{PieceA}{1}{(0)}%
\pgfmathdeclarefunction{PieceB}{1}{(#1/4 + 1/4)}%
\pgfmathdeclarefunction{PieceC}{1}{(0.5)}%
\pgfmathdeclarefunction{PieceD}{1}{(#1/12 + 7/12)}%
\pgfmathdeclarefunction{PieceE}{1}{(1)}%


\pgfmathdeclarefunction{MyFunction}{1}{%
  \pgfmathparse{%
    (and(   1,    #1<-1)*(0)            +%
    (and(#1>=-1,  #1< 0)*(#1/4 + 1/4)   +%
    (and(#1>= 0,  #1< 1)*(0.5)          +%
    (and(#1>= 1,  #1< 2)*(#1/12 + 7/12) +%
    (and(#1>= 2,    1  )*(1)%
    }%
}


\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot[domain=-5:5, blue, samples=100, ultra thick] {MyFunction(x)};
    \node [right] at (axis cs: -5.5,0.7) {\tiny\pLabel};
  \end{axis}
\end{tikzpicture}

\begin{tikzpicture}
  \begin{axis}
    \foreach \xStart/\xEnd  in {-5/-1, -1/0, 0/1, 1/2, 2/5} {
        \addplot[domain=\xStart:\xEnd, blue, samples=10, ultra thick] {MyFunction(x)};
    }
    \node [right] at (axis cs: -5.5,0.7) {\tiny\pLabel};% Labe graph

    % Show discontinuty points
    \draw [draw=blue, fill=white, thick] (axis cs: 0, 0.250) circle (2.0pt);
    \draw [draw=blue, fill=blue,  thick] (axis cs: 0, 0.500) circle (2.0pt);
    \draw [draw=blue, fill=white, thick] (axis cs: 1, 0.500) circle (2.0pt);
    \draw [draw=blue, fill=blue, thick] (axis cs: 1, 0.666) circle (2.0pt);
    \draw [draw=blue, fill=white, thick] (axis cs: 2, 0.750) circle (2.0pt);
    \draw [draw=blue, fill=blue, thick] (axis cs: 2, 1.000) circle (2.0pt);
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容