高校数学10分プログラミング(数学B編 4.確率分布と統計的な推測)9日目「連続型確率変数を考える」
マガジンリスト > 数学B編 4.確率分布と統計的な推測 > 9日目 課題
おはようございます。
本日は、高校数学10分プログラミング(数学B編 4.確率分布と統計的な推測)の9日目です。
本日の課題は、連続型確率変数による確率、期待値、分散及び標準偏差を計算するプログラムを作成することです。
連続型確率変数の分布
まず、連続型確率変数とその分布について解説しておきます。
連続型確率変数とその分布
$${X}$$を連続型確率変数、曲線$${y=f(x)}$$を$${X}$$の分布曲線とするとき、確率密度関数$${f(x)}$$には、次の性質がある。
$$
\mathrm{常に} f(x) \geq 0
$$
$$
P(a \leq X \leq b)= \int_a^b f(x) dx
$$
$$
\alpha \leq X \leq \beta \mathrm{のとき} \int_{\alpha}^{\beta} f(x) dx = 1
$$
期待値
$$
E(X) = m = \int_{\alpha}^{\beta} xf(x)dx
$$
分散
$$
V(X) = \int_{\alpha}^{\beta}(x-m)^2 f(x) dx
$$
課題
確率変数$${X}$$の確率密度関数$${f(x)}$$が、
$$
f(x) = \frac{1}{2} (0 \leq x \leq 2)
$$
で表されるとき、確率$${P(0 \leq X \leq 1)}$$、期待値、分散、標準偏差を計算するプログラムを作成してください。
ヒント
確率密度関数による確率の計算
確率密度関数による確率$${P(a \leq X \leq b)}$$は、
$$
P(a \leq X \leq b)= \int_a^b f(x) dx
$$
のように定積分で表されます。この定積分をコンピュータで数値的に計算していくために、定積分の計算方法のひとつである 台形公式 を利用します。
台形公式は、図2のように関数$${f(x)}$$の$${a}$$から$${b}$$までの積分領域を$${n}$$個の部分に分割し、分割した各部分の面積を台形の面積で近似して足し合わせることで定積分の値を計算する方法です。
具体的には、まず$${\Delta x}$$を積分範囲の大きさ$${b-a}$$と比較して十分小さな値をもつ定数で、かつ
$$
n= \frac{b-a}{\Delta x}
$$
が整数となるように、調整して決めます。このようにして決めた$${\Delta x}$$を用いると、$${x_i}$$は、
$$
x_i = a +i\Delta x \ \ (i=0,1,2,\cdots,n)
$$
となります。なお、$${x_0 = a, \ \ x_n = b}$$となります。このとき、図2の分割した各部分を台形で近似したときの面積は
$$
\frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \ \ (i=0,1,2,\cdots,n-1)
$$
と計算することができます。したがって、確率$${P(a \leq X \leq b)}$$は、
$$
P(a \leq X \leq b)= \int_a^b f(x) dx = \sum_{i=0}^{n-1} \left[ \frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \right]
$$
で計算することができます。
確率密度関数による期待値の計算
次に、確率密度関数による期待値
$$
E(X) = m = \int_{\alpha}^{\beta} xf(x)dx
$$
の計算を考えます。こちらも 台形公式 を用いてコンピュータで数値的に計算することができます。つまり、$${x_0=\alpha, x_n = \beta}$$となるように$${\Delta x}$$と整数$${n}$$を決めると、
$$
E(X) = m = \sum_{i=0}^{n-1} \left( x_i + \frac{\Delta x}{2} \right) \left[ \frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \right]
$$
で計算することができます。なお、今回被積分関数$${xf(x)}$$の$${x}$$については、分割した各積分範囲$${[x_i, x_{i+1}]}$$の中点
$$
\frac{x_i+x_{i+1}}{2} = x_i + \frac{\Delta x}{2}
$$
で近似するようにしています。
確率密度関数による分散の計算
最後に、確率密度関数による分散
$$
V(X) = \int_{\alpha}^{\beta}(x-m)^2 f(x) dx
$$
の計算を考えます。これは、上記の確率や期待値の計算と同じように 台形公式 を用いてコンピュータで数値的に計算することができます。
$$
V(X) = \sum_{i=0}^{n-1} \left( x_i + \frac{\Delta x}{2} - m \right)^2 \left[ \frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \right]
$$
以上のことを踏まえて、以下で具体的にいくつかの簡単な確率密度関数による確率や期待値、分散などを計算するプログラムを作成していきます。
プログラム
ヒントを踏まえて、課題の確率密度関数による確率や期待値、分散などを計算するプログラムは、以下のように記述することができます。
// 定数の確率密度関数による確率の計算
void setup(){
// P(0≦X≦1)の値を計算する
float a = 0.0;
float b = 1.0;
float prob = probability_of_constant_PDF(a,b);
println("確率P(0≦X≦1):", prob);
// 期待値の計算
float m = expectation_value_of_constant_PDF();
println("期待値:",m);
// 分散の計算
float v = variance_of_constant_PDF(m);
println("分散:", v);
// 標準偏差の計算
float sd = sqrt(v);
println("標準偏差:",sd);
}
// 定数の確率密度関数
float constant_PDF(
float x
){
float value;
if(x >= 0.0 && x <= 2.0){
value = 1.0/2.0;
} else {
value = 0.0;
}
return value;
}
// 定数の確率密度関数による確率P(a≦X≦b)を計算する関数(台形公式を利用)
float probability_of_constant_PDF(
float a, // 積分領域の下限
float b // 積分領域の上限
){
float dx = 0.01;
int division_num = (int)((b-a)/dx);
float x, y1, y2;
float prob = 0.0;
for(int i=0; i<division_num; i++){
x = a + i*dx;
y1 = constant_PDF(x);
y2 = constant_PDF(x+dx);
prob = prob + (y1+y2)*dx/2.0;
}
return prob;
}
// 定数の確率密度関数による期待値を計算する関数(台形公式を利用)
float expectation_value_of_constant_PDF(){
float dx = 0.01;
float a = 0.0;
float b = 2.0;
int division_num = (int)((b-a)/dx);
float x, y1, y2;
float m = 0.0;
for(int i=0; i<division_num; i++){
x = a + i*dx;
y1 = constant_PDF(x);
y2 = constant_PDF(x+dx);
m =
}
return m;
}
// 定数の確率密度関数による分散を計算する関数(台形公式を利用)
float variance_of_constant_PDF(
float m // 期待値
){
float dx = 0.01;
float a = 0.0;
float b = 2.0;
int division_num = (int)((b-a)/dx);
float x, y1, y2;
float v = 0.0;
for(int i=0; i<division_num; i++){
x = a + i*dx;
y1 = constant_PDF(x);
y2 = constant_PDF(x+dx);
v =
}
return v;
}
ソースコード1 確率密度関数による確率$${P(0 \leq X \leq 1)}$$、期待値、分散、標準偏差を計算するプログラム(未完成)
ソースコード1では、課題の定数の確率密度関数を constant_PDF 関数とし、台形公式を利用して、確率$${P(a \leq X \leq b)}$$を計算する関数 probability_of_constant_PDF 、期待値を計算する関数 expectation_value_of_constant_PDF 、及び分散を計算する関数 variance_of_constant_PDF をそれぞれを準備しています。そして、これらの関数を setup 関数内で呼び出して、定数の確率密度関数による確率$${P(0 \leq X \leq 1)}$$の値 prob 、期待値 m 、分散 v 、標準偏差 sd を計算しています。
ただし、期待値を計算する関数 expectation_value_of_constant_PDF 、及び分散を計算する関数 variance_of_constant_PDF
// 定数の確率密度関数による期待値を計算する関数(台形公式を利用)
float expectation_value_of_constant_PDF(){
float dx = 0.01;
float a = 0.0;
float b = 2.0;
int division_num = (int)((b-a)/dx);
float x, y1, y2;
float m = 0.0;
for(int i=0; i<division_num; i++){
x = a + i*dx;
y1 = constant_PDF(x);
y2 = constant_PDF(x+dx);
m =
}
return m;
}
// 定数の確率密度関数による分散を計算する関数(台形公式を利用)
float variance_of_constant_PDF(
float m // 期待値
){
float dx = 0.01;
float a = 0.0;
float b = 2.0;
int division_num = (int)((b-a)/dx);
float x, y1, y2;
float v = 0.0;
for(int i=0; i<division_num; i++){
x = a + i*dx;
y1 = constant_PDF(x);
y2 = constant_PDF(x+dx);
v =
}
return v;
}
は未完成です。
これらの計算の部分を追記してソースコード1を完成させてください。
なお、スケッチ名は「probability_PDF」としてください。
それでは、よろしくお願いします。
MK's papa