基本上我想使用 PGFplots/tikzs 来绘制两个表达式的总和,但第一个表达式(我们将其命名为f(x)
)在内指定0<=x<=1000
,第二个表达式(我们将其命名为g(x)
)应仅在内指定,100<=x<=200
但不幸的是在 之外的区域不等于零100<=x<=200
。我只想添加这两个函数并使用单个命令在完整域 内(f(x)+g(x))
绘制结果,之外为零。\addplot
0<=x<=1000
g(x)
100<=x<=200
您是否知道一种灵活而简单的方法,可以通过单个命令实现所需的行为\addplot[...][domain=0:1000]{...}
,因为我找到的唯一解决方案(但有点不喜欢 - 因为它迫使我绘制三个不同的函数)是绘制
1. \addplot ... f(domain: 0<=x<100)
2. \addplot ... f(domain: 200<x<=1000)
3. \addplot ... f+g(domain: 100<=x<=200)
作为一种解决方法。
附言:我想避免涉及 gnuplot 或必须将数据存储在文件中或类似的东西中的解决方案...我更喜欢有一个可以在序言中使用以下包/库的解决方案,\usepackage{tikz,pgfplots,grffile,amsmath}
但\usetikzlibrary{fpu}
可以随意发布最简单的解决方案。
我希望您不介意我没有包含任何 MWE,并且我在描述中提供的语法实际上不是“完全有效的语法”,而只是提供理解我的问题的关键的某种符号摘录。
答案1
您可以在数学表达式中执行 pgfmath if then else。
\documentclass{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\begin{document}
\begin{tikzpicture}
\begin{axis}
% Cancel f(x) until 2 then after 4 shift it with 40
\addplot+[no marks,domain=0:6,samples=301] { -x^2 + ( x<2 ? x+x^2 : ( x>4 ? 40 : 0) ) };
\end{axis}
\end{tikzpicture}
\end{document}
答案2
您可以使用布尔乘数截断您的函数。
输出
代码
\documentclass[12pt,tikz,border=0pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\def\omeg{.1}
\def\A{1}
\begin{tikzpicture}
[
declare function=
{
f(\x) = 1/\omeg * (1.5+sin( .1 * \omeg * deg(\x)));
g(\x) = (100<=\x) * (\x<=200) * \A/\omeg * (1+sin(\omeg*deg(\x)));
}
]
\begin{axis}
[
%{{{
domain = 0:1000,
samples = 201,
axis lines = center,
%}}}
]
\addplot+[mark=none] {f(x)};
\addplot+[mark=none, domain=100:200] {g(x)};
\addplot+[mark=none] {f(x) + g(x)};
\end{axis}
\end{tikzpicture}
\end{document}