sinc関数
正弦関数
を sinc関数 とよびます。このままでは、
を考慮して、
のように連続関数として定義するのが普通です。工学では全区間での積分が
を使うのが一般的です。sinc関数は
正規化された sinc関数は次の式で級数展開できます。
後述する SymPy の sinc() は、正規化されていない sinc関数の任意の項までの級数展開を取得するメソッドを備えています。
NumPy には正規化された sinc 関数の値を返す numpy.sinc() が用意されています。
となることを確認してみましょう。
# PYTHON_SINC
# In[1]
import numpy as np
# x=[-2, -1, 0, 1, 2]
x = np.arange(-2, 3)
# xが整数値をとるときのsinc(x)の値を確認
print(np.sinc(x))
# [-3.89817183e-17 3.89817183e-17 1.00000000e+00 3.89817183e-17 -3.89817183e-17]
実行結果を見ると、
# In[2]
def sinc(x, norm=True):
if norm == True:
return np.sinc(x)
else:
return np.sinc(x/np.pi)
キーワード引数 norm を True に指定する、または省略すると、正規化された sinc 関数の値が返ります。norm にそれ以外の値を渡すと正規化されていない sinc 関数が返ります。Matplotlib をインポートして、それぞれの関数のグラフを同時に可視化してみます。
# In[3]
import matplotlib.pyplot as plt
# 区間[-15,15]を512分割した値を変数xに格納
x = np.linspace(-15, 15, 513)
# FigureとAxes
fig = plt.figure(figsize=(6.5, 5))
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlabel("x", fontsize=15)
ax.set_ylabel("sinc(x)", fontsize=15)
ax.set_xlim(-15, 15)
ax.set_ylim(-0.4, 1.2)
# グラフをプロット
ax.plot(x, sinc(x), color="blue", label="normalized sinc function")
ax.plot(x, sinc(x, norm=False), color="red", label="unnormalized sinc function")
# 凡例を右上に表示
ax.legend(loc="upper right")
numpy.sinc()
numpy.sinc(x) は正規化された sinc関数 の値を返します。
以下のコードを実行すると、sinc関数の概形が表示されます。
# NUMPY_SINC_01
import numpy as np
import matplotlib.pyplot as plt
# 区間[-6,6]を512分割
x = np.linspace(-6, 6, 513)
# sinc(x)
sc = np.sinc(x)
# FigureとAxes
fig = plt.figure(figsize=(6.5, 5))
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlabel("x", fontsize=15)
ax.set_ylabel("sinc(x)", fontsize=15)
ax.set_xlim(-6, 6)
ax.set_ylim(-0.4, 1.2)
# グラフをプロット
ax.plot(x, sc, color = "darkblue", label="sinc(x)")
# 凡例を表示
ax.legend(loc="upper left")
# 画像を保存
plt.savefig("sinc.png", bbox_inches = "tight")
sympy.functions.elementary.trigonometric.sinc()
SymPyパッケージから正規化されていない sinc関数を呼び出すことができます。
# SYMPY_SINC
# In[2]
from sympy import *
# 記号を定義
var("x")
# sinc(x)のグラフをプロット
plot(sinc(x), (x, -12, 12), ylabel = "sinc(x)")
# In[2]
# sinc関数を級数展開
sinc(x).series()
# 1 - x**2/6 + x**4/120 - x**6/5040 + x**8/362880 + O(x**10)
sinc関数の不定積分が正弦積分
# In[3]
# sinc関数の不定積分
integrate(sinc(x))
# Si(x)
sinc関数の積分 (正弦積分と余弦積分)
sinc関数の不定積分
を正弦積分とよび、
によって定義される関数を余弦積分といいます。正弦積分と余弦積分をまとめて三角積分とよびます。
scipy.special.sici()
scipy.special.sici() は正弦積分と余弦積分の値を返します。
# SCIPY_SICI
import numpy as np
from scipy.special import sici
import matplotlib.pyplot as plt
# 区間[-6,6]を512分割
x = np.linspace(-10, 10, 513)
# 正弦積分
si = sici(x)[0]
# 余弦積分
ci = sici(x)[1]
# FigureとAxes
fig = plt.figure(figsize=(6.5, 5))
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlabel("x", fontsize=15)
ax.set_ylabel("si(x), ci(x)", fontsize=15)
ax.set_xlim(-6, 6)
ax.set_ylim(-2, 2)
# グラフをプロット
ax.plot(x, si, color = "blue", label="si(x)")
ax.plot(x, ci, color = "red", label="ci(x)")
# 凡例を表示
ax.legend(loc="upper left")
# 画像を保存
plt.savefig("sici.png", bbox_inches = "tight")
【参考文献】https://ja.wikipedia.org/wiki/Sinc関数
コメント