我目前正在尝试根据给定的数据集绘制投资组合前沿,但双曲线不是很漂亮。利用数据,我计算出了前沿的以下解析表达式:
上半部分:0.665918 * (√(x 2 - 7.00569) + 1.12816)
下半部分:−0.665918 * (√(x 2 - 7.00569) - 1.12816)
我的边境情节代码是:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
height=10cm, width=16cm,
axis x line=bottom, axis y line=left,
xlabel = Standard Deviation, ylabel = Expected Return,
ymin=-3, ymax=7, xmin=0, xmax=8,
enlargelimits=true,
]
\addplot[
domain = 2:10,
samples = 200,
smooth,
ultra thick,
blue,
] {0.665918 * (sqrt(x^2 - 7.00569) + 1.12816)};
\addplot[
domain = 2:10,
samples = 200,
smooth,
ultra thick,
green,
] {-0.665918 * (sqrt(x^2 - 7.00569) - 1.12816)};
\end{axis}
\end{tikzpicture}
\end{document}
显然,中间有很大差距 - 是什么原因造成的?我该如何解决?我有另一个软件可以毫无困难地绘制整个双曲线 - 但它不像这个图那么干净和流畅。
答案1
问题在于,函数在尖点附近非常陡峭(无限陡峭)---它没有定义,x<sqrt(7.00569)
然后它突然跳起。
现在,在 2 到 10 之间绘图,即使有 200 步,您也会发现函数不存在的点的值,之后又会发现另一个有值的点。但准确获得尖点的概率为 0。斜率如此之高,以至于您会看到绘制的差异。
一个解决方案是从尖点开始绘制函数。
\documentclass{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
height=10cm, width=16cm,
axis x line=bottom, axis y line=left,
xlabel = Standard Deviation, ylabel = Expected Return,
ymin=-3, ymax=7, xmin=0, xmax=8,
enlargelimits=true,
]
\addplot[
domain = 2.64683:10,
% domain = 2:10,
samples = 200,
ultra thick,
blue,
] {0.665918 * (sqrt(x^2 - 7.00569) + 1.12816)};
\addplot[
domain = 2.64683:10,
% domain = 2:10,
samples = 200,
ultra thick,
green,
] {-0.665918 * (sqrt(x^2 - 7.00569) - 1.12816)};
\end{axis}
\end{tikzpicture}
\end{document}
另一种可能性(可能更好,但我现在懒得去寻找,以避免使用太多样本)是推导出抛物线函数,例如,x=f(y)
并使用域来绘制该函数y
,例如https://tex.stackexchange.com/a/375478/38080。
如果你把它添加到你的情节中
\addplot[
red, dotted, mark=*, samples=100, domain=-4:5
]
({sqrt(7.00569 + ( x/0.665918-1.12816)^2)},{x});
你将拥有: