如何在 Tikz 中创建经过特定点的曲线?

如何在 Tikz 中创建经过特定点的曲线?

这是我现在的代码:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\begin{document}

\begin{tikzpicture}[
    scale=1.5,
    axis/.style={very thick, ->, >=stealth'},
    important line/.style={thick},
    dashed line/.style={dashed, thick},
    every node/.style={color=black,}
 ]

\draw[axis] (0,0)  -- (6,0) node(xline)[right] {$k$};
\draw[axis] (0,-2) -- (0,2) node(yline)[above] {$\dot{k}$};

\draw (0,0) .. controls (0,2) and (2,2) .. (2,2);
\draw (2,2) .. controls (4,2) and (4,0) .. (6,-2);

\fill[black] (4,0) circle (1pt) node[above right] {$k^*$};
\end{tikzpicture}

\end{document}

我当前的输出是这样的,但我希望该行经过 k*。我做错了什么? 在此处输入图片描述

答案1

至少有三种可能性:

  • 构造一个具有所需属性的多项式,例如它必须经过的点、斜率、最小值、最大值等。需要少量数学知识。请参阅我的其他答案。

  • 这是安德鲁 (Andrew) 使用 TikZ 功能给出的答案。

  • 对于假曲线,选择曲线必须经过的点作为\draw命令的开始或结束,而不是作为控制点。此外,使用相对坐标(前缀为+)作为控制点。这些将对应于此点的切线。确保点上的控制向量指向相反的方向。它们的长度可能不同,但需要具有相同的角度,否则此点将出现弯曲。

例子: k^*是第一个的终点\draw和第二个的起点,因此曲线将穿过k^*。与 相关的控件k^*+(-1,2)+(0.5,-1)。请注意,它们指向相反的方向。控制向量越长,曲线尝试遵循此方向的时间就越长。

在此处输入图片描述

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\begin{document}

\begin{tikzpicture}[
    scale=1.5,
    axis/.style={very thick, ->, >=stealth'},
    important line/.style={thick},
    dashed line/.style={dashed, thick},
    every node/.style={color=black,}
 ]

\draw[axis] (0,0)  -- (6,0) node(xline)[right] {$k$};
\draw[axis] (0,-2) -- (0,2) node(yline)[above] {$\dot{k}$};

\draw (0,0) .. controls +(1.5,3) and +(-1,2) .. (4,0);
\draw (4,0) .. controls +(0.5,-1) and +(-0.8,0.5) .. (6,-2);

\fill[black] (4,0) circle (1pt) node[above right] {$k^*$};

% just for the explanation
\begin{scope}[->,blue,every node/.style={blue,sloped}]
\draw (0,0) -- node[yshift=1.5ex]{$(1.5,3)$} ($(0,0)+(1.5,3)$);
\draw (4,0) -- node[yshift=1.5ex]{$(-1,2)$} ($(4,0)+(-1,2)$);
\draw (4,0) -- node[yshift=-1.5ex]{$(0.5,-1)$} ($(4,0)+(0.5,-1)$);
\draw (6,-2) -- node[yshift=-1.5ex]{$(-0.8,0.5)$} ($(6,-2)+(-0.8,0.5)$);
\end{scope}
\end{tikzpicture}

\end{document}

答案2

hobby旨在轻松生成通过特定点的曲线。它在设计时考虑了 2D 曲线,需要一点技巧才能绘制出真实的图形,但在这种情况下它仍然可以生成合理的曲线。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/582112/86}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,hobby}
\begin{document}

\begin{tikzpicture}[
    scale=1.5,
    axis/.style={very thick, ->, >=stealth'},
    important line/.style={thick},
    dashed line/.style={dashed, thick},
    every node/.style={color=black,},
    use Hobby shortcut
 ]

\draw[axis] (0,0)  -- (6,0) node(xline)[right] {$k$};
\draw[axis] (0,-2) -- (0,2) node(yline)[above] {$\dot{k}$};

\draw (0,0) .. controls (0,2) and (2,2) .. (2,2);
\draw (2,2) .. controls (4,2) and (4,0) .. (6,-2);

\fill[black] (4,0) circle (1pt) node[above right] {$k^*$};
\draw[orange, ultra thick] ([out angle=70]0,0) .. (2,2) .. (4,0) .. (6,-2);
\end{tikzpicture}

\end{document}

经过轴线上特定点的曲线

答案3

这是一个解决方案,我们首先确定一个多项式,然后绘制它。多项式的复杂性(度)取决于我们想要施加的约束数量。我们假设函数应该通过点(0,0)(2,2)(4,0),并且还应该选择性地通过(6,-2)。这意味着我们寻找二次或三次多项式(三个或四个自由度)。

二次多项式:

p(x) = a + bx + cx^2
constraints: p(0)=0, p(2)=2, p(4)=0
solution: a=0, b=2, c=-1/2
I.e.: p(x) = 2x + x^2/2

三次多项式:

p(x) = a + bx + cx^2 + dx^3
constraints: p(0)=0, p(2)=2, p(4)=0, p(6)=-2
solution: a=0, b=8/3, c=-1, d=1/12
I.e.: p(x) = 8x/3 - x^2 + x^3/12

在此处输入图片描述

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\begin{document}

\begin{tikzpicture}[
    scale=1.5,
    axis/.style={very thick, ->, >=stealth'},
    important line/.style={thick},
    dashed line/.style={dashed, thick},
    every node/.style={color=black,}
 ]

\draw[axis] (0,0)  -- (6,0) node(xline)[right] {$k$};
\draw[axis] (0,-2) -- (0,2) node(yline)[above] {$\dot{k}$};
\fill[black] (4,0) circle (1pt) node[above right] {$k^*$};

\draw[domain=0:6,blue,smooth] plot ({\x},{2*\x-\x^2/2});
\draw[domain=0:6,red,smooth] plot ({\x},{8*\x/3-\x^2+\x^3/12});
\end{tikzpicture}

\end{document}

相关内容