SymPyで方程式を解く方法

Pythonで方程式を解く方法は色々ありますが、今回はSymPyを使ってみます。

基本

x^2-2*x+1=0を解いてみます。
結果は配列で出力されます。解が複数ある場合に対応しています。

import sympy
x = sympy.symbols("x")
equation = x**2 - 2 * x + 1
solution = sympy.solve(equation, x)
print(solution)

結果
[1]

解が複数ある場合

import sympy
x = sympy.symbols("x")
equation = x**2 - 1
solution = sympy.solve(equation, x)
print(solution)

結果
[-1, 1]

虚数解がある場合

虚数は「I」で表されます。

import sympy
x = sympy.symbols("x")
equation = x**2 + 1
solution = sympy.solve(equation, x)
print(solution)

結果
[-I, I]

複雑な数式の場合

下のような複雑な数式の場合は、ループを使って書けます。
x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x+\dfrac{1}{x}}}}}}}}}}=0

import sympy

x = sympy.symbols("x")
y = x
for i in range(10):
    y = x + 1 / y
solution = sympy.solve(y, x)
print(solution)

結果
[-sqrt(-2 – sqrt(3)), sqrt(-2 – sqrt(3)), -sqrt(-2 + sqrt(3)), sqrt(-2 + sqrt(3))]

式がどうなっているか

式は出力できます。

print(y)

結果
x + 1/(x + 1/(x + 1/(x + 1/(x + 1/(x + 1/(x + 1/(x + 1/(x + 1/(x + 1/x)))))))))

実際の値を求めたい場合

上の結果はsqrtが使われていて実際の値が分かりません。
evalfを使うと実際の値が求まります。

for s in solution:
    print(s.evalf())

結果
-1.93185165257814*I
1.93185165257814*I
-0.517638090205041*I
0.517638090205041*I

コメント

タイトルとURLをコピーしました