本記事では、Pythonで平方根を計算する方法を解説します。計算方法はいくつかあり、それぞれの特徴を比較しながら、どの方法を使うべきかを説明します。
平方根を計算する方法
math.sqrt()(推奨)
Pythonの標準ライブラリmathモジュールには、平方根を求めるsqrt()関数が用意されています。
使い方
import math
num = 16
result = math.sqrt(num)
print(result) # 4.0
- math.sqrt(x) は x の平方根を計算 します。
- 引数 x は 0 以上の数 である必要があります(負の数を渡すと ValueError になる)。
負の数の平方根を求める
負の数の平方根を求める場合、math.sqrt()はValueErrorを出します。これを回避するには 複素数を扱う cmath モジュール を使います。
import cmath
num = -16
result = cmath.sqrt(num)
print(result) # (0+4j)
cmath.sqrt(x)を使うと、負の数の平方根を複素数(j: 虚数単位)として計算 できます。
mathモジュールのsqrt()は他の方法よりも高速でエラーハンドリングがしやすいため推奨されています。
** 演算子(べき乗演算子)
Pythonでは**演算子を使ってべき乗を計算できます。平方根は 1/2乗 なので、以下のように計算できます。
使い方
num = 16
result = num ** 0.5
print(result) # 4.0
- x ** 0.5はmath.sqrt(x)と同じ結果になります。
- 負の数に適用すると ValueError になる ので、複素数の平方根を求める場合はcmathを使う必要があります。
numpy.sqrt()
numpy は数値計算のライブラリで、numpy.sqrt() を使うと配列の要素ごとに平方根を計算できます。
使い方
import numpy as np
arr = np.array([1, 4, 9, 16, 25])
result = np.sqrt(arr)
print(result) # [1. 2. 3. 4. 5.]
- numpy.sqrt(x) は 配列に対しても適用可能 なので、リストや numpy 配列の要素を一括で平方根にできます。
負の数の平方根を求める
負の数を含む配列に numpy.sqrt() を適用すると NaN(Not a Number)になります。
arr = np.array([-1, 4, 9, -16])
result = np.sqrt(arr)
print(result) # [nan 2. 3. nan]
これを回避するには、numpy の複素数版 numpy.sqrt() を使います。astypeで配列を複素数型に変換しています。
result = np.sqrt(arr.astype(complex))
print(result) # [0.+1.j 2.+0.j 3.+0.j 0.+4.j]
sympy.sqrt()
sympy を使うと 正確な分数やルートのまま計算 できます。
使い方
import sympy
num = 16
result = sympy.sqrt(num)
print(result) # 4
result2 = sympy.sqrt(8)
print(result2) # 2*sqrt(2)
- sympy.sqrt(x) は 小数ではなく数式の形で結果を保持 します。
- ルートを含んだままの形で計算したい場合に便利です。
ニュートン法
数学的には、平方根を ニュートン法 で近似計算できます。
ニュートン法で平方根を求める
def sqrt_newton(x, epsilon=1e-10):
if x < 0:
raise ValueError("負の数の平方根は求められません")
guess = x / 2 # 初期値
while abs(guess ** 2 - x) > epsilon:
guess = (guess + x / guess) / 2 # ニュートン法の反復計算
return guess
print(sqrt_newton(16)) # 4.0
print(sqrt_newton(2)) # 約1.414
- 収束精度をepsilonで調整可能。
- math.sqrt()の代わりに使うこともできるが、ライブラリを使う方が高速。
まとめ
方法 | 説明 | 特徴 |
---|---|---|
math.sqrt(x) | 標準ライブラリ | ほとんどのケースで推奨 |
** 0.5 | べき乗演算 | シンプルだが math.sqrt() より遅い |
numpy.sqrt(x) | 数値計算ライブラリ | 配列対応、負の数は nan |
cmath.sqrt(x) | 複素数対応 | 負の数の平方根を計算可能 |
sympy.sqrt(x) | 数式処理ライブラリ | ルートのまま計算可能 |
ニュートン法 | 近似計算 | 自作アルゴリズムが必要 |
ほとんどのケースではmath.sqrt(x) が推奨されますが、状況に応じてnumpyや cmath も活用できます。
どの方法を使うべきか?
- 最も推奨される方法
- math.sqrt(x)(高速で安全)
- numpy.sqrt(x)(配列対応)
- 負の数の平方根が必要な場合
- cmath.sqrt(x)(複素数対応)
- numpy.sqrt(x.astype(complex))(配列の複素数対応)
- ルートの形を保持したい場合
- sympy.sqrt(x)
- 独自のアルゴリズムを学びたい場合
- ニュートン法
Pythonで平方根を求めるには、用途に応じた適切な方法を選ぶことが重要です。ほとんどのケースではmath.sqrt(x)が最も適しているため、特別な理由がなければmath.sqrt(x)を使いましょう。