![关于 pgfplot 分段语法的问题?](https://linux22.com/image/257314/%E5%85%B3%E4%BA%8E%20pgfplot%20%E5%88%86%E6%AE%B5%E8%AF%AD%E6%B3%95%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F.png)
piece函数定义如下:
以下是代码片段:
\pgfmathdeclarefunction{func}{1}{%
\pgfmathparse{%
(and(#1>=0 , #1<=500) * (300 + #1*(12/10)) +%
(and(#1>500, #1<=1000) * (600 + #1*(12/10)) %
}%
}
后面的星号“*”到底起什么作用(and..
?末尾的“+”号。我重用了我在本网站找到的一些示例,但语法不太直观。有人能解释一下这个语法吗?提前谢谢。
编辑(添加完整示例)
\documentclass[10pt,letterpaper]{article}
\usepackage[left=1in,right=1in,top=1in,bottom=1in]{geometry}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{polynomial}
\usepackage{layouts}
\usepackage{enumerate}
\usepackage{syntax}
\usepackage{gensymb}
\usepackage{cancel}
\usepackage{calc}
\usepackage{xcolor}
\usepackage[version=0.96]{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,automata,backgrounds,petri,positioning}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{decorations.shapes}
\usetikzlibrary{decorations.text}
\usetikzlibrary{decorations.fractals}
\usetikzlibrary{decorations.footprints}
\usetikzlibrary{shadows}
\usetikzlibrary{calc}
\usetikzlibrary{spy}
\usetikzlibrary{matrix}
\usepackage{tikz-qtree}
\usepackage{pgfplots}
\begin{document}
\pgfmathdeclarefunction{func}{1}{%
\pgfmathparse{%
(and(#1>=0 ,#1<=500) * (300 + #1*(12/10)) +%
(and(#1>=500 ,#1<=1000) * (600 + #1*(12/10)) %
}%
}
\begin{tikzpicture}[scale=0.8]
\begin{axis}
[title={$C(x)$},
ylabel=$y$,
xlabel=$x$,
grid=both,
minor xtick={0,100,...,1000},
xtick={0,200,...,1000},
ytick={0,400,...,3200}]
\addplot[blue,domain=0:1000]{func(x)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这是简单的数学。:) 但人们应该知道
and(<condition1>,<condition2>)
当两个条件都为真时返回 1,当至少一个条件为假时返回 0。因此,当计算150pgf
的值时,它确实func
(and(150>=0 , 150<=500) * (300 + 150*(12/10)) + (and(150>500, 150<=1000) * (600 + 150*(12/10))
变成
1 * (300 + 150*(12/10)) + 0 * (600 + 150*(12/10))
那是,
(300 + 150*(12/10))
当它在 725 处评估时,情况同样适用,但结果是
0 * (300 + 725*(12/10)) + 1 * (600 + 725*(12/10))
那是,
(600 + 725*(12/10))
在两种情况下,该值都是所请求的。
如果您想要一个在不连续处有实际步骤的图形,则需要更正输入:
\begin{tikzpicture}[scale=0.8]
\begin{axis}
[title={$C(x)$},
ylabel=$y$,
xlabel=$x$,
grid=both,
minor xtick={0,100,...,1000},
xtick={0,200,...,1000},
ytick={0,400,...,3200},
samples=1000]
\addplot[blue,domain=0:1000]{func(x)};
\end{axis}
\end{tikzpicture}
但计算时间会更长。函数定义也应该改变:
\pgfmathdeclarefunction{func}{1}{%
\pgfmathparse{%
(and(#1>=0 , #1<500) * (300 + #1*(12/10)) +
(and(#1>=500 , #1<=1000) * (600 + #1*(12/10))
}%
}
这样正确的值就是 500(您决定应该=
去哪里)。