我正在尝试修改下图,使其也显示 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}