我想要创建以下参数方程的图:
x(t)=t*sin(t), y(t)=t*cos(t)
-3pi/2 <= t <= 3pi/2
另外,我想在同一张图表上显示切线,即:
y-o = (-pi/2)(x-(pi/2))
我从未真正尝试过参数图,而且对软件包也没有特别要求。只要最容易使用就行。有人能帮我解决这个问题吗?谢谢!
答案1
为了好玩,pstricks
方式如下:
\documentclass[svgnames, x11names, border=3pt]{standalone}%
\usepackage[utf8]{inputenc}
\usepackage{pst-plot, pst-math, pst-text, auto-pst-pdf}%
\begin{document}
\psset{arrowinset=0.12, algebraic, plotstyle=curve, plotpoints=1000}%
\def\paracurve{t*sin(t)|t*cos(t)}
\def\tsup{\pscalculate{3*\psPiH}}
\begin{pspicture*}(-5.5,-5)(4,5)%
\psset{labels=none}
\psaxes[linecolor=LightSteelBlue3, ticksize =2pt -2pt, ]{->}(0,0)(-5.5,-5)(4,5)[$x$, -120][$y$, -135]
\uput[dl](0,0){$O $}
\uput[d](\psPiH, 0){$ \frac{\pi}{2}$} \uput[-120](-\tsup, 0){$ -\frac{3\pi}{2}$}
\uput[120](0,\psPi){$\pi$} \uput[-120](0,-\psPi){$-\pi$}
\parametricplot[linewidth=1.2pt, linecolor=IndianRed]{-\tsup}{\tsup}{\paracurve}
\psplotTangent[linecolor=Goldenrod1, linewidth=0.4pt]{\psPiH}{6}{\paracurve}
\uput[l](0,2.467){$\bigl(\frac{\pi}{2}\bigr)^{\!\scriptscriptstyle2}$}
\end{pspicture*}
\end{document}
答案2
绘制情节非常简单:
\draw plot[variable=\t,domain=-3*pi/2:3*pi/2,smooth,samples=51]
({\t*sin(\t)},{\t*cos(\t)});
其中\t
是参数。这里我们使用trig format=rad
切换到弧度。为了方便起见,我添加了一种样式tangent at
,将切线附加到给定的 t 值处。分量仅由 和 的 t 导数给出x(t)
。y(t)
长度存储在 中tangent length
。要获得 处长度为 2 的切线t=pi
,例如,您可以编写
\draw[blue,tangent length=2,tangent at=pi];
完整代码:
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[trig format=rad,tangent at/.style={insert path={
[/utils/exec=\pgfmathsetmacro{\mylength}{%
veclen(#1*cos(#1)+sin(#1),-1*#1*sin(#1)+cos(#1))/\pgfkeysvalueof{/tikz/tangent
length}}]
({#1*sin(#1)},{#1*cos(#1)}) ++
({(#1*cos(#1)+sin(#1))/(2*\mylength)},{(-1*#1*sin(#1)+cos(#1))/(2*\mylength)})
-- ++ ({(-2*#1*cos(#1)-2*sin(#1))/(2*\mylength)},
{(2*#1*sin(#1)-2*cos(#1))/(2*\mylength)})}},
tangent length/.initial=1]
\draw plot[variable=\t,domain=-3*pi/2:3*pi/2,smooth,samples=51]
({\t*sin(\t)},{\t*cos(\t)});
\draw[tangent at=2];
\draw[blue,tangent length=2,tangent at=pi];
\draw[red,tangent length=3,tangent at=-pi/2];
\end{tikzpicture}
\end{document}
也可以使用来附加切线decorations.markings
,但在您的情况下,曲线的参数化是已知的,因此最好通过分析来进行。
答案3
尝试使用 MetaPost,包含在 LuaLaTeX 程序中,使用我自己的一些宏。切线由 MetaPost 本身计算,无需知道其方程。
\documentclass[border=2mm]{standalone}
\usepackage{luatex85,luamplib,amsmath}
\mplibsetformat{metafun}
\mplibtextextlabel{enable}
\mplibnumbersystem{double}
\begin{document}
\begin{mplibcode}
vardef param_fcn (expr tmin, tmax, tstep)(text f_t)(text g_t) =
save t; t := tmin;
(f_t, g_t)
forever: hide(t := t+tstep) exitif t > tmax;
.. (f_t, g_t)
endfor
if t - tstep <> tmax: hide(t := tmax) .. (f_t, g_t) fi
enddef;
vardef f(expr t) = t * sin t enddef;
vardef g(expr t) = t * cos t enddef;
beginfig(1);
u = cm;
tmax = -tmin = 3*pi/2; tstep = .01;
path curve; curve = param_fcn(tmin, tmax, tstep)(f(t))(g(t));
draw curve scaled u withcolor red;
s := pi/2; pair M, P, Q;
M = (f(s),g(s));
pair tgt; tgt = unitvector(direction (s-tmin)/tstep of curve);
P = M + 4tgt; Q = M - 4tgt; draw (P--Q) scaled u withcolor green;
xmax = ymax = 4.5; xmin = -5; ymin = -ymax ; label.llft("$O$", origin);
drawarrow (xmin*u,0) -- (xmax*u, 0); label.bot("$x$", (xmax*u,0));
drawarrow (0, ymin*u) -- (0, ymax*u); label.lft("$y$", (0,ymax*u));
for i = -3 upto 2:
if i<>0:
xi := i/2*pi*u;
draw (xi, -2bp) -- (xi, 2bp); fi
endfor;
for j = -2 upto 2:
if j<>0:
yj := j/2*pi*u;
draw (-2bp, yj) -- (2bp, yj); fi
endfor;
label.bot("$\pi$", (pi*u,0)); label.bot("$\dfrac{\pi}{2}$", (pi*u/2,0));
label.bot("$\dfrac{-\pi}{2}$", (-pi/2*u,0));
label.bot("$-\pi$", (-pi*u, 0)); label.llft("$\dfrac{-3\pi}{2}$", (-3pi/2*u,0));
label.urt("$\pi$", (0, pi*u)); label.lrt("$-\pi$", (0, -pi*u));
endfig;
\end{mplibcode}
\end{document}