2017年8月22日火曜日

学習環境

数学読本〈5〉微分法の応用/積分法/積分法の応用/行列と行列式(松坂 和夫(著)、岩波書店)の第19章(細分による加法 - 積分法)、19.2(不定積分の計算)、分数関数の積分、問18.を取り組んでみる。


    1. ( 2x+2+ 2 x1 )dx = x 2 +2x+2log| x1 |

    2. ( x+2 )( x 2 2x+3 )4 x+2 dx = ( x 2 2x+3 4 x+2 )dx = 1 3 x 3 x 2 +3x4log| x+2 |

    3. a x1 + b x2 = ( a+b )x2ab ( x1 )( x2 ) a+b=1 2ab=3 b=1a 2aa+a=3 a= 3 2 b= 1 2 ( 3 2( x1 ) 1 2( x2 ) )dx = 3 2 log| x1 | 1 2 log| x2 |

    4. 1 x 2 + ( 2 ) 2 dx = 1 2 arctan( x 2 ) = 1 2 arctan x 2

    5. ( x 2 +x2 )( x+2 )+4 x 2 +x2 dx = ( x+2+ 4 x 2 +x2 )dx = 1 2 x 2 +2x+ 4 ( x+2 )( x1 ) dx a x+2 + b x1 = ( a+b )x+( a+2b ) ( x+2 )( x1 ) a+b=0 a+2b=4 b=a a2a=4 a= 4 3 b= 4 3 1 2 x 2 +2x+ 4 ( x+2 )( x1 ) dx = 1 2 x 2 +2x+ ( 4 3 1 x+2 + 4 3 1 x1 )dx = 1 2 x 2 +2x 4 3 log| x+2 |+ 4 3 log| x1 |

    6. a x + b x1 + c ( x1 ) 2 = a x 2 2ax+a+b x 2 bx+cx x ( x1 ) 2 = ( a+b ) x 2 +( 2ab+c )x+a x ( x1 ) 2 a+b=0 ab+c=2 a=1 b=1 1+1+c=2 c=2 ( 1 x 1 x1 + 2 ( x1 ) 2 )dx =log| x |log| x1 | 2 x1

    7. 1 ( x+ 1 2 ) 2 + ( 3 2 ) 2 dx t=x+ 1 2 dt dx =1 1 ( x+ 1 2 ) 2 + ( 3 2 ) 2 dx = 1 t 2 + ( 3 2 ) 2 dt = 2 3 arctan 3 2 t = 2 3 arctan( 3 2 ( x+ 1 2 ) )

    8. x ( x+ 1 2 ) 2 + ( 3 2 ) 2 dx t=x+ 1 2 dt dx =1 x=t 1 2 x ( x+ 1 2 ) 2 + ( 3 2 ) 2 dx = t 1 2 t 2 + ( 3 2 ) 2 dt = ( t t 2 + ( 3 2 ) 2 1 2 · 1 t 2 + ( 3 2 ) 2 )dt = 1 2 log( t 2 + ( 3 2 ) 2 ) 1 2 · 2 3 arctan 2 3 t = 1 2 log( x 2 +x+1 ) 1 3 arctan( 2 3 ( x+ 1 2 ) )

    9. a x+1 + b ( x+1 ) 2 + c ( x+1 ) 3 = a x 2 +2ax+a+bx+b+c ( x+1 ) 3 = a x 2 +( 2a+b )x+a+b+c ( x+1 ) 3 a=0 2a+b=1 a+b+c=0 b=1 c=1 ( 1 ( x+1 ) 2 1 ( x+1 ) 3 )dx = 1 x+1 1 2 ( x+1 ) 2

    10. a x + bx+c x 2 +1 + dx+e ( x 2 +1 ) 2 = a x 4 +2a x 2 +a+b x 4 +b x 2 +c x 3 +cx+d x 2 +ex x( x 2 +1 ) = ( a+b ) x 4 +c x 3 +( 2a+b+d ) x 2 +( c+e )x+a x( x 2 +1 ) a+b=0 c=0 2a+b+d=0 c+e=0 a=1 b=1 21+d=0 d=1 e=0 ( 1 x + x x 2 +1 + x ( x 2 +1 ) 2 )dx =log| x | 1 2 log( x 2 +1 )+ 1 2 · 1 x 2 +1

コード(Emacs)

Python 3

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

from sympy import pprint, symbols, Integral, sin, cos, plot

print('18.')
x = symbols('x')
fs = [2 * x ** 2 / (x - 1),
      (x ** 3 - x + 2) / (x + 2),
      (x - 3) / ((x - 1) * (x - 2)),
      1 / (x ** 2 - 4),
      x ** 3 / (x ** 2 + x - 2),
      (2 * x + 1) / (x * (x - 1) ** 2),
      1 / (x ** 2 + x + 1),
      x / (x ** 2 + x + 1),
      x / (x + 1) ** 3,
      1 / (x * (x ** 2 + 1) ** 2)]

for i, f in enumerate(fs, 1):
    print(f'({i})')
    I = Integral(f, x)
    pprint(I)
    I = I.doit()
    pprint(I)
    for j, g in enumerate([f, I]):
        p = plot(g, show=False, legend=True)
        p.save(f'sample18_{i}_{j}.svg')
    print()

入出力結果(Terminal, IPython)

$ ./sample18.py
18.
(1)
⌠         
⎮     2   
⎮  2⋅x    
⎮ ───── dx
⎮ x - 1   
⌡         
 2                     
x  + 2⋅x + 2⋅log(x - 1)

(2)
⌠              
⎮  3           
⎮ x  - x + 2   
⎮ ────────── dx
⎮   x + 2      
⌡              
 3                          
x     2                     
── - x  + 3⋅x - 4⋅log(x + 2)
3                           

(3)
⌠                   
⎮      x - 3        
⎮ ─────────────── dx
⎮ (x - 2)⋅(x - 1)   
⌡                   
-log(x - 2) + 2⋅log(x - 1)

(4)
⌠          
⎮   1      
⎮ ────── dx
⎮  2       
⎮ x  - 4   
⌡          
log(x - 2)   log(x + 2)
────────── - ──────────
    4            4     

(5)
⌠              
⎮      3       
⎮     x        
⎮ ────────── dx
⎮  2           
⎮ x  + x - 2   
⌡              
 2                                
x        log(x - 1)   8⋅log(x + 2)
── - x + ────────── + ────────────
2            3             3      

(6)
⌠              
⎮  2⋅x + 1     
⎮ ────────── dx
⎮          2   
⎮ x⋅(x - 1)    
⌡              
                        3  
log(x) - log(x - 1) - ─────
                      x - 1

(7)
⌠              
⎮     1        
⎮ ────────── dx
⎮  2           
⎮ x  + x + 1   
⌡              
         ⎛2⋅√3⋅x   √3⎞
2⋅√3⋅atan⎜────── + ──⎟
         ⎝  3      3 ⎠
──────────────────────
          3           

(8)
⌠              
⎮     x        
⎮ ────────── dx
⎮  2           
⎮ x  + x + 1   
⌡              
                         ⎛2⋅√3⋅x   √3⎞
   ⎛ 2        ⎞   √3⋅atan⎜────── + ──⎟
log⎝x  + x + 1⎠          ⎝  3      3 ⎠
─────────────── - ────────────────────
       2                   3          

(9)
⌠            
⎮    x       
⎮ ──────── dx
⎮        3   
⎮ (x + 1)    
⌡            
 -(2⋅x + 1)   
──────────────
   2          
2⋅x  + 4⋅x + 2

(10)
⌠               
⎮      1        
⎮ ─────────── dx
⎮           2   
⎮   ⎛ 2    ⎞    
⎮ x⋅⎝x  + 1⎠    
⌡               
            ⎛ 2    ⎞           
         log⎝x  + 1⎠      1    
log(x) - ─────────── + ────────
              2           2    
                       2⋅x  + 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="-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">

<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="sample18.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',
    range = (start, end, step=1) => {
        let res = [];
        for (let i = start; i < end; i += step) {
            res.push(i);
        }
        return res;
    };

let f1 = (x) => 2 * x ** 2 / (x - 1),
    f2 = (x) => (x ** 3 - x + 2) / (x + 2),
    f3 = (x) => (x - 3) / ((x - 1) * (x - 2)),
    f4 = (x) => 1 / (x ** 2 - 4),
    f5 = (x) => x ** 3 / (x ** 2 + x - 1);    

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 = [],
        fns = [[f1, 'red'],
               [f2 , 'green'],
               [f3,'blue'],
               [f4, 'orange'],
               [f5, 'brown']],
        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 コメント:

コメントを投稿