『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)

コメント