二項分布
二項分布のグラフです。
現行の教育課程では、高校の数学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 のときは左右対称なグラフができることもわかります。
< 戻る >