2017年7月4日火曜日

学習環境

数学読本〈5〉微分法の応用/積分法/積分法の応用/行列と行列式(松坂 和夫(著)、岩波書店)の第18章(曲線の性質、最大・最小 - 微分法の応用)、18.3(曲線の凹凸、曲線をえがくこと)、グラフをえがくこと、問36.を取り組んでみる。


    1. f( x )= x 3 ( 3x+4 ) f'( x )=12 x 3 +12 x 2 =12 x 2 ( x+1 ) f''( x )=36 x 2 +24x=12x( 3x+2 )

    2. f'( x )=1+ 4 x 2 f''( x )= 8x x 4 = 8 x 3

    3. f'( x )= e x 2 ( 2x )=2x e x 2 f''( x )=2 e x 2 2x e x 2 ( 2x ) =2 e x 2 +4 x 2 e x 2 =2 e x 2 ( 12 x 2 )

    4. f'( x )= e x x e x = e x ( 1x ) f''( x )= e x ( 1 )( e x +x e x ( 1 ) ) = e x e x +x e x = e x ( x2 )

    5. f( x )=1 1 x 2 +1 f'( x )= 2x ( x 2 +1 ) 2 = 2x ( x 2 +1 ) 2 f''( x )= 2 ( x 2 +1 ) 2 2x2( x 2 +1 )2x ( x 2 +1 ) 2 = 2( x 2 +1 )( x 2 +14 x 2 ) ( x 2 +1 ) 2 = 2( 3 x 2 +1 ) ( x 2 +1 ) 2

    6. f'( x )= 1 x xlogx x 2 = 1logx x 2 f''( x )= 1 x x 2 ( 1logx )2x x 4 = x2x+2xlogx x 4 = 3+2logx x 3

コード(Emacs)

Python 3

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

from sympy import pprint, symbols, exp, log, Derivative, solve

print('36.')
x = symbols('x')

fs = [3 * x ** 4 + 4 * x ** 3,
      -x - 4 / x,
      exp(-x ** 2),
      x * exp(-x),
      x ** 2 / (x ** 2 + 1),
      log(x) / x]

for i, f in enumerate(fs, 1):
    print('({0})'.format(i))
    pprint(f)
    pprint(solve(f, x))
    print()
    for n in range(1, 3):
        d = Derivative(f, x, n)
        fn = d.doit()
        pprint(d)
        pprint(fn)
        pprint(solve(fn, x))
        print()
    print()

入出力結果(Terminal, IPython)

=$ ./sample36.py
36.
(1)
   4      3
3⋅x  + 4⋅x 
[-4/3, 0]

d ⎛   4      3⎞
──⎝3⋅x  + 4⋅x ⎠
dx             
    3       2
12⋅x  + 12⋅x 
[-1, 0]

  2             
 d ⎛   4      3⎞
───⎝3⋅x  + 4⋅x ⎠
  2             
dx              
12⋅x⋅(3⋅x + 2)
[-2/3, 0]


(2)
     4
-x - ─
     x
[-2⋅ⅈ, 2⋅ⅈ]

d ⎛     4⎞
──⎜-x - ─⎟
dx⎝     x⎠
     4 
-1 + ──
      2
     x 
[-2, 2]

  2        
 d ⎛     4⎞
───⎜-x - ─⎟
  2⎝     x⎠
dx         
-8 
───
  3
 x 
[]


(3)
   2
 -x 
ℯ   
[]

  ⎛   2⎞
d ⎜ -x ⎟
──⎝ℯ   ⎠
dx      
        2
      -x 
-2⋅x⋅ℯ   
[0]

  2⎛   2⎞
 d ⎜ -x ⎟
───⎝ℯ   ⎠
  2      
dx       
                2
  ⎛   2    ⎞  -x 
2⋅⎝2⋅x  - 1⎠⋅ℯ   
⎡-√2   √2⎤
⎢────, ──⎥
⎣ 2    2 ⎦


(4)
   -x
x⋅ℯ  
[0]

d ⎛   -x⎞
──⎝x⋅ℯ  ⎠
dx       
     -x    -x
- x⋅ℯ   + ℯ  
[1]

  2       
 d ⎛   -x⎞
───⎝x⋅ℯ  ⎠
  2       
dx        
         -x
(x - 2)⋅ℯ  
[2]


(5)
   2  
  x   
──────
 2    
x  + 1
[0]

  ⎛   2  ⎞
d ⎜  x   ⎟
──⎜──────⎟
dx⎜ 2    ⎟
  ⎝x  + 1⎠
        3           
     2⋅x       2⋅x  
- ───────── + ──────
          2    2    
  ⎛ 2    ⎞    x  + 1
  ⎝x  + 1⎠          
[0]

  2⎛   2  ⎞
 d ⎜  x   ⎟
───⎜──────⎟
  2⎜ 2    ⎟
dx ⎝x  + 1⎠
  ⎛      4         2     ⎞
  ⎜   4⋅x       5⋅x      ⎟
2⋅⎜───────── - ────── + 1⎟
  ⎜        2    2        ⎟
  ⎜⎛ 2    ⎞    x  + 1    ⎟
  ⎝⎝x  + 1⎠              ⎠
──────────────────────────
           2              
          x  + 1          
⎡-√3   √3⎤
⎢────, ──⎥
⎣ 3    3 ⎦


(6)
log(x)
──────
  x   
[1]

d ⎛log(x)⎞
──⎜──────⎟
dx⎝  x   ⎠
  log(x)   1 
- ────── + ──
     2      2
    x      x 
[ℯ]

  2        
 d ⎛log(x)⎞
───⎜──────⎟
  2⎝  x   ⎠
dx         
2⋅log(x) - 3
────────────
      3     
     x      
⎡ 3/2⎤
⎣ℯ   ⎦


$

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.001">
<br>
<label for="x1">x1 = </label>
<input id="x1" type="number" value="0">
<label for="x2">x2 = </label>
<input id="x2" type="number" value="15">
<br>
<label for="y1">y1 = </label>
<input id="y1" type="number" value="-0.05">
<label for="y2">y2 = </label>
<input id="y2" type="number" value="0.4">
<br>
<label for="dx0">dx0 = </label>
<input id="dx0" type="number" min="0" value="0.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="sample36.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_dx0 = document.querySelector('#dx0'),
    inputs = [input_r, input_dx, input_x1, input_x2, input_y1, input_y2,
              input_dx0],
    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 f = (x) => Math.log(x) / x,
    f1 = (x) => (1 - Math.log(x)) / x ** 2,
    f2 = (x) => (-3 + 2 * Math.log(x)) / x ** 3,
    g = (x0) => (x) => f1(x0) * (x - x0) + f(x0),
    h = (x0) => (x) => f2(x0) * (x - x0) + f1(x0);

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),
        dx0 = parseFloat(input_dx0.value);
    
    if (r === 0 || dx === 0 || x1 > x2 || y1 > y2) {
        return;
    }

    let points = [],        
        lines = [],
        fns = [[f, 'red'], [f1, 'blue']],
        fns1 = [],
        fns2 = [[g, 'green'], [h, 'orange']];

    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 コメント:

コメントを投稿