![TikZ PGF:如何根据多项式方程绘制类似陨石坑的 3D 表面?](https://linux22.com/image/389606/TikZ%20PGF%EF%BC%9A%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E5%A4%9A%E9%A1%B9%E5%BC%8F%E6%96%B9%E7%A8%8B%E7%BB%98%E5%88%B6%E7%B1%BB%E4%BC%BC%E9%99%A8%E7%9F%B3%E5%9D%91%E7%9A%84%203D%20%E8%A1%A8%E9%9D%A2%EF%BC%9F.png)
假设我们有某种像这样的平方三维图:
最小工作示例(MWE):
\documentclass{standalone}
\usepackage{tikz, pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=20]
\addplot3[surf, domain=-2:2] {-x^2-y^2};
\end{axis}
\end{tikzpicture}
\end{document}
结果截图:
x
我怎样才能用两个方向和的某些四次多项式公式(y
例如-1/3*x^4+x^2
和)替换当前图形-1/3*y^4+y^2
?
期望结果的草稿
最后它看起来应该是这样的:
草稿或多或少是一座圆形的火山,中间有一个火山口,我希望你能想象。:-)
我不知道为什么,但是有几种方法......
\addplot3[surf, domain=-2:2] {(-1/3*y^4+y^2)*(-1/3*y^4+y^2)};
... 没有像我预期的那样出现。
答案1
类似这样的事?(根据迹象表明,这就是所谓的墨西哥帽潜力。)
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=20,zmin=0,zmax=1]
\addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
\end{axis}
\end{tikzpicture}
\end{document}
或者,如果你
\addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
你会得到
是的,可以将图扩展到轴,但它并不像人们想象的那么简单(或者我遗漏了一些明显的东西)。
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=(\x^2+\y^2)-0.5*(\x^2+\y^2)^2;}]
\begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% \clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
\addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
\end{axis}
\end{tikzpicture}
\end{document}
获得更浅的局部最小值的一种方法是增加绘图范围。
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=(\x^2+\y^2)-0.5*(\x^2+\y^2)^2;}]
\pgfmathsetmacro{\myxmax}{2}
\pgfmathsetmacro{\myzmin}{f(\myxmax,0)}
\begin{axis}[samples=20,zmin=\myzmin,zmax=1,xmin=-\myxmax,xmax=\myxmax,ymin=-\myxmax,ymax=\myxmax]
\addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),\myzmin)}] {f(x,y)};
\end{axis}
\end{tikzpicture}
\end{document}