2018年6月17日日曜日

学習環境

数学読本〈6〉線形写像・1次変換/数論へのプレリュード/集合論へのプレリュード/εとδ/落ち穂拾い など(松坂 和夫(著)、岩波書店)の第26章(エピローグ - 落ち穂拾い、など)、26.4(確率分布と平均)、確率変数の平均または期待値、問7.を取り組んでみる。


  1. E X = i = 0 3 3 i 1 2 i 1 2 3 - i · 1000 · i = 1000 i = 0 3 3 i 1 2 i 1 2 3 - i i 1 2 x + 1 2 3 = i = 0 3 3 i 1 2 x i 1 2 3 - i = i = 0 3 3 i 1 2 i 1 2 3 - i x i 3 · 1 2 1 2 x + 1 2 2 = i = 0 3 3 i 1 2 i 1 2 3 - i i x i - 1 E X = 3 2 · 1000 = 1500

コード(Emacs)

Python 3

#!/usr/bin/env python3
from sympy import pprint, symbols, combinatorial, Rational
import random

print('7')


nC = combinatorial.numbers.nC
pprint(sum([n * 1000 * nC(3, n) * Rational(1, 2) ** n * Rational(1, 2) ** (3 - n)
            for n in range(4)]))

n = 10
coin = [0, 1]

for i in range(5):
    n = 10 ** i
    for _ in range(5):
        t = 0
        for _ in range(n):
            c = [random.choice(coin) for _ in range(3)]
            l = len(list(filter(lambda x: x == 0, c)))
            t += {0: 0, 1: 1000, 2: 2000, 3: 3000}[l]
        print(f'試行回数 {n}回、{t / n}')

入出力結果(Terminal, Jupyter(IPython))

$ ./sample9.py
7
1500
試行回数 1回、2000.0
試行回数 1回、0.0
試行回数 1回、1000.0
試行回数 1回、2000.0
試行回数 1回、2000.0
試行回数 10回、1900.0
試行回数 10回、1400.0
試行回数 10回、1300.0
試行回数 10回、1100.0
試行回数 10回、1800.0
試行回数 100回、1560.0
試行回数 100回、1660.0
試行回数 100回、1580.0
試行回数 100回、1610.0
試行回数 100回、1610.0
試行回数 1000回、1487.0
試行回数 1000回、1529.0
試行回数 1000回、1545.0
試行回数 1000回、1511.0
試行回数 1000回、1507.0
試行回数 10000回、1487.1
試行回数 10000回、1508.6
試行回数 10000回、1479.8
試行回数 10000回、1496.1
試行回数 10000回、1512.3
$

HTML5

<div id="graph0"></div>
<pre id="output0"></pre>
<label for="r0">r = </label>
<input id="r0" type="number" min="0" value="1">
<label for="dx">dx = </label>
<input id="dx" type="number" min="0" step="0.001" value="1">
<br>
<label for="x1">x1 = </label>
<input id="x1" type="number" value="1">
<label for="x2">x2 = </label>
<input id="x2" type="number" value="1000">
<br>
<label for="y1">y1 = </label>
<input id="y1" type="number" value="0">
<label for="y2">y2 = </label>
<input id="y2" type="number" value="3000">

<button id="draw0">draw</button>
<button id="clear0">clear</button>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.6/d3.min.js" integrity="sha256-5idA201uSwHAROtCops7codXJ0vja+6wbBrZdQ6ETQc=" crossorigin="anonymous"></script>

<script src="sample9.js"></script>

JavaScript

let div0 = document.querySelector('#graph0'),
    pre0 = document.querySelector('#output0'),
    width = 600,
    height = 600,
    padding = 50,
    btn0 = document.querySelector('#draw0'),
    btn1 = document.querySelector('#clear0'),
    input_r = document.querySelector('#r0'),
    input_dx = document.querySelector('#dx'),
    input_x1 = document.querySelector('#x1'),
    input_x2 = document.querySelector('#x2'),
    input_y1 = document.querySelector('#y1'),
    input_y2 = document.querySelector('#y2'),
    inputs = [input_r, input_dx, input_x1, input_x2, input_y1, input_y2],
    p = (x) => pre0.textContent += x + '\n';

let f = (x) => {
    let t = 0;
    for (let i = 0; i < x; i += 1) {
        let a = [];
        for (let i = 0; i < 3; i += 1) {
            a.push(Math.random() <= 0.5 ? 0 : 1);
        }
        t  += [0, 1000, 2000, 3000][a.filter((n) => n === 0).length];
    }
    return t / x;
};

let draw = () => {
    pre0.textContent = '';

    let r = parseFloat(input_r.value),
        dx = parseFloat(input_dx.value),
        x1 = parseFloat(input_x1.value),
        x2 = parseFloat(input_x2.value),
        y1 = parseFloat(input_y1.value),
        y2 = parseFloat(input_y2.value);

    if (r === 0 || dx === 0 || x1 > x2 || y1 > y2) {
        return;
    }    

    let points = [],
        lines = [[x1, 1500, x2, 1500, 'red']],
        fns = [[f, 'green']];

    fns
        .forEach((o) => {
            let [f, color] = o;
            for (let x = x1; x <= x2; x += dx) {
                let y = f(x);

                points.push([x, y, color]);
            }
        });
    
    let xscale = d3.scaleLinear()
        .domain([x1, x2])
        .range([padding, width - padding]);
    let yscale = d3.scaleLinear()
        .domain([y1, y2])
        .range([height - padding, padding]);

    let xaxis = d3.axisBottom().scale(xscale);
    let yaxis = d3.axisLeft().scale(yscale);
    div0.innerHTML = '';
    let svg = d3.select('#graph0')
        .append('svg')
        .attr('width', width)
        .attr('height', height);

    svg.selectAll('line')
        .data([[x1, 0, x2, 0], [0, y1, 0, y2]].concat(lines))
        .enter()
        .append('line')
        .attr('x1', (d) => xscale(d[0]))
        .attr('y1', (d) => yscale(d[1]))
        .attr('x2', (d) => xscale(d[2]))
        .attr('y2', (d) => yscale(d[3]))
        .attr('stroke', (d) => d[4] || 'black');

    svg.selectAll('circle')
        .data(points)
        .enter()
        .append('circle')
        .attr('cx', (d) => xscale(d[0]))
        .attr('cy', (d) => yscale(d[1]))
        .attr('r', r)
        .attr('fill', (d) => d[2] || 'green');
    
    svg.append('g')
        .attr('transform', `translate(0, ${height - padding})`)
        .call(xaxis);

    svg.append('g')
        .attr('transform', `translate(${padding}, 0)`)
        .call(yaxis);

    [fns].forEach((fs) => p(fs.join('\n')));
};

inputs.forEach((input) => input.onchange = draw);
btn0.onclick = draw;
btn1.onclick = () => pre0.textContent = '';
draw();







0 コメント:

コメントを投稿