pgfplots:在三维表面上定位法线和切向量

pgfplots:在三维表面上定位法线和切向量

我觉得应该有一种简单、好的方法绘制三维曲面并在曲面上的某个点放置一个(或多个)矢量,其中矢量是点和曲面的函数。例如,法向量。

我当然可以计算坐标并将其输入为draw,但这似乎不是有效的方法。我正在寻找类似这样的东西:

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
]
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
] 
{exp(-x^2-y^2)*x};
\addplot3[
black,-stealth,samples=2,
quiver,quiver/.cd,
    u=-exp(-x^2-y^2)+2*exp(-x^2-y^2)*x^2,v=2*exp(-x^2-y^2)*x*y,w=1,
    scale arrows=0.2,
] {exp(-x^2-y^2)*x};
\addplot3[
blue,-stealth,samples=2,
quiver,quiver/.cd,
    u=2*exp(-x^2-y^2)*x*y,v=exp(-x^2-y^2)-2*exp(-x^2-y^2)*x^2,w=0,
    scale arrows=5.8,
] {exp(-x^2-y^2)*x};
\end{axis}
\end{tikzpicture}
\end{document}

结果

我只想控制放置向量的精确点(比如,x=1y=0,并pgfplots计算相应的z坐标和向量等)。

答案1

我能做的是告诉您如何在预定义位置绘制单个箭筒箭头。这可以使用表格来完成。但是,我无法确信这些是曲面的切线和法线。除了二维曲面具有二维切线空间(意味着没有单个切线)这一事实之外,还缺少函数值的信息。对我来说,以下代码的输出只是分别由x=0y=0定义的曲线上的两条切线,但连接在z=0而不是z=f(x,y)。(很可能是我引入了符号错误。我很乐意进一步扩展这一点。在我看来,有两个定义明确的箭头状对象可以绘制:梯度和法线。您是否在暗中寻找它们?)declare function如果要处理想要多次使用的冗长表达式,使用它也是有意义的。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=exp(-\x*\x-\y*\y)*\x;
dfdx(\x,\y)=exp(-\x*\x-\y*\y)-2*exp(-\x*\x-\y*\y)*\x^2;
dfdy(\x,\y)=-2*exp(-\x*\x-\y*\y)*\x*\y;}]
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
] 
{f(x,y)};

\addplot3 [color=blue,-stealth,
    quiver={u={-dfdx(\thisrow{x},\thisrow{y})},v={-dfdy(\thisrow{x},\thisrow{y})},
    w=1,scale arrows=0.2},
    ] table {
x y z
1 0 0
0.7 0.2 0
    };

\addplot3 [color=blue,-stealth,
    quiver={u={-dfdy(\thisrow{x},\thisrow{y})},v={dfdx(\thisrow{x},\thisrow{y})},
    w=0,scale arrows=2},
    ] table {
x y z
1 0 0
0.7 0.2 0
    };
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

至于评论中的问题:你可以添加坐标z。一种可能性是

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=exp(-\x*\x-\y*\y)*\x;
dfdx(\x,\y)=exp(-\x*\x-\y*\y)-2*exp(-\x*\x-\y*\y)*\x^2;
dfdy(\x,\y)=-2*exp(-\x*\x-\y*\y)*\x*\y;}]
\pgfmathsetmacro{\fone}{f(1,0)}
\pgfmathsetmacro{\ftwo}{f(0.7,0.2)}
\begin{axis}[
xlabel=$x$, ylabel=$y$,
domain=0:2,
domain y=-1.3:1.3,
]
\addplot3[
surf,
shader=interp,
] 
{f(x,y)};

\addplot3 [color=blue,-stealth,
    quiver={u={-dfdx(\thisrow{x},\thisrow{y})},v={-dfdy(\thisrow{x},\thisrow{y})},
    w=1,scale arrows=0.2}, % ,z={f(\thisrow{x},\thisrow{y})}
    ] table {
x y z
1 0 \fone
0.7 0.2 \ftwo
    };

\addplot3 [color=blue,-stealth,
    quiver={u={-dfdy(\thisrow{x},\thisrow{y})},v={dfdx(\thisrow{x},\thisrow{y})},
    w=0,scale arrows=2},
    ] table {
x y z
1 0 \fone
0.7 0.2 \ftwo
    };
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我想必须这是一种更简单的添加z坐标的方法。但我仍然不确定我是否知道我在这里做什么。如果我知道你真正想要绘制什么,我会更加热情。绘制参数曲线在xy方向上的切线,它们的矢量积得出法线。到目前为止,我们w手动添加,但我们可以直接计算,不是吗?

相关内容