在 TikZ 中自动进行衍生表示

在 TikZ 中自动进行衍生表示

我要开始为我的学生写一些讲义,我必须制作多个图表,如下所示,以图形方式表示导数的简单概念。我面临的问题是找到一种方法来自动创建这样的图形。例如,我正在寻找的是:

  1. 定义一个函数 f(x) (当然TikZ
  2. 声明两个点的 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>}axispoint 1/.stylepoint 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} 

在此处输入图片描述

可以制作动画序列来展示如何构建切线,但只有使用 Adob​​e 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 时总是遇到同样的问题,抱歉 :(

相关内容