问题

问题

因此,我尝试创建一些简单的 sudo 随机数据,并用趋势线绘制结果。最佳拟合线性近似。我尝试创建类似下图的东西

在此处输入图片描述

这是我目前所拥有的

在此处输入图片描述

问题

  • 我不知道我是否可以axis y discontinuity=parallel在两个方向上使用来获得蓝色不连续性。
  • 我对变量和绘图的随机化感觉非常复杂

简短说明

我有以下功能

f(\T) = 1.08 * 10^10 * exp(-12667/\T)

我正在尝试从中创建一些符合该方程(阿伦尼乌斯方程)的虚构实验数据。然后我尝试用线性回归将数据绘制在对数图中。我这样做如下

\pgfmathsetmacro{\arrenhiusOneX}{int(2*random(300,305))}

\pgfkeys{/pgf/fpu}
  \pgfmathparse{f(\arrenhiusOneX)+2*rand}
  \edef\arrenhiusOneY{\pgfmathresult}
  \pgfmathparse{ln(\arrenhiusOneX)}
  \edef\arrenhiusOneYi{\pgfmathresult}
\pgfkeys{/pgf/fpu=false}

我故意手动添加了一些噪音。因为值太大,我不得不使用库fpu。然后我把这些点放到一个表中。

\pgfplotstableread{
X Y
{\arrenhiusZeroXi} {\arrenhiusZeroYi}
.
. 
.
}\datatable

从中我可以创建线性拟合线。

\addplot [thick, red] table[
    y={create col/linear regression={y=Y}}
] % compute a linear regression from the input table
{\datatable};

然而,正如前面提到的,这让人感觉很复杂。

代码

\documentclass[margin=5mm]{standalone}
\usepackage{mathtools}
\usepackage{xcolor}
\usepackage[version=4]{mhchem}
\usepackage{siunitx}
\usepackage{pgfplots, pgfplotstable}
    \pgfplotsset{
        compat=1.16,
        % declare your function here ...
        /pgf/declare function={
            f(\T) = 1.08 * 10^10 * exp(-12667/\T);
        },
    }
\pgfmathsetmacro{\arrenhiusZeroX}{592}
\pgfmathsetmacro{\arrenhiusOneX}{int(2*random(300,305))}
\pgfmathsetmacro{\arrenhiusTwoX}{int(2*random(310,315))}
\pgfmathsetmacro{\arrenhiusThreeX}{int(2*random(325,327))}
\pgfmathsetmacro{\arrenhiusFourX}{558}

\pgfmathsetmacro{\arrenhiusZeroXi}{1/\arrenhiusZeroX}
\pgfmathsetmacro{\arrenhiusOneXi}{1/\arrenhiusOneX}
\pgfmathsetmacro{\arrenhiusTwoXi}{1/\arrenhiusTwoX}
\pgfmathsetmacro{\arrenhiusThreeXi}{1/\arrenhiusThreeX}
\pgfmathsetmacro{\arrenhiusFourXi}{1/\arrenhiusFourX}

\pgfkeys{/pgf/fpu}
\pgfmathparse{f(\arrenhiusOneX)+2*rand}
\edef\arrenhiusOneY{\pgfmathresult}
\pgfmathparse{f(\arrenhiusTwoX)+2*rand}
\edef\arrenhiusTwoY{\pgfmathresult}
\pgfmathparse{f(\arrenhiusThreeX)+2*rand}
\edef\arrenhiusThreeY{\pgfmathresult}

\pgfmathparse{ln(\arrenhiusZeroX)}
\edef\arrenhiusZeroYi{\pgfmathresult}
\pgfmathparse{ln(\arrenhiusOneX)}
\edef\arrenhiusOneYi{\pgfmathresult}
\pgfmathparse{ln(\arrenhiusTwoX)}
\edef\arrenhiusTwoYi{\pgfmathresult}
\pgfmathparse{ln(\arrenhiusThreeX)}
\edef\arrenhiusThreeYi{\pgfmathresult}
\pgfmathparse{ln(\arrenhiusFourX)}
\edef\arrenhiusFourYi{\pgfmathresult}

\pgfkeys{/pgf/fpu=false}

\pgfplotstableread{
X Y
{\arrenhiusZeroXi} {\arrenhiusZeroYi}
{\arrenhiusOneXi} {\arrenhiusOneYi}
{\arrenhiusTwoXi} {\arrenhiusTwoYi}
{\arrenhiusThreeXi} {\arrenhiusThreeYi}
{\arrenhiusFourXi} {\arrenhiusFourYi}
}\datatable

\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        title = {\ce{2NO2 -> 2NO + O2}},
        xlabel={1/T [\si{\per\kelvin}]},
        ylabel={ln(k [\SI{e-4}{\cm\cubed\per\mol\per\s}]})],
        minor x tick num=4,
        title = {\ce{2NO2 -> 2NO + O2}},
        xmin=0.0015, xmax=0.0017,
        ymin=0,ymax=4.5,
        ytick={0,0.5,...,4},
        minor grid style={black!25},
        major grid style={black},
        grid=both,
        minor y tick num=4,
        ylabel=Error]
\addplot [only marks,
    every mark/.append style={solid, fill=black},
    mark = square*] table {\datatable};
\addplot [thick, red] table[
    y={create col/linear regression={y=Y}}
] % compute a linear regression from the input table
{\datatable};
    \end{axis}
\end{tikzpicture}
\end{document}

答案1

这是一个部分答案,仅涉及随机数的创建。

pgfplotstable允许您根据数学表达式(包括随机数)生成 N 值列,因此无需定义 N * 4 宏。random(a,b)虽然不可用,但int(a + rnd * (b - a))效果相同 (?)。请注意,我对 X 值使用了一个随机数表达式,而不是像您的示例中那样使用五个不同的表达式,但您必须自己决定这是否有问题。

正如我所说,这并没有解决不连续性问题。但是,如果它的目的是显示线与 y 轴相交的位置,那么一个选项可能是只添加node包含该信息的。该值在 中可用\pgfplotstableregressionb。我在代码中添加了一个示例,该示例已被注释掉。

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{mathtools}
\usepackage[version=4]{mhchem}
\usepackage{siunitx}
\usepackage{pgfplotstable}
    \pgfplotsset{
        compat=1.16,
        % declare your function here ...
        /pgf/declare function={
            f(\T) = 1.08 * 10^10 * exp(-12667/\T);
        },
    }

% random(a,b) is not available in this context, so use
% int(a + rnd * (b - a)) instead
\pgfplotstablenew[
  % create X-column
  create on use/X/.style={create col/expr={int(550+rnd*100)}},
  columns={X}
  ]{5} % number of rows
   {\datatable}

% then add the rest
\pgfplotstablecreatecol[create col/expr={1/\thisrow{X}}]{Xi}{\datatable}
\pgfplotstablecreatecol[create col/expr={f(\thisrow{X})+2*rand}]{Y}{\datatable}
\pgfplotstablecreatecol[create col/expr={ln(\thisrow{X})}]{Yi}{\datatable}
\pgfkeys{/pgf/fpu=false}
\begin{document}
%\pgfplotstabletypeset\datatable

\begin{tikzpicture}
    \begin{axis}[
        title = {\ce{2NO2 -> 2NO + O2}},
        xlabel={1/T [\si{\per\kelvin}]},
        ylabel={ln(k [\SI{e-4}{\cm\cubed\per\mol\per\s}])},
        ]

\addplot [only marks,
    every mark/.append style={solid, fill=black},
    mark = square*] table [x=Xi, y=Yi] {\datatable};
\addplot [thick, red] table[x=Xi,
    y={create col/linear regression={y=Yi}}
] % compute a linear regression from the input table
{\datatable};

   %\node [above right=2mm] at (current axis.south west) {Intersect: \num[round-mode=places,round-precision=2]{\pgfplotstableregressionb}};
   \end{axis}
\end{tikzpicture}
\end{document}

相关内容