问题

问题

y=f(x)我有一个如下所示的分段给出的基本函数。

在此处输入图片描述 在此处输入图片描述

我想像使用 Mathematica 一样方便地绘制其变换函数列表(例如y=af(bx+c)+d, )。y=a|f(b|x+c|)|+d

为了进行比较,让我首先展示 Mathematica 代码,如下所示。

ClearAll[F, family, plots];
F[x_] := 0 /; x < -6;
F[x_] := (x + 4)^2/4 - 1 /; -6 <= x < -2;
F[x_] := -(x + 1)^2 + 1 /; -2 <= x < 0;
F[x_] := -x /; 0 <= x < 2;
F[x_] := x - 4 /; 2 <= x < 6;
F[x_] := 2 /; x >= 6;
family = {F[x]
   , F[2 x]
   , 2 F[x]
   , F[x - 2]
   , F[x] - 2
   , 2 F[2 x + 1] - 1
   , F[Abs[x]]
   , F[-Abs[x]]
   , Abs@F[x]
   , -Abs@F[x]
   , -Abs@F[Abs[x]]
   , -Abs@F[-Abs[x]]
   };
plots = Plot[#, {x, -7, 7}, PlotLabels -> "Expressions", 
     ImageSize -> Large, PlotRange -> All] & /@ family;
Partition[plots, 2] // Grid[#, Frame -> All] &

在此处输入图片描述

我尝试在 PSTricks 中复制代码,但似乎太麻烦了,因为对于每一个pspicture,我都必须做繁琐且容易出错的额外工作

  • 调整前 2 个参数psplot
  • 调用psplot6次,每次调用使用不同的域和函数。
  • \psplot重新排列中的通话顺序\pscustom
\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{pst-plot}

\def\Fa#1{0}                        % x < -6
\def\Fb#1{((#1)+4)^2/4-1}           % -6 <= x < -2
\def\Fc#1{-((#1)+1)^2+1}            % -2 <= x < 0
\def\Fd#1{-(#1)}                    % 0 <= x < 2
\def\Fe#1{(#1)-4}                   % 2 <= x < 6
\def\Ff#1{2}                        % x >= 6

\begin{document}
% plotting y=f(x)
\pspicture(-8,-4)(8.5,4.5)
    \psaxes{->}(0,0)(-8,-4)(8,4)[$x$,0][$y$,90]
    \pscustom[linecolor=blue,linewidth=2pt,algebraic]
    {
        \psplot{-8}{-6}{\Fa{x}}
        \psplot{-6}{-2}{\Fb{x}}
        \psplot{-2}{0}{\Fc{x}}
        \psplot{0}{2}{\Fd{x}}
        \psplot{2}{6}{\Fe{x}}
        \psplot{6}{8}{\Ff{x}}
    }
\endpspicture
% plotting y=f(2x)
\pspicture(-8,-4)(8.5,4.5)
    \psaxes{->}(0,0)(-8,-4)(8,4)[$x$,0][$y$,90]
    \pscustom[linecolor=blue,linewidth=2pt,algebraic]
    {
        \psplot{-8}{-3}{\Fa{2*x}}
        \psplot{-3}{-1}{\Fb{2*x}}
        \psplot{-1}{0}{\Fc{2*x}}
        \psplot{0}{1}{\Fd{2*x}}
        \psplot{1}{3}{\Fe{2*x}}
        \psplot{3}{8}{\Ff{2*x}}
    }
\endpspicture
% plotting y=f(-x)
\pspicture(-8,-4)(8.5,4.5)
    \psaxes{->}(0,0)(-8,-4)(8,4)[$x$,0][$y$,90]
    \pscustom[linecolor=blue,linewidth=2pt,algebraic]
    {
        \psplot{-8}{-6}{\Ff{-x}}
        \psplot{-6}{-2}{\Fe{-x}}
        \psplot{-2}{0}{\Fd{-x}}
        \psplot{0}{2}{\Fc{-x}}
        \psplot{2}{6}{\Fb{-x}}
        \psplot{6}{8}{\Fa{-x}}
    }
\endpspicture
\end{document} 

问题

我想要

  • 只创建一个函数\def\F#1{}而不是六个函数\Fa,......,\Ff
  • \psplot每个 中仅调用一个pspicture,例如\psplot{-8}{8}{-2*abs(\F{-abs(x-3)})-2}

如何在 PSTricks 及其同类产品中实现这些要求?

答案1

\documentclass[border=2mm]{standalone}
\usepackage               {pst-plot}

\def\function{  
  u -6 lt { 0 }
    { u -2 lt { u 4 add dup mul 4 div 1 sub }
      { u 0 lt { u 1 add dup mul neg 1 add }
        { u 2 lt { u neg }
          { u 6 lt { u 4 sub }
            { 2 } ifelse
          } ifelse
        } ifelse
      } ifelse
    } ifelse
}     
  
\begin{document}
\begin{pspicture}(-8,-3)(8,3.5)
  \psaxes{->}(0,0)(-8,-3)(8,3)[$x$,-90][$y$,0]
  \psset{linewidth=1.5pt,plotpoints=1000}%
  \psplot[linecolor=blue]{-8}{8}{ x /u ED \function }
  \psplot[linecolor=red,linestyle=dashed]{-8}{8}{ x /u ED \function\space abs }
  \psplot[linecolor=green]{-8}{8}{ x 1 add abs /u ED \function\space 0.1 add }
\end{pspicture}
\end{document}

在此处输入图片描述

答案2

正如您tikz-pgf在标签中包含的那样,我为您提供了一个 pgfplots 解决方案。我不确定它是否是 PSTrikcs 的朋友 :->

您可以声明分段函数,然后在\addplots 命令中单独或与其他函数组合(组合)调用它。

起点可以是:

\documentclass[border=2mm]{standalone}
\usepackage               {pgfplots}
\pgfplotsset              {compat=1.17}

\tikzset{declare function={
    func(\x) =  (\x<-6) * 0                     + % not really necessary
     and(\x>=-6, \x<-2) * ((\x+4)*(\x+4)/4 - 1) +
     and(\x>=-2, \x< 0) * (-(\x+1)*(\x+1) + 1)  +
     and(\x>= 0, \x< 2) * (-\x)                 +
     and(\x>= 2, \x< 6) * (\x-4)                +
                (\x>=6) * 2;
}}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
    axis lines=middle,
    xmin=-8, xmax=8,
    ymin=-4, ymax=4,
    domain=-8:8,
    samples=161, % you'll probably must play with the number of samples (see edit)
    xtick={-8,-6,...,8},
    ytick={-4,...,4},
    xlabel=$x$, ylabel=$y$,
    ]
    \addplot [thick,blue]       plot (\x,{func(\x)});
    \addplot [thick,red,dashed] plot (\x,{abs(func(\x))});
    \addplot [thick,magenta]    plot (\x,{func(abs(\x+1))+0.1});
    \end{axis}
    \end{tikzpicture}
\end{document}

得出的结果为: 在此处输入图片描述

当然,您可以定义多个axis环境来分别绘制每个功能,如您的图片所示。

编辑:两个变化:

  1. 为了获得更好的可视化效果,我在 y 轴上移动了第三个函数。
  2. 我改变了样本数量,如果我们明智地选择样本,样本越少看起来就越好。由于函数部分发生变化的点是 -8、-6、-3、-1、0、1、2、4、5、6、8(计算三个函数),我们需要一组包含所有这些点的样本。因此,16 的任何倍数加 1(16n+1)都会比其他数字更好。因此,160+1 比 200+1(编辑前的值)更好。

答案3

我的尝试渐近线来自 Herbert 的 pstricks 代码。

import graph;
unitsize(1cm);

real f(real x) {
  return (x<-6) ? 0 : 
        (x<-2) ? (x+4)^2/4-1 :
        (x<0) ? -(x+1)^2+1 :
        (x<2) ? -x :
        (x<6) ? x-4 : 2;
}
real g(real x){ return abs(f(x)); } // |f(x)|
real h(real x){ return -3*abs(f(-2*abs(x+1)))-1; } // y=-3|f(-2|x+1|)|-1

draw(graph(f,-8,8,1000),red+1bp);
draw(graph(g,-8,8,1000),0.7bp+blue+dashed);
draw(graph(h,-8,8,1000),green+0.7bp);

xaxis(-8,8,Ticks(Step=1,Size=3,endlabel=false,end=false),Arrow);
label("$x$",(8,0),dir(-90));
yaxis(-3,3,Ticks(Step=1,Size=3,endlabel=false,end=false),Arrow);
label("$y$",(0,3),dir(0));

在此处输入图片描述

答案4

根据赫伯特的回答。

\documentclass[pstricks,border=2mm]{standalone}
\usepackage{pst-plot}
\usepackage{amsmath}

\def\F{  
    u -6 lt { 0 }{ 
    u -2 lt { ((u+4)^2/4-1) I2P }{ 
    u 0 lt  { (-(u+1)^2+1) I2P }{ 
    u 2 lt  { (-u) I2P }{   
    u 6 lt  { (u-4) I2P }{ 2 }  ifelse } 
                                ifelse } 
                                ifelse } 
                                ifelse } 
                                ifelse }     
  

\begin{document}
\pstVerb{/I2P {exec AlgParser cvx exec} def}%
\foreach \f/\l in 
{
    {x 2 mul /u ED \F}/{y=f(2x)},
    {x 2 mul 3 div /u ED \F}/{y=f(\tfrac{2x}{3})},
    {x  /u ED \F\space 2 mul}/{y=2f(x)},
    {x neg /u ED \F}/{y=f(-x)},
    {x  /u ED \F\space neg}/{y=-f(x)},
    {x 1 sub /u ED \F}/{y=f(x-1)},
    {x  /u ED \F\space 1 add}/{y=f(x)+1},
    {x 2 exp /u ED \F}/{y=f(x^2)},
    {x 2 exp neg /u ED \F}/{y=f(-x^2)},
    {x /u ED \F\space abs}/{y=|f(x)|},
    {x abs /u ED \F}/{y=f(|x|)},
    {x abs /u ED \F\space abs}/{y=|f(|x|)|},
    {x abs neg /u ED \F}/{y=f(-|x|)},
    {x /u ED \F\space abs neg}/{y=-|f(x)|},
    {x abs neg /u ED \F\space abs neg}/{y=-|f(-|x|)|},
    {x 1 sub abs 2 mul /u ED \F\space abs -3 mul 4 add}/{y=-3|f(2|x-1|)|+4},
    { (-2*abs(x+1)) I2P /u ED \F\space abs -3 mul 4 add}/{y=-3|f(-2|x+1|)|+4}
}
{%
\begin{pspicture}(-10,-6)(10.5,6.5)
  \psaxes{->}(0,0)(-10,-6)(10,6)[$x$,-90][$y$,0]
  \psset{plotpoints=1601,linejoin=1,strokeopacity=0.5}%
    \psplot[linecolor=red,linestyle=dashed,linewidth=3pt]{-10}{10}{x /u ED \F}
    \rput(-4,6){\textcolor{red!50}{$y=f(x)$}}
  \psplot[linecolor=blue,linewidth=2pt]{-10}{10}{\f}
    \rput(4,6){\textcolor{blue!50}{$\l$}}   
\end{pspicture}}
\end{document}

在此处输入图片描述

相关内容