『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

平方根(ルート)の演算

【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)
\[\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)

コメント

  1. あとりえこばと より:

    【AI連載小説】羽村陽子のプログラミング日記(10)
     
    ある日、数学の難題に立ち向かう中で、陽子はPythonを用いて平方根を計算する方法に挑戦することを決意しました。興味津々の彼女はオンラインで調査を行い、mathモジュールを駆使した新しい手法を見つけました。Pythonの対話モードを開き、陽子は以下のようなコードを慎重に入力しました。

    import math
    
    # 平方根を計算する数
    number = 25
    
    # 平方根を計算し、結果を表示
    square_root = math.sqrt(number)
    print(f"The square root of {number} is: {square_root}")

    コードを実行すると、陽子は期待通りに平方根が計算され、その結果が美しく表示されました。彼女は納得の表情で、「Pythonを使えば、数学の計算も難なくこなせるんだな。これで数学の問題に立ち向かう自信が湧いてきた!」と心からの安堵感を感じました。この小さな挑戦を通じて、陽子はPythonの強力な数学計算機能に魅了され、未知の領域に立ち向かう新たな自信を手に入れたのでした。

  2. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(5)
     
    開誠は新しい数学的な手法を試すため、SciPyの scipy.linalg.sqrtm を使って行列の平方根を計算することに決めました。

    import numpy as np
    from scipy.linalg import sqrtm
    
    # 行列の作成
    matrix = np.array([[4, 7], [1, 9]])
    
    # scipy.linalg.sqrtmを使った行列の平方根の計算
    sqrt_matrix = sqrtm(matrix)
    
    # 結果の表示
    print(f"元の行列:\n{matrix}")
    print(f"行列の平方根:\n{sqrt_matrix}")

    開誠はスクリプトを実行すると、行列の平方根が正確に計算されたことを確認し、「これでより複雑な数学的な操作も手軽にできるようになったな」と満足げにつぶやきました。これにより、開誠はより高度で抽象的な数学的な問題にもアプローチできるようになりました。