2017年1月17日火曜日

開発環境

Pythonからはじめる数学入門 (Amit Saha (著)、黒川 利明 (翻訳)、オライリージャパン)の4章(SymPyで代数と式を計算する)を参考に。

以下なら3以外の数値も楽に。(コンピューターに計算してもらうから当然だけど。)

コード(Emacs)

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


def f(x):
    return - 2 * x ** 4 + 4 * x ** 3 + 7 * x ** 2 - 5 * x + 8

for x in range(10):
    print('{0}({1}) = {2}'.format(f.__name__, x, f(x)))

# 複素数でも
for x in range(1, 6):
    for y in range(1, 6):
        z = f(complex(x, y))
        print('{0}({1}{2:+}i) = {2}{3:+}i'.format(f.__name__, x, y, z.real, z.imag))

入出力結果(Terminal, IPython)

$ ./sample1.py 
f(0) = 8
f(1) = 12
f(2) = 26
f(3) = 2
f(4) = -156
f(5) = -592
f(6) = -1498
f(7) = -3114
f(8) = -5728
f(9) = -9676
f(1+1i) = 1+3.0i
f(1+2i) = 2-48.0i
f(1+3i) = 3-213.0i
f(1+4i) = 4-612.0i
f(1+5i) = 5-1413.0i
f(2+1i) = 1+41.0i
f(2+2i) = 2+62.0i
f(2+3i) = 3+17.0i
f(2+4i) = 4-214.0i
f(2+5i) = 5-799.0i
f(3+1i) = 1+65.0i
f(3+2i) = 2+230.0i
f(3+3i) = 3+425.0i
f(3+4i) = 4+530.0i
f(3+5i) = 5+377.0i
f(4+1i) = 1-21.0i
f(4+2i) = 2+360.0i
f(4+3i) = 3+915.0i
f(4+4i) = 4+1524.0i
f(4+5i) = 5+2019.0i
f(5+1i) = 1-361.0i
f(5+2i) = 2+308.0i
f(5+3i) = 3+1343.0i
f(5+4i) = 4+2624.0i
f(5+5i) = 5+3983.0i
$

せっかくなら、数値以外も代入したい。ということで sympy の登場。

コード(Emacs)

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

import sympy


x = sympy.Symbol('x')
f = - 2 * x ** 4 + 4 * x ** 3 + 7 * x ** 2 - 5 * x + 8

sympy.pprint(f)
# 数値
for x0 in range(10):
    print(f.subs({x: x0}))

# 複素数でも
for x0 in range(1, 6):
    for y0 in range(1, 6):
        z = sympy.simplify(f.subs({x: complex(x0, y0)}))
        sympy.pprint('f({0}{1:+}i) = {2}'.format(x0, y0, z))

# そして式でも
a = sympy.Symbol('a')
b = sympy.Symbol('b')
y = sympy.Symbol('y')

expr = a * y + b
print('x = ', end='')
sympy.pprint(expr)
sympy.pprint(f.subs({x: expr}))
sympy.pprint(sympy.expand(f.subs({x: expr})))

入出力結果(Terminal, IPython)

$ ./sample2.py
     4      3      2          
- 2⋅x  + 4⋅x  + 7⋅x  - 5⋅x + 8
8
12
26
2
-156
-592
-1498
-3114
-5728
-9676
f(1+1i) = 3.0 + 17.0*I
f(1+2i) = -48.0 + 58.0*I
f(1+3i) = -213.0 + 147.0*I
f(1+4i) = -612.0 + 308.0*I
f(1+5i) = -1413.0 + 565.0*I
f(2+1i) = 41.0 + 19.0*I
f(2+2i) = 62.0 + 110.0*I
f(2+3i) = 17.0 + 345.0*I
f(2+4i) = -214.0 + 796.0*I
f(2+5i) = -799.0 + 1535.0*I
f(3+1i) = 65.0 - 51.0*I
f(3+2i) = 230.0 + 18.0*I
f(3+3i) = 425.0 + 327.0*I
f(3+4i) = 530.0 + 996.0*I
f(3+5i) = 377.0 + 2145.0*I
f(4+1i) = -21.0 - 241.0*I
f(4+2i) = 360.0 - 314.0*I
f(4+3i) = 915.0 - 51.0*I
f(4+4i) = 1524.0 + 716.0*I
f(4+5i) = 2019.0 + 2155.0*I
f(5+1i) = -361.0 - 599.0*I
f(5+2i) = 308.0 - 982.0*I
f(5+3i) = 1343.0 - 933.0*I
f(5+4i) = 2624.0 - 236.0*I
f(5+5i) = 3983.0 + 1325.0*I
x = a⋅y + b
                          4              3              2    
-5⋅a⋅y - 5⋅b - 2⋅(a⋅y + b)  + 4⋅(a⋅y + b)  + 7⋅(a⋅y + b)  + 8
     4  4      3    3      3  3       2  2  2       2    2      2  2        3           2    
- 2⋅a ⋅y  - 8⋅a ⋅b⋅y  + 4⋅a ⋅y  - 12⋅a ⋅b ⋅y  + 12⋅a ⋅b⋅y  + 7⋅a ⋅y  - 8⋅a⋅b ⋅y + 12⋅a⋅b ⋅y +

                       4      3      2          
 14⋅a⋅b⋅y - 5⋅a⋅y - 2⋅b  + 4⋅b  + 7⋅b  - 5⋅b + 8
$ 

ということで、sympy (と python 3.x) を広めていきたい。

0 コメント:

コメントを投稿