まとめ¶
import matplotlib.pyplot as plt
import numpy as np
def f(x: np.array) -> np.array:
y = np.zeros_like(x)
y[(0 <= x) & (x <= np.pi)] = 1
y[(-np.pi <= x) & (x < 0)] = -1
return y
# a_0, a_k が 0なので、 b_k (sinの係数)のみが残る
def b(k):
return (2 * (1 - (-1)**k)) / (k * np.pi)
def f_hat(x: np.array, n: int) -> np.array:
approx = np.zeros_like(x)
for k in range(1, n+1):
approx += b(k) * np.sin(k * x)
return approx
fig, ax = plt.subplots()
x = np.linspace(-np.pi, np.pi, 500)
ax.plot(x, f(x), label="$f(x)$", color="black")
ax.plot(x, f_hat(x, n=1), label=r"$\hat{f}(x, n=1)$", linestyle="--", alpha=0.7)
ax.plot(x, f_hat(x, n=5), label=r"$\hat{f}(x, n=10)$", linestyle="--", alpha=0.7)
ax.plot(x, f_hat(x, n=100), label=r"$\hat{f}(x, n=100)$", linestyle="-", alpha=0.7)
ax.plot(x, f_hat(x, n=1000), label=r"$\hat{f}(x, n=1000)$", linestyle="-", alpha=0.7)
ax.set(xlabel="x", title=r"Approximating $f(x)$ by Fourier series")
ax.legend()
fig.show()
直交関数¶
区間 [a,b] 上の関数 f(x),g(x) が
∫abf(x)g(x)dx=0 のとき 直交する という。
関数 ϕ0(x),ϕ1(x),…,ϕn(x) が互いに直交するとき、すなわち
∫abϕi(x)ϕj(x)dx=0,i=j のとき、これらは区間[a,b]上の 直交関数系 であるという。とくにϕi(x)がxの多項式なら、これを 直交多項式 という。
直交多項式の例:ルジャンドルの多項式
次の関数 Pn(x),n=0,1,2,…, は n 次の ルジャンドルの多項式 と呼ばれる。
P0(x)P1(x)P2(x)P3(x)P4(x)P5(x)P6(x)=1=x=21(3x2−1)=21(5x3−3x)=81(35x4−30x2+3)=81(63x5−70x3+15x)=161(231x6−315x4+105x2−5)⋮ これらは区間 [−1,1] 上の直交関数系であり, 次の直交関係が成立する.
∫−11Pn(x)Pm(x)dx={2n+120n=m のとき n=m のとき Pn(x) の一般式が次式で表せることが知られている(ロドリゲスの公式).
Pn(x)=2nn!1 dxndn(x2−1)n 直交関数の例
21,coskx,sinkx,k=1,2,3,… は区間 [−π,π] 上の直交関数である。
(証明) coskx,sinkx,k=1,2,3,… は周期 2π の周期関数であるから、 1 周期 に渡る積分 ∫−ππcoskx dx,∫−ππsinkx dx は 0 である。このことから 21 と coskx, sinkx に対して次のようになる。
∫−ππ21coskx dx=∫−ππ21sinkx dx=0 coskx,sinlx に対しては次のようになる。
∫−ππcoskxsinlx dx=21∫−ππ(sin(k+l)x−sin(k−l)x)dx=0 k=l のとき coskx,coslx に対して次のようになる。
∫−ππcoskxcoslx dx=21∫−ππ(cos(k+l)x+cos(k−l)x)dx=0 k=l のとき sinkx,sinlx に対して次のようになる。
∫−ππsinkxsinlx dx=−21∫−ππ(cos(k+l)x−cos(k−l)x)dx=0 以上より 21,coskx,sinkx,k=1,2,3,…, が直交関数系であることが示された。
また次の関係も成り立つ。
∫−ππ(21)2 dx=2π∫−ππcos2kx dx=21∫−ππ(1+cos2kx)dx=π∫−ππsin2kx dx=21∫−ππ(1−cos2kx)dx=π 最小二乗近似¶
区間[a,b]上の直交関数系{ϕi(x)},i=0,1,⋯,nの線形結合で関数f(x)を近似する事を考える
f(x)≈c0ϕ0(x)+c1ϕ1(x)+⋯+cnϕn(x) このような近似は、画像や音声を表す信号を少量の数値のみで高速に伝送したり、メモリの記憶容量を削減するために用いられる。
近似の尺度として最小二乗法
J=21∫ab(f(x)−c0ϕ0(x)−c1ϕ1(x)−⋯−cnϕn(x))2 dx c0,⋯,cnminJ を用いると、各係数ciは
ci=∫abϕi(x)2 dx∫abf(x)ϕi(x)dx,i=0,1,…,n となる
∂ci∂J==−∫ab(f(x)−c0ϕ0(x)−c1ϕ1(x)−⋯−cnϕn(x))ϕi(x)dx−(∫abf(x)ϕi(x)dx−c0∫abϕ0(x)ϕi(x)dx−c1∫abϕ1(x)ϕi(x)dx−⋯−cn∫abϕn(x)ϕi(x)dx)=−(∫abf(x)ϕi(x)dx−ci∫abϕi(x)2 dx) これを0とおくと、係数が求まる
フーリエ級数¶
21,coskx,sinkx,k=1,2,3,… は区間[−π,π]上で完備であることが知られ、これらを用いる直交関数展開を フーリエ級数 (Fourier series) という。
関数f(x)の近似
f(x)≈2a0+a1cosx+b1sinx+a2cos2x+b2sin2x+a3cos3x+b3sin3x+⋯ の係数an,bnは次のようになる
a0=π1∫−ππf(x)dx,ak=π1∫−ππf(x)coskx dx,bk=π1∫−ππf(x)sinkx dx これらの係数を フーリエ係数 と呼ぶ。
例(フーリエ級数)¶
次の関数 f(x) を区間 [−π,π] 上でフーリエ級数に展開せよ
f(x)={1−10≤x≤π のとき −π≤x<0 のとき a0akbk=π1(−∫−π0 dx+∫0πdx)=π−π+π=0=π1(−∫−π0coskx dx+∫0πcoskx dx)=π1(−[ksinkx]−π0+[ksinkx]0π)=0=π1(−∫−π0sinkx dx+∫0πsinkx dx)=π1([kcoskx]−π0−[kcoskx]0π)=π1(k1−cos(−π)k−kcosπk−1)=kπ2(1−(−1)k) よって、次のようになる
f(x)=π4sinx+3π4sin3x+5π4sin5x+7π4sin7x+⋯ この近似を f^(x,n)=∑k=1nbk⋅sinkx とおく。pythonで計算すると次の図のようになる
import matplotlib.pyplot as plt
import numpy as np
def f(x: np.array) -> np.array:
y = np.zeros_like(x)
y[(0 <= x) & (x <= np.pi)] = 1
y[(-np.pi <= x) & (x < 0)] = -1
return y
# a_0, a_k が 0なので、 b_k (sinの係数)のみが残る
def b(k):
return (2 * (1 - (-1)**k)) / (k * np.pi)
def f_hat(x: np.array, n: int) -> np.array:
approx = np.zeros_like(x)
for k in range(1, n+1):
approx += b(k) * np.sin(k * x)
return approx
fig, ax = plt.subplots()
x = np.linspace(-np.pi, np.pi, 500)
ax.plot(x, f(x), label="$f(x)$", color="black")
ax.plot(x, f_hat(x, n=1), label=r"$\hat{f}(x, n=1)$", linestyle="--", alpha=0.7)
ax.plot(x, f_hat(x, n=5), label=r"$\hat{f}(x, n=5)$", linestyle="--", alpha=0.7)
ax.plot(x, f_hat(x, n=100), label=r"$\hat{f}(x, n=100)$", linestyle="--", alpha=0.7)
ax.plot(x, f_hat(x, n=1000), label=r"$\hat{f}(x, n=1000)$", linestyle="--", alpha=0.7)
ax.set(xlabel="x", title=r"Approximating $f(x)$ by Fourier series")
ax.legend()
fig.show()
直交展開¶
計量空間の元 e1,e2,…,en が互いに直交するとき、すなわち
(ei,ej)=0,i=j のとき、これらは 直交系 であるという。 特に、すべてがノルム 1(∥ei∥=1, i=1,…,n) のとき、これを 正規直交系 という。 式で書くと次のようになる。
(ei,ej)=δij ただしδijはクロネッカーのデルタである
線形結合による表現¶
計量空間Lの直交系{ei},i=1,…,nを用いて、任意の元u∈Lを線形結合で
u≈c1e1+c2e2+⋯+cnen と近似することを考える。
二乗誤差
J=21∥u−(c1e1+c2e2+⋯+cnen)∥2 を用いて最小二乗法で近似すると、解は
ci=∥ei∥2(u,ei)i=1,…,n となる。
J=21∥u−(c1e1+c2e2+⋯+cnen)∥2=21∥∥u−j=1∑ncjej∥∥2=21(u−j=1∑ncjej,u−j=1∑ncjej) 内積の微分は
dxd⟨f(x),g(x)⟩=⟨dxdf(x),g(x)⟩+⟨f(x),dxdg(x)⟩ となるため、
∂ci∂J=21∂ci∂(u−j=1∑ncjej,u−k=1∑nckek)=21(−ei,u−j=1∑ncjej)+21(u−j=1∑ncjej,−ei)=(u−j=1∑ncjej,−ei)(∵内積の対称性)=(u,−ei)−(j=1∑ncjej,−ei)∵内積の線形性=(j=1∑ncjej,ei)−(u,ei)=j=1∑ncj(ej,ei)−(u,ei)∵内積の線形性=j=1∑ncjδij∥ej∥2−(u,ei)=ci∥ei∥2−(u,ei) これを0とおいて解くと求まる
ci∥ei∥2−(u,ei)=0⟺ci∥ei∥2=(u,ei)⟺ci=∥ei∥2(u,ei)
内積の微分は
f(x)=(f1(x),⋯,fn(x))g(x)=(g1(x),⋯,gn(x)) とすると
dxd⟨f(x),g(x)⟩=dxd(i=1∑nfi(x)gi(x))=i=1∑ndxd(fi(x)gi(x))=i=1∑n(dxdfi(x)gi(x)+fi(x)dxdgi(x))(積の微分公式)=i=1∑ndxdfi(x)gi(x)+i=1∑nfi(x)dxdgi(x)=⟨dxdf(x),g(x)⟩+⟨f(x),dxdg(x)⟩ となる
大学物理のフットノート|物理数学|ベクトルの微分公式(基本編)
計量空間Lの直交系{ei},i=1,…,nを用いて、任意の元u∈Lを線形結合で等号で
u=c1e1+c2e2+⋯+cnen と表される場合に、係数ciは最小二乗法による近似と同じ解
ci=∥ei∥2(u,ei) になる
u=c1e1+⋯+cnen の両辺とeiの内積をとると、
(u,ei)=c1(e1,ei)+⋯+cn(en,ei)=ci(ei,ei)=ci∥ei∥2 よって
ci=∥ei∥2(u,ei) 直交射影¶
元uを直交系e1,e2,…,enの線形結合の集合Vn({ei}の張る部分空間)で近似することを考える。
u≈c1e1+c2e2+⋯+cnen 最小二乗近似したものは
ci=∥ei∥2(u,ei) より
u^=i=1∑n∥ei∥2(u,ei)ei と書くことができる。u^の幾何学的な解釈としては、uから{ei}の張る部分空間へと下ろした「垂線の足」となる。
このことから、u^は{ei}の張る部分空間Vnへの (直交)射影 と呼ぶ。
直交基底¶
直交系e1,e2,…,en(n=∞でもよい)による、計量空間Lの元uの最小二乗近似u^がuに一致するとき(n=∞のときはn→∞でuに収束するとき)、{ei}はLの 直交基底 であるという。
このときLは n次元計量空間 (n=∞なら 無限次元計量空間 )であるという。
直交基底の線形結合で表すことを 直交展開 という。
直交基底の例:ルジャンドルの多項式
ルジャンドルの多項式Pn(x)
Pn(x)=2nn!1 dxndn(x2−1)n は区間[−1,1]上の連続関数の直交基底である
∫−11Pn(x)Pm(x)dx={2n+120n=m のとき n=m のとき パーセバルの式¶
Lを計量空間とする。u,v∈Lについて、正規直交基底{ei},i=1,…,nで
uv=c1e1+c2e2+⋯+cnen=d1e1+d2e2+⋯+dnen と表したとする。このとき、次の パーセバル(・プランシュレル)の式 が成り立つ(n=∞でも成り立つ)
(u,v)=i=1∑ncidi,∥u∥2=i=1∑nci2
(u,v)=(i=1∑nciei,j=1∑ndjej)=i=1∑nci(ei,j=1∑ndjej)(∵内積の線形性)=i=1∑nj=1∑ncidj(ei,ej)(∵内積の線形性)=i=1∑nj=1∑ncidjδij(∵eは正規直交基底)=i=1∑ncidi ∥u∥2=(u,u)=(i=1∑nciei,j=1∑ncjej)=i=1∑nj=1∑ncicj(ei,ej)=i=1∑nj=1∑ncicjδij=i=1∑nci2 金谷健一. (2003). これなら分かる応用数学教室: 最小二乗法からウェーブレットまで.