答案1
可能最难的部分是找到一个合适的函数来绘图,但稍微思考一下就会发现类似的东西是x^2/2-3x+5
可行的。由于您想多次重复使用此功能,我认为最好的方法是使用以下方法显式声明该函数:
\begin{tikzpicture}[declare function={f(\x)=0.5*\x*\x-3*\x+5;}]
...
\end{tikzpicture}
之后,您可以使用(a,{f(a)})
的不同值绘制点a
。 周围的括号f(a)
是必要的,以便蒂克兹不会对绘制点的坐标感到困惑。这里a
可以是任何东西,从明确的数字到\foreach
循环或plot
命令中的变量。
一旦完成了一些相当简单的蒂克兹命令产生:
请注意,与 OP 中的图像不同,我将点放在函数的顶部,因为我认为这看起来更好。要更改此设置,您只需将命令移到循环plot
之后\foreach
。我留下了“最小”和“学习步骤”这两个词作为练习:)
以下是代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\tikzset{
point/.style = {% define a style for the function points
circle,
fill=#1,
draw=black,
inner sep=2pt,
},
point/.default = {violet!60}
}
\begin{tikzpicture}[declare function={f(\x)=0.5*\x*\x-3*\x+5;}]
\draw[thick,-{LaTeX}](0,0)--(6,0) node[right]{$\theta$};
\draw[thick,-{LaTeX}](0,0)--(0,4) node[above]{Cost};
\draw[thick, dashed](0.6, {f(0.6)}) -- (0.6,0)
node[below, text width=4em, align=center]{Random initial value};
\draw[thick, dashed](3, {f(3)}) -- (3,0) node[below]{$\hat\theta$};
\draw[domain=0.5:5.5, smooth, thick, gray] plot (\x, f(\x);
\foreach \a [count=\c, remember=\c as \C] in {0.6, 1.0, ..., 2.6} {
\node[point] (\c) at (\a, {f(\a)}){};
\ifnum\c>1 % after the first coordinate draw an arrow
\draw[->, bend left](\C) to (\c);
\fi
}
\node[point=yellow] (Y) at (3, {f(3)}){}; % add the yellow point
\draw[->, bend left](6) to (Y);
\end{tikzpicture}
\end{document}
只需改变循环中的点列表\foreach
(然后更新(6)
为最后一个命令中绘制的点数\draw
)即可添加更多点。