![tikz 路径的衍生物?](https://linux22.com/image/295051/tikz%20%E8%B7%AF%E5%BE%84%E7%9A%84%E8%A1%8D%E7%94%9F%E7%89%A9%EF%BC%9F.png)
我想绘制平滑且具有线性段的曲线。这些曲线将用于一维函数 x(t) 的图形中。[在编写入门物理家庭作业问题时用作位置与时间图。] 示例:
我想通过指定曲线经过具有特定切线的特定点来绘制这些图。这个问题很好地实现了我到目前为止所描述的内容实现语法:具有指定点和切线的平滑曲线。
但是,我的目标是在一维函数 x(t) 的图中使用这些曲线,并且非常希望能够从它们生成导数 x'(t) 的曲线。这在 内可行吗tikz
?
(我用 制作了上面的示例图pgfplots
。该函数是我在 Mathematica 中构建的分段函数。这种方法对我来说肯定有效,但过程有点麻烦。我计划使用类似于此的图表来解决足够多的问题,我真的想要一些更有效的方法。代码如下。)
代码
\pgfmathdeclarefunction{MyF}{1}{%
\pgfmathparse{%
(and (1 , #1<=5)*(3.-0.5*#1-2.24667*#1^2+2.93766*#1^3-1.55322*#1^4+0.413019*#1^5-0.0534444*#1^6+0.00265741*#1^7)) +%
(and (5<#1 , #1<7)*(4)) +%
(and (7<=#1 , #1<12)*(131.4-156.613*#1+54.0096*#1^2-7.99267*#1^3+0.538*#1^4-0.0135556*#1^5)) +%
(and (12<=#1 , 1)*(1)) %
}%
}
\begin{tikzpicture}
\begin{axis}[axis lines = middle,minor tick num = 1, grid = both, xlabel = {$t$\,(\si{s})}, ylabel = {$x$\,(\si{m})}, no markers, smooth,xmin=0, xmax=14, ymin=-6, ymax=6, samples = 100, thick, unit vector ratio = 1]
\addplot +[very thick, domain=0:14] {MyF(x)};
\end{axis}
\end{tikzpicture}
更新 以下两个答案都是通过为原始曲线构建一个明确的数学函数,然后对其求导数来绘制导数。
我非常想避免为原始曲线构建明确的数学表达式,因为对于像上面这样的图,我发现表达式很难生成,也不自然。我更愿意通过中概述的方法生成原始曲线实现语法:具有指定点和切线的平滑曲线或类似的东西。
我的问题是:如果没有曲线的明确数学表达式,是否可以在 LaTeX 中(可能通过tikz
)绘制导数。
例如,给定一条路径
\draw (0,0) .. controls (1,1) and (1,1) .. (2,0);
你能画出它的导数吗?(将我们的注意力限制在作为 x 的单值函数的路径 y(x) 上)。
答案1
最简单的办法就是伪造衍生品;
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\pgfmathdeclarefunction{MyF}{1}{%
\pgfmathparse{%
(and (1 , #1<=5)*(3.-0.5*#1-2.24667*#1^2+2.93766*#1^3-1.55322*#1^4+0.413019*#1^5-0.0534444*#1^6+0.00265741*#1^7)) +%
(and (5<#1 , #1<7)*(4)) +%
(and (7<=#1 , #1<12)*(131.4-156.613*#1+54.0096*#1^2-7.99267*#1^3+0.538*#1^4-0.0135556*#1^5)) +%
(and (12<=#1 , 1)*(1)) %
}%
}
\pgfmathdeclarefunction{MyFd}{2}{%
\pgfmathparse{(MyF(x+#2)-MyF(x))/#2}%
}
\begin{tikzpicture}
\begin{axis}[axis lines = middle,minor tick num = 1, grid = both, xlabel = {$t$\,(\si{s})}, ylabel = {$x$\,(\si{m})}, no markers, smooth,xmin=0, xmax=14, ymin=-6, ymax=6, samples = 100, thick, unit vector ratio = 1]
\addplot +[very thick, domain=0:14] {MyF(x)};
\addplot +[very thick, domain=0:14] {MyFd(x,14/100)};
\end{axis}
\end{tikzpicture}
\end{document}
TikZ 路径的修饰。它相对准确,但当然,它依赖于函数的合理输入,弯道不会太陡。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,fpu}
\pgfdeclaredecoration{approxderiv}{initial}{%
\state{initial}[width=0.01mm,
persistent postcomputation={%
\def\tempa{0}%
\pgfmathsetmacro{\plen}{(\pgfdecoratedpathlength-0.01mm)/500}%
\def\myderivlist{}%
},next state=walkthecurve]{}%do nothing
\state{walkthecurve}[width=\plen pt,
persistent postcomputation={%
\pgfmathparse{(sin(\pgfdecoratedangle))}\xdef\tempb{\pgfmathresult}%
\pgfmathparse{abs(cos(\pgfdecoratedangle))*\plen}%
\expandafter\xdef\expandafter\myderivlist\expandafter{%
\myderivlist --++ ({\pgfmathresult pt},{(\tempb-\tempa)*(1cm)})%It was cm initially afterall
}%
\xdef\tempa{\tempb}%
}
]{}%do nothing
}
\begin{document}
\begin{tikzpicture}
\draw[style=help lines] (0,-3.5) grid[step=5mm] (6,3.5);
\draw[decoration=approxderiv,postaction=decorate]
(0,0) .. controls (1,1) and (1,1) .. (2,0) arc (-90:-20:1 and 3) arc (160:120:1.5 and 1)
-- ++(-70:6) node[pos=0.2,align=center] {slope\\\pgfmathparse{sin(-70)}\pgfmathresult};
\draw[red] (0,0) \myderivlist;
\end{tikzpicture}
\end{document}
答案2
\documentclass[pstricks,border=15pt,12pt,dvipsnames]{standalone}
\usepackage{pstricks-add}
\psset
{
algebraic,
linejoin=2,
plotpoints=1000,
xAxisLabel=$t$,
yAxisLabel=$s(t)$,
urx=15pt,
ury=15pt,
llx=-5pt,
lly=-5pt,
}
\def\f{IfTE(x<0,-x^2,IfTE(x<2,x,IfTE(x<3,2*x+1,x^2/2)))}
\begin{document}
\pslegend[lt]{%
\color{NavyBlue}\rule{20pt}{2pt} & \color{NavyBlue} $s(t)$\\
\color{Red}\rule{20pt}{2pt} & \color{Red} $v(t)$
}
\begin{psgraph}{<->}(0,0)(-3,-4)(5,9){12cm}{!}
\psset{linewidth=2pt}
\psplot[linecolor=NavyBlue]{-2}{4}{\f}
\psplot[linecolor=Red]{-2}{4}{Derive(1,\f)}
\end{psgraph}
\end{document}
笔记
请记住,垂直线不能被视为图表的一部分。