好吧,我在网上寻找一些关于二项分布和泊松分布(不是累积分布)的 LaTeX 格式的表格。但我只找到了累积分布代码,我不想要。然后我四处寻找其他格式(不是 LaTeX),但我只找到大型表格(3-4 页)。
所以我想,是否可以让 LaTeX 根据一些变量进行计算,然后给出表格。这可能吗?
最后的想法是这, 哪一个是可怕老师给我们的桌子。
编辑: 这是我原来的想法(我知道的唯一方法):
\documentclass[tikz]{standalone}
\standaloneconfig{border=2mm}
\begin{document}
\begin{tikzpicture}
\foreach \c in {2,...,7}{
\def\n{0.6*\c}
\draw (-1,-\n^2/2 -\n/2) node {$\c$};
\draw (-1.5,-\n^2/2 -\n/2 + 0.3) -- (22,-\n^2/2 -\n/2 + 0.3);
\foreach \k in {0,...,\c}{
\draw (0, -\n^2/2 -\n/2 -0.6*\k) node {$\k$};
\foreach \p/\h in {0.01/1,0.05/2,0.1/3,0.15/4,0.2/5,0.25/6,0.3/7,0.3333333333/8,0.35/9,0.4/10,0.45/11,0.49/12,0.5/13}{
\draw (1.6*\h, -\n^2/2 -\n/2 -0.6*\k) node {\pgfmathparse{\n!/(\k!*(\n-\k)!)*\p^(\k)*(1-\p)^(\n-\k)}\pgfmathresult};
}
}
}
\end{tikzpicture}
\end{document}
它需要一些调整,但这是最初的想法。问题是我不能让\c
go 达到 10,我得到了一个算术溢出(我不知道它是什么),当然,这不是一张真正的桌子。
编辑2:这是我的第二版。现在有一些小问题,但几乎被@Qrrbrbirlbel 解决了。还有一些小问题我忽略了,因为这对我来说没有必要,但将来可能会有人问到它:
\myHeadList{0.1,0.5,0.10,...,0.30}
首先,如果你尝试用来写,它就不能很好地工作...
,PGF 在这里有一些问题(对于非整数)。Qrrbrbirlbel 的回答部分解决了这个问题。其次,为了使行的颜色交替,我们可以
\usepackage[table]{xcolor}
在序言和\rowcolors{2}{gray!10}{white}
文档内部使用。但booktabs
这种方法效果不太好。
答案1
以下代码展示了一种无需使用外部应用程序的解决方案。
二项分布
我现在已经包含了 PGF 自己的fpu
库。希望它的设置是正确的。
甚至n > 8
现在就可以编译(之前:! Dimension too large.
,这是由于二项式系数的计算。)
使用的软件包:
geometry
更改纸张布局,booktabs
用于表格的美观布局(\top
- 、\mid
- 和\toprule
)pgf
对于计算,fpu
图书馆,pgf/number format
,
pgffor
对于\foreach
循环,以及etoolbox
用于简单地编写表格内容。amsmath
应该使用\binom
and来代替and !\frac
\choose
\over
如何使用。
存在一个用户宏:\binomTable[<zero>]{<start n>}{<end n>}
。
可选参数决定是否应该对<zero>
零单元格 ( ) 进行排版( :已排版,其他所有内容:均未排版)。 [这是硬编码的,对键的任何更改都必须手动进行隐藏。]0.0000
0
0.0000
0.0000
/pgf/number format/precision
第二和第三个参数定义开始和结束n, 分别。
二项式系数
对于二项式系数,我使用了以下公式i = \j
pgfplotstable
?
是的,请问一下。
我不知道如何使用pgfplotstable
。
代码
\documentclass[landscape]{article}
\usepackage[landscape, margin=.5cm]{geometry}
\usepackage{booktabs}
\usepackage{pgf,pgffor}
\usepackage{etoolbox}
\usepgflibrary{fpu}
\pgfkeys{/pgf/fpu}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
\pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=4}
%%% Defining basic stuff
\def\myHeadList{0.01, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 1/3, 0.35, 0.40, 0.45, 0.49, 0.50}
%\def\startN{9}
%\def\endN{10}
\newif\ifsomanyzeroesshouldbeprinted
\newcommand*{\binomTable}[3][0]{% #1 = 0 => results in the form 0.0000 are typeset
% #1 != 0 => results in the form 0.0000 are omitted
% #2 = startN
% #3 = endN
\edef\startN{#2}%
\edef\endN{#3}%
\expandafter\ifnum#1=0\relax%
\somanyzeroesshouldbeprintedtrue%
\else%
\somanyzeroesshouldbeprintedfalse%
\fi%
%
%%% Building head of table
\def\myHead{ $n$ & $k$ & $n\choose k$}%
\foreach \p in \myHeadList {%
\xappto\myHead{& {$\p$}}%
}%
\appto\myHead{\\}%
%
%%% Bulding body of table
\def\myTable{}%
\def\myN{\startN,...,\endN}%
\foreach \n in \myN {%
\foreach \k in {0,...,\n}{%
\ifnum\k=0\relax%
\xappto\myTable{\noexpand\midrule\n}%
\fi%
\xappto\myTable{& \k}%
\pgfmathsetmacro{\binomProduct}{1}%
\xdef\myTempValue{\binomProduct}%
\ifnum\k=0\relax%
\xdef\oldK{\k}%
\else%
\foreach \j in {1,...,\k}{%
\pgfmathsetmacro{\binomProduct}{\myTempValue*(\n+1-\j)/\j}%
\xdef\myTempValue{\binomProduct}%
}%
\fi%
\pgfmathsetmacro{\myTempValue}{round(\myTempValue)}%
\xappto\myTable{& \noexpand\pgfmathprintnumber[/pgf/number format/.cd,fixed,precision=0,set thousands separator={\,},min exponent for 1000 sep=4]{\myTempValue}}%
\foreach \p in \myHeadList {%
\pgfmathsetmacro{\result}{\myTempValue*\p^(\k)*(1-\p)^(\n-\k)}%
\ifsomanyzeroesshouldbeprinted%
\xappto\myTable{& \noexpand\pgfmathprintnumber{\result}}%
\else%
\ifdim\result pt<0.00005pt\relax%
\gappto\myTable{&}%
\else%
\xappto\myTable{& \noexpand\pgfmathprintnumber{\result}}%
\fi%
\fi%
}%
\gappto\myTable{\\}%
}%
}%
}
\pagestyle{empty}
\def\formulae{%
\begin{tabular}{@{}l@{}}
$\displaystyle p(\xi=k)={{n}\choose{k}} p^k q^{n-k}$ \\
$\displaystyle {n\choose k}=\prod_{j=1}^k {n+1-j \over j}$
\end{tabular}%
}
\begin{document}
\binomTable[1]{2}{8}
\begin{tabular}{rrr*{13}{r}}
\toprule\myHead\myTable\midrule\myHead\bottomrule
\end{tabular}
\hfill\formulae
\binomTable[1]{9}{11}
\begin{tabular}{rrr*{13}{r}}
\toprule\myHead\myTable\midrule\myHead\bottomrule
\end{tabular}
\hfill\formulae
\binomTable[1]{12}{14}
\begin{tabular}{rrr*{13}{r}}
\toprule\myHead\myTable\midrule\myHead\bottomrule
\end{tabular}
\hfill\formulae
\binomTable[1]{15}{16}
\begin{tabular}{rrr*{13}{r}}
\toprule\myHead\myTable\midrule\myHead\bottomrule
\end{tabular}
\hfill\formulae
\end{document}
输出
这些是旧图像,当前代码在n \choose k
给定的位置添加了另一列。
泊松分布
在我看来你的代码很好。
众所周知, PGF在处理非整数值时\foreach
存在精度问题。 我的解决方法是:使用...
\foreach \ll in \myLList {%
\pgfmathsetmacro{\l}{.1*\ll}
然后你可以用
\poissonTable[1]{1,...,40}{12}
有趣的\pgfmathsetmacor{\l}{\ll/10}
是,它不起作用。
在下面给出的示例中,我使用了{.1*1,.1*...,.1*40}
并将其解析为\l
。宏\poissonTable
采用1
、.1*
和40
作为分隔参数,而宏\poissonTableL
需要列表本身。
我添加了一个选项,通过测试是否\l
可以被整除来将每 _5_ 行分隔开.5
。我们可以只使用行计数器来检查可整除性,但这会在第二个示例中为我们提供一个单独的最后一行(就像您的教授的一样)。
对最后一行进行测试可以开箱即用,\poissonTable
但需要一点帮助\poissonTable
。
这个解决方案非常特殊,如果行与该方案差别很大,则可能需要格外小心。
也许你想要一种更明确的给出行的方式,比如我的另一个答案您可以在哪里说{.1,.2,.3,.4,[1].5,.6,.7,.8,.9,[1]1,…}
以便行距为[<x>]
... <x>ex
?
代码(无输出)
\documentclass[landscape]{article}
\usepackage[landscape,margin=.5cm]{geometry}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{pgf,pgffor}
\usepackage{etoolbox}
\usepgflibrary{fpu}
\pgfkeys{/pgf/fpu}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
\pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=4}
\edef\mysecondtest{false}%
\def\mc#1{\multicolumn{1}{c}{#1}}
\newif\ifsomanyzeroesshouldbeprinted
\newcommand*{\poissonTable}[5][0]{% #1 = 0 => results in the form 0.0000 are typeset
% #1 != 0 => results in the form 0.0000 are omitted
% #2 = startN
% #3 = midN
% #4 = endN
% #5 = endK
\edef\startN{#2}\edef\midN{#3}\edef\endN{#4}%
\edef\myLList{\midN\startN,\midN...,\midN\endN}%
\edef\lastN{\midN\endN}%
\poissonTableL[#1]{\myLList}{#5}
}
\newcommand*{\poissonTableL}[3][0]{% #1 = 0 => results in the form 0.0000 are typeset
% #1 != 0 => results in the form 0.0000 are omitted
% #2 = Liste
% #3 = endK
\edef\myLList{#2}
\edef\endK{#3}%
\expandafter\ifnum#1=0\relax%
\somanyzeroesshouldbeprintedtrue%
\else%
\somanyzeroesshouldbeprintedfalse%
\fi%
%%% Building head of table
\def\myLHead{\mc{$\lambda$} }%
\foreach \k in {0,...,\endK} {%
\ifnum\k=0\relax%
\xappto\myLHead{& \noexpand\mc{\llap{$k\to{}$}$\k$}}% or \to replaced by =
\else%
\xappto\myLHead{& \noexpand\mc{\k}}%
\fi
}%
\appto\myLHead{\\}%
%%% Bulding body of table
\def\myLTable{}%
\foreach \ll in \myLList {%
\pgfmathsetmacro{\l}{\ll}%
\xappto\myLTable{ $\l$}%
\foreach \k in {0,...,\endK}{%
\pgfmathsetmacro{\Lresult}{e^(-\l)*((\l)^(\k))/((\k)!)}%
\ifsomanyzeroesshouldbeprinted%
\xappto\myLTable{& \noexpand\pgfmathprintnumber{\Lresult}}%
\else\ifdim\Lresult pt<0.00005pt\relax%
\gappto\myLTable{&}%
\else%
\xappto\myLTable{& \noexpand\pgfmathprintnumber{\Lresult}}%
\fi%
\fi%
}%
\gappto\myLTable{\\}%
\pgfkeys{/pgf/fpu=false}%
\pgfmathsetmacro{\lastRow}{\ll==\lastN?"0":"1"}%
\pgfmathsetmacro{\lastRow}{\mysecondtest?"0":"\lastRow"}%
\pgfmathparse{mod(\l,.5)==0?"[\lastRow ex]":""}%
\xappto\myLTable{\pgfmathresult}%
}%
\edef\mysecondtest{false}%
}
\pagestyle{empty}
\begin{document}
\poissonTable[1]{1}{.1*}{40}{12}
\begin{tabular}{rr*{13}{r}}
\toprule\myLHead\midrule\myLTable\midrule\myLHead\bottomrule
\end{tabular}
\edef\lastN{10}%
\def\mysecondtest{mod(\ll,1)==0}%
\poissonTableL[1]{.1*1,.1*...,.1*20,.1*22,.1*24,.1*...,.1*40,5,6,...,10}{12}
\begin{tabular}{rr*{13}{r}}
\toprule\myLHead\midrule\myLTable\midrule\myLHead\bottomrule
\end{tabular}
\end{document}
答案2
这很简单。如果你熟悉矩阵或者基努里维斯。我准备了一个矩阵第一行的示例。它只是半自动化的——您需要手动修改结果。但我猜最多只需要 2 个小时就能让您满意(当然取决于您的经验)。
这是矩阵代码:
%% Generate first row
% http://f.cl.ly/items/1z2p0g2H410J3K0v1z32/Binomial_y_Poisson.pdf
n = 2;
for k=0:1:2
i=1;
for p=[0.01 0.05 0.15 0.20 0.30 1/3 0.35 0.40 0.45 0.50]
Result(k+1,i) = binopdf(k,n,p)
i=i+1
end
end
%% Save to file
% Problem: Still no \\ at the end of each row
try
delete myResult1File
catch
end
dlmwrite('myResult1File.txt',Result,'delimiter','&','newline','pc','precision','%1.4f')
%% Add \\\r\n to each row
myFileIn = fopen('myResult1File.txt');
myFileOut = fopen('myResult2File.txt','w');
while ~feof(myFileIn)
s = fgetl(myFileIn); % read line by line
fprintf(myFileOut,'& & & %s\\\\\r\n',s); % write line by line and add \\ before newline
end
fclose(myFileIn)
fclose(myFileOut)
结果将被存储在myResult2File.txt
并看起来像这样:
& & & 0.9801&0.9025&0.7225&0.6400&0.4900&0.4444&0.4225&0.3600&0.3025&0.2500\\
& & & 0.0198&0.0950&0.2550&0.3200&0.4200&0.4444&0.4550&0.4800&0.4950&0.5000\\
& & & 0.0001&0.0025&0.0225&0.0400&0.0900&0.1111&0.1225&0.1600&0.2025&0.2500\
顺便说一下,myResult1File.txt
看起来像这样:
0.9801&0.9025&0.7225&0.6400&0.4900&0.4444&0.4225&0.3600&0.3025&0.2500
0.0198&0.0950&0.2550&0.3200&0.4200&0.4444&0.4550&0.4800&0.4950&0.5000
0.0001&0.0025&0.0225&0.0400&0.0900&0.1111&0.1225&0.1600&0.2025&0.2500
该LaTeX
文件可能看起来像这样(booktabs
例如,我建议使用该包):
\documentclass[a4paper]{article}
\usepackage[textwidth=170mm]{geometry}
\begin{document}
\begin{center}
{\large\textbf{\hspace*{1.0cm}Table of the Binominal Distribution}}
\end{center}
Here you go\ldots
\begin{center}
\small
\begin{tabular}{|r|r|*{11}r|} % *{11}r -> rrrrrrrrrrr
\hline
$n \downarrow$ & $k \downarrow$ & $p \to $ & 0.01 & 0.05 & 0.15 & 0.20 & 0.30 & 1/3 & 0.35 & 0.40 & 0.45 & 0.50\\
\hline
2 & 0 & & 0.9801&0.9025&0.7225&0.6400&0.4900&0.4444&0.4225&0.3600&0.3025&0.2500\\
& 1 & & 0.0198&0.0950&0.2550&0.3200&0.4200&0.4444&0.4550&0.4800&0.4950&0.5000\\
& 2 & & 0.0001&0.0025&0.0225&0.0400&0.0900&0.1111&0.1225&0.1600&0.2025&0.2500\\
\hline
\end{tabular}
\end{center}
\end{document}
该PDF
文件将如下所示:
与原文比较:
该死,我现在明白了忘记 p=0.10
但p=0.49
无论如何你明白我的意思了。
评论:你的教授的表格中似乎有一点舍入误差(比较 n=2,k=0,p=0.1)。或者矩阵是错的。
另一点说明:为什么现在还需要这种桌子?!它不是像sin
或log
桌子一样过时了吗:)?