使用 Latex 绘制参数图

使用 Latex 绘制参数图

我想要创建以下参数方程的图:

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}

在此处输入图片描述

相关内容