使用 Pgfplots 包绘制投资组合边界

使用 Pgfplots 包绘制投资组合边界

我目前正在尝试根据给定的数据集绘制投资组合前沿,但双曲线不是很漂亮。利用数据,我计算出了前沿的以下解析表达式:

上半部分: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});

你将拥有:

在此处输入图片描述

相关内容