開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Python 3.6 (プログラミング言語)
圧倒的に楽だからこの代入法を広めていきたい pic.twitter.com/hba2CL0lLV
— HSMT (@seuai6224) 2017年1月16日
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 コメント:
コメントを投稿