2017年7月25日火曜日

学習環境

数学読本〈5〉微分法の応用/積分法/積分法の応用/行列と行列式(松坂 和夫(著)、岩波書店)の第18章(曲線の性質、最大・最小 - 微分法の応用)、18.5(関数の近似、テイラーの定理)、関数の整級数展開(2)、問59.を取り組んでみる。


  1. 問題の仮定より以下のようになる。

    0<θ<1 f n+1 ( θx ) n! x n M n! x n

    補助定理より次のことが成り立つ。

    lim n M n! x n =0

    よって、剰余項は0に収束するので、 f( x )= n=1 f ( n ) ( 0 ) n! x n と整級数展開される。

コード(Emacs)

Python 3

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from sympy import pprint, symbols, Derivative, summation, exp, factorial, E, sin, cos

print('59.')
n = symbols('n')
x = 2
fs = [(E, 1 / factorial(n)),
      (sin(x), (-1) ** (n - 1) * x * (2 * n - 1) / factorial(2 * n - 1)),
      (cos(x), (-1) ** n * x ** (2 * n) / factorial(2 * n))]

for c, f in fs:
    pprint(c)
    pprint(f)
    for n0 in range(10):
        print(f'n = {n0}')
        s = summation(f, (n, 0, n0))
        pprint(s)
        print(f'差: {float(c - s)}')
    print()

入出力結果(Terminal, IPython)

$ ./sample59.py
59.
ℯ
1 
──
n!
n = 0
1
差: 1.7182818284590453
n = 1
2
差: 0.7182818284590452
n = 2
5/2
差: 0.21828182845904523
n = 3
8/3
差: 0.05161516179237857
n = 4
65
──
24
差: 0.009948495125711903
n = 5
163
───
 60
差: 0.0016151617923785687
n = 6
1957
────
720 
差: 0.0002262729034896798
n = 7
685
───
252
差: 2.7860205076981392e-05
n = 8
109601
──────
40320 
差: 3.0586177753940906e-06
n = 9
98641
─────
36288
差: 3.028858529955014e-07

sin(2)
      n - 1          
2⋅(-1)     ⋅(2⋅n - 1)
─────────────────────
      (2⋅n - 1)!     
n = 0
0
差: 0.9092974268256817
n = 1
2
差: -1.0907025731743183
n = 2
1
差: -0.0907025731743183
n = 3
13
──
12
差: -0.17403590650765163
n = 4
389
───
360
差: -0.17125812872987387
n = 5
4357
────
4032
差: -0.17130773190447704
n = 6
1960649
───────
1814400
差: -0.17130718075809256
n = 7
258805669
─────────
239500800
差: -0.17130718493344396
n = 8
47102631757
───────────
43589145600
差: -0.17130718491050245
n = 9
11304631621681
──────────────
10461394944000
差: -0.17130718491059804

cos(2)
    n  2⋅n
(-1) ⋅2   
──────────
  (2⋅n)!  
n = 0
1
差: -1.4161468365471424
n = 1
-1
差: 0.5838531634528576
n = 2
-1/3
差: -0.08281350321380905
n = 3
-19 
────
 45 
差: 0.006075385675079835
n = 4
-131 
─────
 315 
差: -0.000273820674126514
n = 5
-5899 
──────
14175 
差: 8.366274727101539e-06
n = 6
-27809 
───────
 66825 
差: -1.8484493512923474e-07
n = 7
-17714341 
──────────
 42567525 
差: 3.0917607439690546e-09
n = 8
-265715113 
───────────
 638512875 
差: -4.051752058434203e-11
n = 9
-3695855663 
────────────
 8881133625 
差: 4.272933313886496e-13

$

HTML5

<div id="graph0"></div>
<pre id="output0"></pre>
<label for="r0">r = </label>
<input id="r0" type="number" min="0" value="0.5">
<label for="dx">dx = </label>
<input id="dx" type="number" min="0" step="0.0001" value="0.01">
<br>
<label for="x1">x1 = </label>
<input id="x1" type="number" value="-10">
<label for="x2">x2 = </label>
<input id="x2" type="number" value="10">
<br>
<label for="y1">y1 = </label>
<input id="y1" type="number" value="-10">
<label for="y2">y2 = </label>
<input id="y2" type="number" value="10">
<br>
<label for="n0">n = </label>
<input id="n0" type="number" min="0" value="1">

<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="sample59.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'),
    input_n0 = document.querySelector('#n0'),
    inputs = [input_r, input_dx, input_x1, input_x2, input_y1, input_y2,
             input_n0],
    p = (x) => pre0.textContent += x + '\n',
    range = (start, end, step=1) => {
        let res = [];
        for (let i = start; i < end; i += step) {
            res.push(i);
        }
        return res;
    };

let factorial = (n) => range(1, n + 1).reduce((x, y) => x * y, 1);
    
let term1 = (n) => (x) => x ** n / factorial(n),
    term2 = (n) => (x) => (-1) ** (n - 1) * x ** (2 * n - 1) / factorial(2 * n - 1),
    term3 = (n) => (x) => (-1) ** n * x ** (2 * n) / factorial(2 * n);

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),
        n0 = parseFloat(input_n0.value);

    if (r === 0 || dx === 0 || x1 > x2 || y1 > y2) {
        return;
    }
    
    let points = [],
        lines = [],
        f1 = (x) => range(0, n0 + 1).reduce((prev, i) => prev + term1(i)(x), 0),
        f2 = (x) => range(1, n0 + 1).reduce((prev, i) => prev + term2(i)(x), 0),
        f3 = (x) => range(0, n0 + 1).reduce((prev, i) => prev + term3(i)(x), 0),
        fns = [[Math.exp, 'red'],
               [Math.sin, 'green'],
               [Math.cos, 'blue'],
               [f1, 'orange'],
               [f2, 'brown'],
               [f3, 'purple']],
        fns1 = [],
        fns2 = [];

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

            if (Math.abs(y) < Infinity) {
                points.push([x, y, color]);
            }
        }
    });
    fns1.forEach((o) => {
        let [fn, color] = o;
        
        lines.push([x1, fn(x1), x2, fn(x2), color]);
    });
    fns2.forEach((o) => {
        let [fn, color] = o;

        for (let x = x1; x <= x2; x += dx0) {
            let g = fn(x);
            
            lines.push([x1, g(x1), x2, g(x2), 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, fns1, fns2].forEach((fs) => p(fs.join('\n')));
};

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








0 コメント:

コメントを投稿