如何calc
在 TikZ 中使用函数?
例如,假设我有一个函数f(x)=x^2
。
现在,我想要找到f(1)
和f (2)
,然后我想要\draw f(1) -- f(2);
。
答案1
pgf 2.1 的可能性
\documentclass{article}
\usepackage{tikz}
\makeatletter
\pgfmathdeclarefunction{square}{1}{%
\begingroup
\pgfmathparse{#1*#1}
\pgfmath@smuggleone\pgfmathresult%
\endgroup}
\begin{document}
\begin{tikzpicture}
\draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,8.1);
\draw[->] (-0.2,0) -- (3.2,0) node[right] {$x$};
\draw[->] (0,-0.2) -- (0,4.2) node[above] {$f(x)$};
\draw[domain=0:3] plot (\x,{square(\x)-1}) node[below right] {$f(x) = x^2$};
\end{tikzpicture}
\end{document}
答案2
我不太清楚你想做什么。
如果您想要绘制函数,那么 TikZ\plot
命令就是您要找的:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[very thin,color=gray] (-0.1,-0.1) grid (2.9,4.1);
\draw[->] (-0.2,0) -- (3.2,0) node[right] {$x$};
\draw[->] (0,-0.2) -- (0,4.2) node[above] {$f(x)$};
\draw[domain=1:2] plot (\x,{\x^2}) node[below right] {$f(x) = x^2$};
\end{tikzpicture}
\end{document}
前几个命令只是绘制轴和网格,最后一个命令绘制图。当然,这node[below right] {$f(x) = x^2$}
部分完全是可选的。
有关详细信息,请参阅 TikZ 手册的“函数图”一章(2.10 手册中的第 19 章)。
编辑:对 Jacques 版本的问题的回答:
它可能不起作用,因为宏的扩展顺序不正确。我不知道如何直接修复它,但 pgf 实际上提供了自己的创建数学函数的功能:\pgfmathdeclarefunction
。它在 v2.10 手册的第 65 章(“自定义数学引擎”)中进行了描述。下面是简短的描述:宏采用 3 个参数:
- 应该创建的函数的名称,
- 函数接受的参数数量
- 执行实际计算并设置
\pgfmathresult
宏的一些代码。最简单的方法是调用\pgfmathparse
(这当然不是计算效率最高的方法,但它是最简单的方法)。
例如,一个函数square
可能定义为
\pgfmathdeclarefunction{square}{1}{\pgfmathparse{#1*#1}}
然后你就可以编写类似的代码\draw (1,{square(1)}) -- (2,{square(2)});
。
答案3
这实际上不是一个答案,而是一种尝试,以使我认为 Regis 提出的问题更加精确。如果我这样做
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\square}[1]{\pgfmathparse{#1*#1}\pgfmathresult}
\begin{document}
\begin{tikzpicture}
\node {\square{1}};
\end{tikzpicture}
\end{document}
我确实得到了一个在 (0,0) 处只有 1.0 的图形。另一方面,如果我尝试使用函数 \square 来计算坐标,我会得到我无法理解的错误:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\square}[1]{\pgfmathparse{#1*#1}\pgfmathresult}
\begin{document}
\begin{tikzpicture}
\draw (1,\square{1}) -- (2,\square{2});
\end{tikzpicture}
\end{document}
用 \draw 命令替换并%\draw ($(1,\square{1})$) -- ($(2,\square{2})$);
没有帮助。
答案4
使用 PSTricks 会变得容易得多。表示问题要点的一种方法(除其他方法外)是使用以下语法。
(*<const RPN expression> {<infix expression in x>})
例如,point(*3 {x^2})
代表点(3,9)
。
最小工作示例
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\def\f{x^2}
\begin{document}
\begin{pspicture}(-3,-1)(3,5)
\psaxes(0,0)(-3,-1)(3,5)
\psplot[linecolor=blue,algebraic]{-2}{2}{\f}
\psline[linecolor=red](*{-3 2 div} {\f})(*1 {\f})
\end{pspicture}
\end{document}
各种各样的
如果x
是的函数y
,我们有如下的另一种语法。
(**{<infix expression in y>} <const RPN expression>)
例如,point(**{-sqrt(y)} 4)
代表点(-2,4)
。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\def\f{x^2}
\begin{document}
\begin{pspicture}(-3,-1)(3,5)
\psaxes(0,0)(-3,-1)(3,5)
\psplot[linecolor=blue,algebraic]{-2}{2}{\f}
\psline[linecolor=red](**{-sqrt(y)} 9 4 div)(*1 {\f})
\end{pspicture}
\end{document}