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
- 调用
psplot
6次,每次调用使用不同的域和函数。 \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 的朋友 :->
您可以声明分段函数,然后在\addplot
s 命令中单独或与其他函数组合(组合)调用它。
起点可以是:
\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
环境来分别绘制每个功能,如您的图片所示。
编辑:两个变化:
- 为了获得更好的可视化效果,我在 y 轴上移动了第三个函数。
- 我改变了样本数量,如果我们明智地选择样本,样本越少看起来就越好。由于函数部分发生变化的点是 -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}