Tikz 和带轴的割线图

Tikz 和带轴的割线图

我正在尝试修改下图,使其也显示 x 轴和 y 轴上的距离。这是另一篇文章中的代码

\documentclass[10pt]{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[declare function={func(\y) = 0.1*(\y-5)*(\y-5)+1;}]
\draw[domain=2:15,smooth,variable=\x,thick] plot ({\x},{func(\x)});
\draw[fill] (6.4,{func(6.4)})node[below]{P}circle (2pt)coordinate(p);
\foreach[count=\i] \x in {8.0,9.6,...,14.4}{
    \draw[fill] (\x,{0.1*(\x-5)*(\x-5)+1})node[below]{Q$_\i$} circle (2pt)coordinate(Q\i);
    \draw[thick,blue!80,dashed,shorten >=-2cm,shorten <=-2cm] (p) -- (Q\i)node[right=0.7cm](m\i){Secante $s_\i$};
    }
\draw[thick,red!70,shorten >=-9cm,shorten <=-4cm] (p) -- (6.401,{func(6.401)});
\draw[-latex,line width=4mm,red!20] (m4.south east) to[out=-100, in=25] (m2.south east)node[below,anchor=north west,red]{tangent $t$};
\end{tikzpicture}

\end{document} 

这将输出

在此处输入图片描述

我正在尝试用图片来说明这一点:

在此处输入图片描述

我觉得这有点超出我的编程技能了?欢迎提出任何建议。

答案1

抛物线是用路径操作绘制的parabola,比绘图更有效,它的函数是已知的,它的导数也是已知的。它们被声明为XP₀ 的值,因为它出现了几次。

markx将一行添加到X轴(即edge[dashed])和小勾号(edge无选项的 )以及实际标签。X轴以及标签节点均已命名,以便我们稍后引用它们。(由于它使用了一个线条,因此edge线条的外观借用了路径,节点就是其中之一……如果有的话。)

我们将 P₀ 与 P 分开放置因为 xmark 也不同。否则,或者使用一些条件,它们可以在一个循环中完成。

在范围内,图表的当前边界框用于定义剪辑框,以便切线和割线不会绘制在其外部。(这也可以通过数学或一些 PGF 级宏来解决,但这使其变得非常容易。)

图书馆calc距离修正器用于使用大于图表的距离在 P₀ 和其他点以及切线之间绘制线条。(合理的非常安全的距离是页面对角线的长度,但这里 10cm 和 15cm 就足够了。)

之后使用命名的标记节点绘制红色箭头,使用未记录的坐标系放置文本“Sekanten”和“Tangente” intersection of。还有intersections库,但对于直线,intersection of句法就足够了。

点 P₁、P₂ 和 P₃ 的标签是通过找到它们在最上割线上的投影来放置的,尽管在我的例子中这看起来不再很好了。

也许应该放置一个透明节点,至少对于 P₃ 来说

\foreach \i in {1, ..., 3}
  \node also [label={[inner sep=.15em, circle, fill=white,
    fill opacity=.5, text opacity=1]above left:$P_{\i}$}] (P\i);

代码

\documentclass[tikz, convert]{standalone}
\usetikzlibrary{arrows.meta, calc}
\begin{document}
\begin{tikzpicture}[
  > = Latex,
  declare function={
    f(\x)  = 0.09*\x*\x + 1;
    ft(\x) = 0.18*\x;
    p0x    = 1.5;
  },
  dot/.style = {circle, fill, draw, inner sep = +0pt, minimum size = +3pt},
  xmark/.style = {
    append after command = {
      \bgroup
        \pgfextra{\let\tln\tikzlastnode}
        coordinate (\tln-x) at (\tln|-0,0) edge[dashed] (\tln)
        (\tln-x) edge node[below](\tln-mark){$#1\vphantom{h}$} +(down:3pt)
      \egroup}},
]
\draw[thick] (0,1) node[above right]{$G(f)$}
                   parabola (10,10);% ⇒ f(x) = (10−1)/10² x² + 1
\draw[->] (left:1) -- (right:10) node[below left] {$x$};
\draw[->] (down:1) -- (   up:10) node[below left] {$y$};

\node[dot, xmark=x_0, label=$P_0$] (P0) at (p0x,{f(p0x)}) {};
\foreach[count=\i] \x in {8, 5, 3}
  \node[dot, xmark=x_0+h_{\i}] (P\i) at (\x,{f(\x)}) {};

\begin{scope}
\clip (current bounding box.south west) rectangle (current bounding box.north east);
\draw[red] ($(P0)!-10cm!($(P0)+(1,{ft(p0x)})$)$) coordinate (P0-left)
        -- ($(P0)! 10cm!($(P0)+(1,{ft(p0x)})$)$) coordinate (P0-right);
\foreach \i in {1, ..., 3}
  \draw ($(P0)!-15cm!(P\i)$) coordinate (P\i-left)
     -- ($(P0)! 15cm!(P\i)$) coordinate (P\i-right);
\end{scope}

\draw[red, <-] (P0-mark.south) -- (P1-mark.south);
\foreach \i/\c/\Text in {0/red/Tangente, 2/black/Sekanten}
  \node[\c, below right] at (intersection of P1--P1-x and P0--P\i-right) {\Text};

\foreach \i in {1, ..., 3}
  \node[above left] at ($(P0)!(P\i)!(P1)$) {$P_{\i}$};
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

使用tzplot

在此处输入图片描述

\documentclass{standalone} 
\usepackage{tzplot}

\begin{document}

\begin{tikzpicture}
%\tzhelplines[thick](10,10)
\settzdotsize{3pt}
\tzaxes*(-1,-1)(10,10){$x$}[b]{$y$}[l]
%% function G(f)
\def\Gf{0.08*(\x)^2+1}
\tzfn[very thick]\Gf[10:0]{$G(f)$}[ar]
%% x_0 point
\tzvXpointat*{Gf}{1.5}(P0){$P_0$}[a]
\tzprojx[dashed](P0){$x_0$}
%% secant lines
\foreach [count=\i] \xx in {8.0,5,3}{%
  \tzvXpointat*{Gf}{\xx}(P\i){$P_\i$}[[label distance=-3pt]135]
  \tzsecant[blue]{Gf}(P0)(P\i)[-1:10]
  \tzprojx[dashed](P\i){$x_0+h_\i$}
  }
%% tangent
\tztangent[thick,red]{Gf}(P0)[-1:10]
%% labels
\tznode(8,2.1){Tangente}[ar,red]
\tznode(8,4.1){Sekanten}[ar]
\tzline[->,red](8,-.5)(1.5,-.5)
\end{tikzpicture}

\end{document}

相关内容