pgfplot 中的奇怪语法

pgfplot 中的奇怪语法

我想显示信号的传播,它是通过 2 的加法获得的。它按我想要的方式工作:

\documentclass{standalone}
\usepackage[usenames,svgnames]{xcolor}
\usepackage{siunitx}
\usepackage{tikzscale}
\usepackage{pgf,tikz,pgfplots}

\usetikzlibrary{math}

\begin{document}
     \begin{tikzpicture}
       \tikzmath{
       \omm=0;
       \omM=10;
       % sin sur une période, 0 sinon
       function sina(\x) {
        if and(\x>0,\x<1) then { 
       return sin(360*\x);}
        else {return 0;};};
       % fréquence double
       function sinb(\x) {
        if and(\x>0,\x<1) then { 
       return sin(720*\x);}
        else {return 0;};};
       }
       
       \begin{axis}[width=.8\columnwidth,
       height=5cm,
       xmin=\omm,
       xmax=\omM,
       axis y line=left,
       ylabel= \textcolor{blue}{Amplitude},
       xlabel= position,
        smooth,
       ]
       \addplot+[blue,thin, mark=none, samples=200,domain = \omm:\omM] {sina(x)};
       \addplot+[blue,thin, dashed, mark=none, samples=200,domain = \omm:\omM] {sinb(x)};
       \addplot+[DarkRed,thick, mark=none, samples=200,domain = \omm:\omM] {sina(x)+sinb(x)};
       \end{axis}
       \begin{axis}[width=.8\columnwidth,
       height=5cm,
       yshift=-5cm,
       xmin=\omm,
       xmax=\omM,
       axis y line=left,
       ylabel= \textcolor{blue}{Amplitude},
       xlabel= position,
        smooth,
       ]
       \addplot[blue,thin, mark=none, samples=200,domain = \omm:\omM] {sina(x-4)};
       \addplot[blue,thin, dashed, mark=none, samples=200,domain = \omm:\omM] {sinb(x-4)};
       \addplot+[DarkRed,thick, mark=none, samples=200,domain = \omm:\omM] {sina(x-4)+sinb(x)};
       \end{axis}
     \end{tikzpicture}
\end{document}

但我绝对不希望sina(x-4)+sinb(x)为移位的添加而写东西,但是sina(x-4)+sinb(x-4)......

这真的是预期的行为吗?如果是,背后的逻辑能解释一下吗?因为我发现好的语法错误。

编辑:另一种获得正确结果的替代语法,也许它可以帮助某人理解正在发生的事情:

\addplot+[DarkRed,thick, mark=none, samples=200,domain = \omm:\omM] {sinb(\x-4) + sina(\x-4)};

用移位函数替换函数语法x中的常用变量,正如预期的那样。\addplot\xsina

编辑2:如果 的定义sina()sinb()变量的名称发生改变,例如\y,则预期行为将恢复。通过将 的定义替换sinb()为:

% fréquence double
       function sinb(\y) {
        if and(\y>0,\y<1) then {
       return sin(720*\y);}
        else {return 0;};};

那么预期的语法(sina(x-4)+sinb(x-4))给出了预期的结果。

答案1

这肯定是一个错误。 的参数在内部sina被赋值给\x(如果你在定义中使用了这个名字),并且这个值似乎泄露给了调用sinb。也就是说,第二个调用的行为就像是第一个调用的整个参数一样。正如你已经注意到的,奇怪的是,当使用而不是 时,x这种情况不会发生。我不明白这种行为的原因,但这肯定是一个错误,所以我\xx已报告

不过,我可以建议另一种方法:使用declare function而不是\tikzmath。手册中建议将其pgfplots作为保持与 兼容性的最佳实践lua backend(如图所示在这个答案中),我认为它能提供更高的准确性和速度,并提供您需要的所有功能。重要的是,它没有出现相同的错误:

\documentclass{article}

\usepackage[usenames,svgnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{tikzpicture} [
      declare function={
        ommin = 0;
        ommax = 10;
        sina(\x) = ifthenelse(and(\x>0, \x<1), sin(360*x), 0);
        sinb(\x) = ifthenelse(and(\x>0, \x<1), sin(720*x), 0);
%        % or, a bit more compactly:
%        sina(\x) = (0<\x && \x<1 ? sin(360*\x) : 0);
%        sinb(\x) = (0<\x && \x<1 ? sin(720*\x) : 0);
      },
    ]
  \begin{axis}[width=.8\columnwidth,
      height=5cm,
      xmin=ommin,
      xmax=ommax,
      axis y line=left,
      ylabel= \textcolor{blue}{Amplitude},
      xlabel= position,
      smooth,
    ]
  \addplot+[blue,thin, mark=none, samples=200,domain=ommin:ommax] {sina(x)};
  \addplot+[blue,thin, dashed, mark=none, samples=200,domain=ommin:ommax] {sinb(x)};
  \addplot+[DarkRed,thick, mark=none, samples=200,domain=ommin:ommax] {sina(x)+sinb(x)};
  \end{axis}
  \begin{axis}[width=.8\columnwidth,
      height=5cm,
      yshift=-5cm,
      xmin=ommin,
      xmax=ommax,
      axis y line=left,
      ylabel= \textcolor{blue}{Amplitude},
      xlabel= position,
      smooth,
    ]
  \addplot+[blue,thin, mark=none, samples=200,domain=ommin:ommax] {sina(x-4)};
  \addplot+[blue,thin, dashed, mark=none, samples=200,domain=ommin:ommax] {sinb(x-4)};
  \addplot+[DarkRed,thick, mark=none, samples=200,domain=ommin:ommax] {sina(x-4)+sinb(x-4)};
  \end{axis}
\end{tikzpicture}

\end{document}

MWE 输出

相关内容