絶対値の演算

絶対値の演算

絶対値の定義

 実数 $x$ の 絶対値 $|x|$ は数直線上の原点からの距離を表します:
 
\[|x|=\begin{cases}x & (x\leq 0)\\[6pt]
-x & (x\lt 0)\end{cases}\]
 すなわち、正数の絶対値はもとの数と同じですが、負数の絶対値はマイナス符号を取り去って正数となります。たとえば、$-10$ の絶対値は $10$ です。複素数 $z=a+bi$ の 絶対値 は複素平面上の原点からの距離として定義されます:
 
\[|z|=\sqrt{a^2+b^2}\]
 たとえば、$2+3i$ の絶対値は $\sqrt{2^2+3^2}=\sqrt{13}$ となります。この定義は実数の場合も含みます。たとえば、$10=10+0i$ の絶対値は $\sqrt{10^2+0^2}=10$ となります。
 

Pythonにおける絶対値の演算

 Pythonで数値の絶対値をとるときには、次のような関数を用います。

 ① 組み込み関数 abs()
 ② math モジュールの math.fabs()
 ③ NumPy モジュールの numpy.abs()

組み込み関数abs(x)による絶対値の演算

 Python 本体に組み込まれている abs(x) は引数 x の 絶対値 を返します。x に整数を渡すと整数型で、浮動小数点数を渡すと浮動小数点数型で値を返します。x に複素数 a + bj を渡すと、その絶対値を浮動小数点数型で返します。

# https://python.atelierkobato.com/absolute/
# リストABS-A-1

# 整数の絶対値
a = abs(-100)

# 浮動小数点数の絶対値
b = abs(-100.0)

# 複素数の絶対値
c = abs(2 + 3J)

print("a =", a)
print("b =", b)
print("c =", c)
a = 100
b = 100.0
c = 3.6055512754639896

 

math.fabs(x) による絶対値の演算

 標準ライブラリの mathモジュールをインポートすると、math.fabs(x) を使えるようになります。 math.fabs(x) は引数 x の絶対値を返します。引数に整数、浮動小数点数のいずれを渡しても、戻り値は浮動小数点数型となります。x に複素数を指定することはできません。

# https://python.atelierkobato.com/absolute/
# リストABS-B-1

# mathをインポート
import math

# 整数型の絶対値
a = math.fabs(-100)

# 浮動小数点型の絶対値
b = math.fabs(-100.0)

print("a =", a)
print("b =", b)
a = 100.0
b = 100.0

 

numpy.absolute(x), numpy.abs(x), numpy.fabs(x)

 NumPy をインポートすると、numpy.absolute(x) が使えるようになります。numpy.absolute(x) は引数 x の絶対値を返します。この関数は numpy.abs(x) という略記で使用することもできます。引数 x には整数、浮動小数点数、複素数、配列 (ndarray) を指定することができます。

# https://python.atelierkobato.com/absolute/
# リストABS-C-1

# numpyをインポート
import numpy as np

# 配列を定義
x = np.array([5, -5, 7 + 9j])

# 配列xの各要素の絶対値を計算
x_abs = np.abs(x)

print("x_abs =", x_abs)
x_abs = [5.+0.j -5.+0.j 7.+9.j]

 引数に渡す配列の個々の要素の型が異なっている場合は、最も広い型をもつ要素と同型に揃えた配列を返します。上のサンプルでは、配列 x のなかに複素数型の要素があるので、この配列の絶対値をとると、要素をすべて複素数型に揃えた配列が返ってきます。

 numpy.fabs(x) は引数 x の絶対値を返します。引数 x には整数、浮動小数点数、(整数と浮動小数点数を要素にもつ)配列を指定することができますが、複素数や複素数を要素にもつ配列を渡すことはできません。

# https://python.atelierkobato.com/absolute/
# リストABS-D-1

# numpyをインポート
import numpy as np

# 配列を定義
x = np.array([5, -5, -10.0])

# 配列xの各要素の絶対値を計算
x_abs = np.fabs(x)

print("x_abs =", x_abs)
x_abs = [5. -5. -10.]

 

関数の絶対値

 ある関数 $y=f(x)$ の絶対値 $y=|f(x)|$ のグラフは、$f(x)$ で負になる部分を $x$ 軸対称に折り返した形になります。次のコードは、$y=\sin x$ と $y=|\sin x|$ のグラフを表示します。

# リストABS-E-1

import numpy as np
import matplotlib.pyplot as plt

# 円周率の表記を設定
pi = 2 * np.pi

# データ(x,y)を設定
x = np.arange(0, 2*pi, 0.1)
y1 = np.sin(x)
y2 = np.abs(np.sin(x))

# FigureとAxesを設定
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlabel("x", fontsize = 16)
ax.set_ylabel("y", fontsize = 16)
ax.set_xlim(0, 2 * pi)
ax.set_ylim(-1.5, 1.5)
ax.set_xticks([0, pi/2, pi, 3*pi/2, 2*pi])
ax.set_xticklabels(["0", "$\pi/2$", "$\pi$", "$3\pi/2$", "$2\pi$"],
                   fontsize = 12)

# データをプロット
ax.plot(x, y1, linestyle = "--", color = "blue", label = "y = sinx")
ax.plot(x, y2, color = "red", label = "y = |sinx|")
ax.legend()

# ファイルを保存
plt.savefig("abs_sin.png", bbox_inches = "tight")

[Matplotlib] sinx の絶対値 y = |sinx| のグラフ