Pythonで様々な代数計算(Sympy)

これまで配列の計算を行ってきましたがSympyライブラリを使用すれば、Pythonは代数計算にも威力を発揮します。
面倒くさい方程式などを解くときに利用できますので、今回はSympyを使用して簡単な代数計算を行ってみます。

分数型

Sympyを使用すれば、分数型を使用することができます。

from sympy import * #Sympyをimportします
a = Rational(1,3) #分数型宣言Rational
print (a)
1/3

Numpyなどでは0.333333…となっていたところが1/3として扱うことができます。
分数計算もこの通り

from sympy import *
a = Rational(1,3)
b = Rational(2,5)
c = a + b
print (c)
11/15

変数の取扱い

from sympy import *
x = Symbol('x')
y = Symbol('y')
f = x + y + 2*y - 4*x +2*x*y
print (f)
2*x*y - 3*x + 3*y

Symbol関数を使用することで変数を変数のまま計算することも出来る。
展開も

from sympy import *
x = Symbol('x')
y = Symbol('y')
f = expand((x + y)**4)
print (f)
x**4 + 4*x**3*y + 6*x**2*y**2 + 4*x*y**3 + y**4
f = expand(cos(x + y), trig=True)

trig=Trueを加えれば

-sin(x)*sin(y) + cos(x)*cos(y)

三角関数の展開も出来る(加法定理)。

方程式を解く

1元n次方程式

x2-6x-9=0を解いてみる

from sympy import *
x = Symbol('x')
f = x**2 + -6 * x -9
s = solve(f,x) #f=0として計算する
print (s)
[3 + 3*sqrt(2), -3*sqrt(2) + 3]

solveにより方程式を解ける。

n元n次連立方程式

x2+y2=0
xy=1
連立方程式を解こう。

from sympy import *
x = Symbol('x')
y = Symbol('y')
f1 = x**2 + y**2
f2 = x*y - 1 
s = solve([f1,f2],[x,y])
print (s)
[(-(-sqrt(2)/2 - sqrt(2)*I/2)**3, -sqrt(2)/2 - sqrt(2)*I/2), (-(-sqrt(2)/2 + sqrt(2)*I/2)**3, -sqrt(2)/2 + sqrt(2)*I/2), (-(sqrt(2)/2 - sqrt(2)*I/2)**3, sqrt(2)/2 - sqrt(2)*I/2), (-(sqrt(2)/2 + sqrt(2)*I/2)**3, sqrt(2)/2 + sqrt(2)*I/2)]

solve([f1,f2],[x,y])と書けばx,yのペアで解いてくれる。

ある文字について解きたいとき

exp(x+y)=1をyについて解いてみる。

from sympy import *
x = Symbol('x')
y = Symbol('y')
f = exp(x + y) - 1
s = solve(f,y)
print (s)
[log(exp(-x))]

今日はここまで。