【Python】平方根(ルート)の演算
$2$ 乗して $x$ になる数を $x$ の平方根(square root)とよびます。たとえば、$-4$ と $4$ はどちらも $2$ 乗すると $16$ になるので、$16$ の平方根です。
$x$ の平方根のうち正数を $\sqrt{x}$ で表し、ルート・エックスと読みます。記号 $\sqrt{}$ は根号 (root) といいます。$\sqrt{16}=4$ であり、$16$ の平方根は $\pm 4$ です。
$5$ の平方根は自然数でも分数でも表すことができず、
\[\sqrt{5}=2.2360679775 \, …\]
のように無限に続く循環しない小数となります。このような数を「無理数」とよびます。$\sqrt{3},\ \sqrt{7},\ \sqrt{11}$ なども無理数です。
$2$ 乗して $-1$ になる数は実数範囲に存在しません。そこで虚数単位 $i$ という新しい枠組みの数字を用意して、$i^2=-1$ と定義します。このとき、$-i$ も $-1$ の平方根となりますが、根号をとる場合は正符号の虚数を採用します (正数ではありません)。すなわち $\sqrt{-1}=i$ となります。
実数と虚数を組合わせた数 $z=a+bi$ を複素数といいます。複素数 $z$ についても、$2$ 乗して $z$ になるような数を $z$ の平方根として定義します。
算術演算子で平方根を計算する
Python の算術演算子を使って「x**0.5」と記述すれば、x の正の平方根 $\sqrt{x}$ を求めることができます。$2$ の平方根 $\sqrt{2}$ を計算させてみましょう。
# PYTHON_ROOT # In[1] # 2の平方根(√2)の計算 val = 2**0.5 print(val) # 1.4142135623730951
負数の平方根は虚数となります。
# In[2] # -2の平方根(√-2)の計算 b = (-2)**0.5 print(val) # (8.659560562354934e-17+1.4142135623730951j)
$\sqrt{-2}$ は $0+\sqrt{2}i$ ですが、僅かに誤差が生じて実部に非常に小さな値が入っています。虚数の平方根も計算できます。
# In[3] # 虚数iの平方根;√i=exp(pi*i/4) val = (1j)**0.5 print(val) # (0.7071067811865476+0.7071067811865475j)
$i$ をオイラー形式で表すと、$e^{i\pi/2}$ なので、平方根($1/2$ 乗)は $e^{i\pi/4}$ となります。
組み込み関数で平方根を計算する
Python の組み込み関数 pow(x, y [,z]) でオプション引数 z を省略すると、x の y 乗を計算します。すなわち、pow(x, 0.5) で x について正の平方根を得ます。引数 x には負数や複素数を渡すこともできます。
# PYTHON_ROOT_POW # In[1] # 8の平方根(√8)の計算 val = pow(8, 0.5) print(val) # 2.8284271247461903 # In[2] # -2の平方根(√-2)の計算 b = pow(-2, 0.5) print(val) # (8.659560562354934e-17+1.4142135623730951j) # In[3] # √i=exp(pi*i/4) val = pow(1j, 0.5) print(val) # (0.7071067811865476+0.7071067811865475j)
math.sqrt()
mathモジュールをインポートすれば、math.sqrt(x) で √x を計算できます。ただし、算術演算子や numpy.sqrt(x) とは異なり、x に負数や複素数 (complex型オブジェクト) を渡すことはできません。
# PYTHON_MATH_SQRT # In[1] import math # 2の平方根(√2)の計算 val = math.sqrt(2) print(val) # 1.4142135623730951 # In[2] # √16の計算 val = math.sqrt(16) print(val) # 4.0 # In[3] # piの平方根(√π) val = math.sqrt(math.pi) print(val) # 1.7724538509055159
math.sqrt(x) の演算機能が制限されている理由については、べき乗の記事を参照してください。
numpy.sqrt()
Numpyをインポートすれば、numpy.sqrt(x) を使えるようになります。引数 x に負数や複素数 (complex型オブジェクト)、配列 (ndarray型オブジェクト) を指定することも可能です。
# NUMPY_SQRT # In[1] import numpy as np # 数値の入った配列を定義 num_array = np.array([3, -3, 2 + 3j]) # 配列のすべての要素の平方根(ルート)を計算 sqrt_array = np.sqrt(num_array) print(sqrt_array) # [1.73205081+0.j 0.+1.73205081j 1.67414923+0.89597748j]
sympy.sqrt(x)
sympy.sqrt(x) は x の平方根を返します。x には数値の他に代数記号を渡すこともできます。文字式 $a+b$ の平方根を求めてみましょう。
# SYMPY_SQRT import sympy # 数式をLaTeX表示 sympy.init_printing() # 記号a,bを定義 sympy.var('a b') # a+bの平方根 sympy.sqrt(a+b)
sympy.root()
sympy.root(x, n) は x の n 乗根を返すので、sympy.root() の n に 2 を渡せば平方根を計算できます。
# SYMPY_ROOT # sympyをインポート import sympy # 記号xを定義 sympy.var('x') # xの平方根 expr = sympy.root(x, 2) print(expr) # sqrt(x)
コメント
【AI連載小説】羽村陽子のプログラミング日記(10)
ある日、数学の難題に立ち向かう中で、陽子はPythonを用いて平方根を計算する方法に挑戦することを決意しました。興味津々の彼女はオンラインで調査を行い、mathモジュールを駆使した新しい手法を見つけました。Pythonの対話モードを開き、陽子は以下のようなコードを慎重に入力しました。
コードを実行すると、陽子は期待通りに平方根が計算され、その結果が美しく表示されました。彼女は納得の表情で、「Pythonを使えば、数学の計算も難なくこなせるんだな。これで数学の問題に立ち向かう自信が湧いてきた!」と心からの安堵感を感じました。この小さな挑戦を通じて、陽子はPythonの強力な数学計算機能に魅了され、未知の領域に立ち向かう新たな自信を手に入れたのでした。
【AI連載小説】科学とコードの交差点(5)
開誠は新しい数学的な手法を試すため、SciPyの scipy.linalg.sqrtm を使って行列の平方根を計算することに決めました。
開誠はスクリプトを実行すると、行列の平方根が正確に計算されたことを確認し、「これでより複雑な数学的な操作も手軽にできるようになったな」と満足げにつぶやきました。これにより、開誠はより高度で抽象的な数学的な問題にもアプローチできるようになりました。