Pythonで平方根を計算する方法をまとめました。モジュール、ライブラリを用いた計算方法、平方根を求める代表的なアルゴリズム「ニュートン法」「二分法」をPythonで実装する計算方法を解説していきます。
mathモジュールのsqrt関数を使った計算
Pythonで平方根を計算する最も一般的な方法は、mathモジュールのsqrt関数を使うことです。この関数は、非負の実数を引数として受け取り、その平方根を返します。
import math # 有理数の平方根 number1 = 25 result1 = math.sqrt(number1) print(result1) # 出力: 5.0 # 無理数の平方根 number2 = 2 result2 = math.sqrt(number2) print(result2) # 出力: 1.4142135623730951 (近似値)
NumPyのsqrt関数を使った計算
NumPyは数値計算に特化したライブラリです。以下の様に平方根を計算することができます。
import numpy as np number = 25 # 平方根を計算 result = np.sqrt(number) print(result) # 出力: 5.0
なお、NumPyのsqrt関数では配列などの複数の数値の平方根を一度に計算することができます。
import numpy as np numbers = [2, 3, 5] results = np.sqrt(numbers) print(results) # 出力: [1.41421356 1.73205081 2.23606798]
配列を扱うことが多い場合は「NumPy」、ライブラリの導入に制限がある場合やシンプルな計算で済む場合は、「math」モジュールを使うのが良いかと思います。
べき乗の計算を使った計算
シンプルな計算方法として、平方根はある数を1/2乗することと等価ですので、下記のように計算することも可能です。
number = 2 result = number ** 0.5 print(result) # 出力: 1.4142135623730951 (近似値)
自分で実装する方法
モジュールやライブラリを利用せず、アルゴリズを実装して平方根を求めることが可能です。平方根の近似値を求める方法として代表的な2つの方法、ニュートン法と二分法について解説します。
ニュートン法を用いた実装
ニュートン法は、ある関数の根(つまり、関数の値が0となるxの値)を求めるための数値計算法です。平方根の計算にも応用できます。
ニュートン法の考え方
x1 = (x0 + a/x0) / 2
x2 = (x1 + a/x1) / 2
...
def sqrt_newton(a, eps=1e-10): """ ニュートン法を用いて平方根を求める関数 Args: a: 平方根を求める数 eps: 許容誤差 Returns: aの平方根の近似値 """ x = a / 2 while abs(x**2 - a) > eps: x = (x + a/x) / 2 return x # 例 result = sqrt_newton(16) print(result) # 出力: 4.0
予備校のノリで学ぶ大学数学 ツマるポイントを徹底解説 [ ヨビノリたくみ ]
二分法を用いた実装
二分法は、ある関数の根を求める別の数値計算法です。ニュートン法よりも安定しているという特徴があります。
考え方
- 平方根を求めたい数を
aとする。 aの平方根の範囲を[left, right]とする。- 中点
midを計算し、mid**2とaを比較する。mid**2がaより大きければ、範囲を[left, mid]に狭める。mid**2がaより小さければ、範囲を[mid, right]に狭める。
- 十分に範囲が狭まれば、
midがaの平方根の近似値となる。
Pythonコード
def sqrt_bisection(a, eps=1e-10): """ 二分法を用いて平方根を求める関数 Args: a: 平方根を求める数 eps: 許容誤差 Returns: aの平方根の近似値 """ left, right = 0, a while right - left > eps: mid = (left + right) / 2 if mid**2 > a: right = mid else: left = mid return mid # 例 result = sqrt_bisection(16) print(result) # 出力: 4.0
mathモジュールやNumPyのライブラリを用いる方法が一般的ですが、パフォーマンスや計算リソースの要件に応じて独自の実装が必要な場合は参考にしてください。