要绘制的函数如下
其中,这些约束成立:
如果绘制出来看起来像
请原谅不同的符号,我会解释:p/p_0
等同于\Pi
并且\gamma
等同于\kappa
。
该图是使用 Matlab 中的数据生成的,并通过 CSV 文件输入到 LaTeX/PGF 中。这很好用,但当然数据不能再修改了,所以我想自然而然地把所有数据都放在 Latex 中。另外,在 Latex 中做东西很有趣。
我使用 Tikz/PGF 库定义了一个函数,math
例如
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{math}
\tikzmath{%
function prcrit(\x) {%
return (2/(\x+1))^(\x/(\x-1));
};
function psimax(\x) {%
return (sqrt(\x/(\x+1))) * (2/(\x+1))^(1/(\x-1));
};
function psi(\x,\y) {%
\psimax = psimax(\x);%maximum psi only dependent on kappa / k
\prcrit = prcrit(\x);%critical pressure ratio only dependent on kappa / k
if \y<\prcrit then {\efflux = \psimax;} else {\efflux = sqrt(\x/(\x-1))*(\y)^(1/\x)*sqrt(1-\y^((\x-1)/\x));};
return \efflux;
};
}%
其中prcrit
(压力比 Pi) 代表$\Pi_{mathrm{crit}}$
上图中的,psimax
代表的最大值\Psi
(参见初始方程的两个情况中的第一种)。因此,对于任何低于临界值的压力比,该函数\Psi
都设置为其各自的最大值。\Psi_{\mathrm{max}}
问题在于,定义分段三维函数的边界本身是两个输入变量之一的函数,即\kappa
,参见第二个方程。
所以,此主题 和这个没有帮助我。这个答案看起来与我的尝试非常接近,但它似乎不适用于两个变量。它也没有利用环境axis
,只是绘制了一张普通的 tikz 图片。这也是我在包的文档中找到的方法。
理想情况下,最终结果可能类似于此:
\begin{tikzpicture}
\begin{axis}
\addplot3[domain=1.3:1.7,y domain=0:1,surf] {psi(\x,\y)};
\end{axis}
\end{tikzpicture}
但我无法开始工作。问题本质上是将function
序言中迄今为止的功能声明与surf
使用axis
环境的常规图结合起来。我还没有找到这样的解决方案。
该函数还需要包含在\Pi
和的相当狭窄的边界内\kappa
,即分别为 0 到 1 和大约 1.3 到 1.7。这就是我试图通过分配相应的domain
边界来实现的。对于 的 0 和 1 \Pi
,该函数也具有无限梯度(可以在上面的函数图中清楚地看到),因此 pgfplots 过去也在那里出现过一些问题;但情况还不算太糟。
答案1
和declare function
可能更容易(因为你无法tikzmath
轻松使用fpu
)。这个值y=0
有点棘手,但由于对的真正依赖性y
不是太强,我想说它足以开始绘制y=0.01
左右的图。
\documentclass[border=3.14mm,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={%
prcrit(\x)=(2/(\x+1))^(\x/(\x-1));
psimax(\x)=(sqrt(\x/(\x+1))) * (2/(\x+1))^(1/(\x-1));
psi(\x,\y)=ifthenelse(\y<prcrit(\x),psimax(\x),
sqrt(\x/(\x-1))*((\y)^(1/\x))*sqrt(1-\y^((\x-1)/\x)));}]
\begin{axis}[view={45}{45},xlabel={$\gamma$},ylabel={$p/p_0$},zlabel={$\Psi(\gamma,p/p_0)$},
point meta min=-1]
\addplot3[opacity=0.6,colormap/viridis,domain=1.3:1.7,y domain=0.01:1,surf] {psi(\x,\y)};
\end{axis}
\end{tikzpicture}
\end{document}