二項分布

二項分布のグラフです。

現行の教育課程では、高校の数学Bの教科書に載っています。

教科書の図を眺めるだけでなく、確率、試行回数をいろいろ変えてみると面白いです。

そのシミュレータをCinderellaで作り、それにKETCindyを組み込んで、適当な図を描き出します。

まずは、シミュレータを作ります。

Initializationスロットに、二項分布のグラフを描くための関数を定義します。

================================================

// nの階乗

fac(n):=if(n==0,1,product(1..n));

// nCr

Comb(n,r):=(fac(n)/fac(r)/fac(n-r));

// 二項分布のグラフを描く

Binomial(n,p):=(

// 確率pの試行をn回行うときの確率×30 のリスト

Bp=apply(0..n,[#,30*Comb(n,#)*p^#*(1-p)^(n-#)]);

// プロット限界

llim=min([n,24]);

// 確率折れ線

repeat(llim,s,

draw(Bp_s);

draw(Bp_s,Bp_(s+1),color->[0,0,0]);

);

draw(Bp_(llim+1));

// nの値表示 確率が最大となる点を調べる

y0=Bp_1_2;

pos=Bp_1;

repeat(llim,s,

if(y0<Bp_s_2,y0=Bp_s_2;pos=Bp_s);

);

drawtext(pos+[-0.1,0.2],"n="+text(n))

);

// 軸などを描く

drawaxis(lineflag):=(

draw([0,0],[23,0]);

draw([0,0],[0,16]);

// 目盛

repeat(5, draw([-0.1,3*#],[0.1,3*#]));

if(lineflag==1,

repeat(5, draw([0,3*#],[23,3*#],dashtype->3));

);

apply(1..5,drawtext([-1.1,#*3-0.2],0.1*#)); // 縦の目盛

apply(1..23,drawtext([#-0.2,-1],#)); // 横の目盛

);

==============================================

Drawスロットには次のように書きます。

==============================================

// 軸の描画 引数 1: 横線を点線で引く 0 引かない

drawaxis(1);

drawtext([5,14],"二項分布 B(n,p) のグラフ p=$\frac{1}{6}$",size->24);

// グラフを描く いくつでも可 引数はnの値と確率

Binomial(10,1/6);

Binomial(20,1/6);

Binomial(40,1/6);

==============================================

実行結果の画面です。

さらにn=50 の場合を表示しました。

教材としてみせるにはこれでよいでしょう。

これをKETCindyで書き出し、TeXの図版にするには、KETCindyの書き出し関数を追加するのですが、

細かい手直しは面倒なので、さきほどのものをコピーして書き直す方がよいでしょう。

次のスクリプトをInitialzationスロットに追加します。

==============================================

KETBinomial(n,p):=(

Bp=apply(0..n,[#,30*Comb(n,#)*p^#*(1-p)^(n-#)]);

llim=min([n,24]);

ls="";

repeat(llim,ls=ls+text(Bp_#)+",");

ls=ls+text(Bp_(llim+1));

Drawpoint(ls);

ls=apply(1..llim+1,Bp_#);

Listplot("L"+text(n),ls);

y0=Bp_1_2;

pos=Bp_1;

repeat(llim,s,

if(y0<Bp_s_2,y0=Bp_s_2;pos=Bp_s);

);

Letter([pos,"n2","n="+text(n)]);

);

KETdrawaxis(lineflag):=(

Listplot("1",[[0,0],[23,0]]);

Listplot("2",[[0,0],[0,16]]);

repeat(5, Listplot(text(#+2),[[-0.1,3*#],[0.1,3*#]]));

if(lineflag==1,

repeat(5, Listplot(text(#+7),[[0,3*#],[23,3*#]],["do"]));

);

ls=apply(1..5,[[-0.6,#*3],"w",text(0.1*#)]);

Letter(flatten(ls));

ls=apply(1..23,[[#,-0.5],"s",text(#)]);

Letter(flatten(ls));

);

================================================

Draw スロットには、さきほどの行に次の行を追加します。

===========================================

if(1==1,

Fhead="fig";

Ketinit();

Setunitlen("5mm");

Addax(0);

Ptsize(4);

KETdrawaxis(1);

Letter([[6,14],"e","二項分布 B(n,p) のグラフ p=$\frac{1}{6}$"]);

KETBinomial(10,1/6);

KETBinomial(20,1/6);

KETBinomial(40,1/6);

);

===============================================

実行すると、sceファイルに書き出されますが、文字部分がダブって表示されます。

1行目の

if(1==1,

if(1==0,

にすると、このブロックは実行されないので、画面上はすっきりします。

これを使い分けるわけです。

確率pを変えると、分布の変化の様子がわかります。

確率が1/2 のときは左右対称なグラフができることもわかります。

< 戻る >