我想显示信号的传播,它是通过 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
\x
sina
编辑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
这种情况不会发生。我不明白这种行为的原因,但这肯定是一个错误,所以我\x
x
已报告。
不过,我可以建议另一种方法:使用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}