我要开始为我的学生写一些讲义,我必须制作多个图表,如下所示,以图形方式表示导数的简单概念。我面临的问题是找到一种方法来自动创建这样的图形。例如,我正在寻找的是:
- 定义一个函数 f(x) (当然
TikZ
) - 声明两个点的 x 坐标,例如 x1 和 x2。现在可以使用这两个坐标来计算它们对应的 y 坐标以及三角形中显示的距离。
因此,我正在寻找类似的东西\derivative{x*x}{x1}{x2}
。我不知道如何合并域,但我想可以稍后完成。
\documentclass[letterpaper]{article}
\usepackage{fullpage}
\usepackage{amsmath,amssymb,enumitem}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\pdfpageheight\paperheight
\pdfpagewidth\paperwidth
\parindent0pt
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,>=stealth',x=1.0cm,y=1.0cm,domain=-0.5:2.25]
\draw[->,color=black] (-1,0) -- (4,0);
\foreach \x in {1,2,3}
\draw[shift={(\x,0)},color=black] (0pt,2pt) -- (0pt,-2pt) node[below] {\footnotesize $\x$};
\draw[color=black] (4,0) node [right] { $x$};
\draw[->,color=black] (0,-1) -- (0,5);
\foreach \y in {1,2,3,4}
\draw[shift={(0,\y)},color=black] (2pt,0pt) -- (-2pt,0pt) node[left] {\footnotesize $\y$};
\draw[color=black] (0,5) node [above] { $y$};
\draw[color=red,<->] plot[id=quad] function{x*x} node[right] {$f(x) =x^2$};
\fill[black] (0.5,0.25) circle (1.25pt);
\fill[black] (1.5,2.25) circle (1.25pt);
\draw (0.5,0.25)--(1.5,2.25)--(1.5,0.25)--cycle;
\draw[|-|,yshift=-0.25cm] (0.5,0.25)--(1.5,0.25);
\draw[yshift=-0.25cm](1,0.25) node[fill=white] {1};
\draw[|-|,xshift=0.25cm] (1.5,0.25)--(1.5,2.25);
\draw[xshift=0.25cm] (1.5,1.25) node [fill=white] {2};
\end{tikzpicture}
\end{document}
结果图片:
答案1
您可以为此使用 pgfplots。我编写了一个\derivative{<pgfmath function>}{<label>}{<x1>}{<x2>}{<point legend>}
可以在 pgfplots 轴内使用的新宏。它绘制函数的图,该图使用pgfmath
语法作为函数指定\x
,以及连接两个指定值处的函数点的直线。它还向图添加标签,该标签使用第二个参数指定,以及列出两个点的图例,该图例必须在第五个参数中提供。您可以使用选项中的x
图例位置和外观,以及使用和点标签的位置和外观。point legend/.style={<options>}
axis
point 1/.style
point 2/.style
例如
\begin{axis}[
azetinaplot,
domain=-0.5:2.5, samples=100,
xmin=-1, xmax=3,
point legend/.style={ at={(rel axis cs:1.1,0.5)}},
point 1/.style={anchor=south east}, point 2/.style={anchor=south east}
]
\derivative{\x^2}{$f(x)=x^2$}{1}{2}{$P_1=(1\,,\,1)$\\$P_2=(2\,,\,4)$}
\end{axis}
会产生
此处的样式azetinaplot
定义为
\pgfplotsset{
azetinaplot/.style={
width=7cm,
height=7cm,
axis lines=middle,
xlabel=$x$,
ylabel=$y$,
enlarge y limits,
clip=false
}
}
另一个例子:
\begin{axis}[
azetinaplot,
domain=-20:370, samples=100,
xmin=-20, xmax=370,
point 1/.append style={anchor=south east},
point 2/.append style={anchor=east}]
\derivative{sin(\x)}
{$f(x)=\sin(x)$}
{290}{340}
{$P_1=(290\,,\,-0.94)$\\$P_2=(340\,,\,-0.34)$}
\end{axis}
会产生
完整代码如下:
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{matrix}
\begin{document}
\pgfplotsset{point legend/.style={},
point 1/.style={anchor=south},
point 2/.style={anchor=south}
}
\newcommand{\derivative}[5]{
\begin{scope}[declare function={f(\x)=#1;}]
\addplot [thick, red, latex-latex] {f(x)} node [anchor=west] {#2};
\addplot [black, mark=*] coordinates {(#3,{f(#3)}) (#4,{f(#4)})}
node [pos=0,/pgfplots/point 1] {$P_1$}
node [pos=1,/pgfplots/point 2] {$P_2$};
\pgfplotsextra{
\pgfmathsetmacro\first{f(#3)}
\pgfmathsetmacro\second{(f(#4)}
\pgfmathsetmacro\xdiff{#4-#3}
\pgfmathsetmacro\ydiff{f(#4)-f(#3)}
\draw (axis cs:#3,\first) -| (axis cs:#4,\second);
\draw [|-|,yshift=-2ex] (axis cs:#3,\first) -- node [inner sep=1pt,fill=white] {\pgfmathprintnumber{\xdiff}} (axis cs:#4,\first);
\draw [|-|,xshift=2ex] (axis cs:#4,\first) -- node [inner sep=1pt, fill=white] {\pgfmathprintnumber{\ydiff}} (axis cs:#4,\second);
\matrix at (rel axis cs:1,1) [matrix of nodes,/pgfplots/point legend] {#5\\};
}
\end{scope}
}
\pgfplotsset{
azetinaplot/.style={
width=7cm,
height=7cm,
axis lines=middle,
xlabel=$x$,
ylabel=$y$,
enlarge y limits,
clip=false
}
}
\begin{tikzpicture}
\begin{axis}[
azetinaplot,
domain=-20:370, samples=100,
xmin=-20, xmax=370,
point 1/.append style={anchor=south east},
point 2/.append style={anchor=east}]
\derivative{sin(\x)}
{$f(x)=\sin(x)$}
{290}{340}
{$P_1=(290\,,\,-0.94)$\\$P_2=(340\,,\,-0.34)$}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
仅供参考,因为您不使用 tkz-fct。这是我的第一个包,现在我认为最好使用优秀的包 pgfplots。
我创建了一个新的宏\derivative
。这个宏并不完整,因为它仅包含信息,但可以添加标签等。计算是通过 fp 获得的:切线、斜率、曲线上点的坐标。
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{tkz-fct}
\usetikzlibrary{calc}
\begin{document}
\tkzfctset{tan style/.style={-,>=latex,blue}}
\def\alpha{3}
\newcommand\derivative[4]{%
\tkzDefPointByFct[draw](#1) \tkzGetPoint{start}
\tkzDefPointByFct[draw](#2) \tkzGetPoint{end}
\draw[thin,|-|,yshift=-3pt] (start) -- node[black,fill=white,below] {#3}(start-|end);
\draw[thin,|-|,xshift=3pt] (start-|end) -- node[black,fill=white,right] {#4}(end);
\draw[thin] (start) --(end);
}
\begin{tikzpicture}[scale=2]
\tkzInit[xmin=-1,xmax=4.5,ymax=3]
\tkzClip[space=1]
\tkzAxeXY
\tkzFct[domain=.1:5,samples=200,id=ln,line width=0.5pt,color=red]{log(x)+1}
\tkzDrawTangentLine[kl=1,kr=5](1)
\derivative{1}{4}{$\Delta x$}{$\Delta y$}
\tkzText[draw=red,fill = red!20](4,2.75){$f(x)=\ln(x)+1$}
\tkzText[blue,draw,fill = blue!20](2.8,3.5){$g(x)=x$}
\end{tikzpicture}
\end{document}
可以制作动画序列来展示如何构建切线,但只有使用 Adobe Reader 才能看到 pdf。
首先你需要创建一个文件 tgt.tex(可以使用 beamer)。现在一个好主意是使用新的宏\derivative
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{tkz-fct}
\usetikzlibrary{calc}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
\begin{document}
\tkzfctset{tan style/.style={-,>=latex,blue}}
\foreach \alpha in {4,3.8,...,1}{
\begin{tikzpicture}[scale=2]
\tkzInit[xmin=-2,xmax=6,ymin=-1,ymax=3.5]
\tkzClip[space=1]
\tkzDrawX[noticks,label={}]
\tkzDrawY[noticks,label={}]
\tkzFct[domain=.1:5,samples=200,id=ln,line width=0.5pt,color=red]{log(x)+1}
\tkzDrawTangentLine[kl=1,kr=5](1)
\tkzDefPointByFct[draw](1) \tkzGetPoint{A}
\tkzLabelPoint[above left](A){$A$}
\tkzPointShowCoord[xlabel=$a$,ylabel=$f(a)$](A)
\tkzDefPointByFct[draw](\alpha)\tkzGetPoint{M}
\tkzLabelPoint(M){$M$}
\tkzPointShowCoord[xlabel=$a+h$,noxdraw,ylabel=$f(a+h)$](M)
\tkzDefPoint(\alpha,\alpha){M'}
\tkzDrawPoint(M')
\tkzLabelPoint[above left](M'){$M'$}
\tkzPointShowCoord[ylabel=$f'(a)\times h+f(a)$](M')
\tkzDrawLines[add=0 and 2,line width=.4pt](A,M)
\end{tikzpicture}
}
\end{document}
你明白了
然后你可以用
\documentclass{article}
\usepackage{animate}
\begin{document}
\begin{center}
\animategraphics[palindrome]{12}{tgt}{}{}
\end{center}
\end{document}
我在创建动画 gif 时总是遇到同样的问题,抱歉 :(