コンテンツにスキップ

スペクトル法:Fourier・Chebyshev 選点法と指数収束

対象読者: フーリエ級数の収束と多項式補間(Runge 現象・Chebyshev 点)を学び、本テーマの有限要素法 I で Galerkin 近似を知っている人。スペクトル法は未習でかまいません。

前提となる記事:フーリエ級数:Dirichlet–Jordan の収束定理・Fejér の定理・Parseval の等式・Gibbs 現象、多項式補間:誤差公式・Runge 現象・Chebyshev 点と Lebesgue 定数、有限要素法 I:Galerkin 近似・Céa の補題・1 次元の誤差評価

生 Markdown

関数の値を格子点でしか知らないとき、その微分をどう求めればよいでしょうか。差分法は隣の数点だけを使いますが、この記事で扱うスペクトル法は、すべての格子点の値を使って、波の形をした関数(sin や cos、または多項式)の和で関数全体を近似します。関数が滑らかなときは、点を少し増やすだけで誤差が急に小さくなります。読み終えると、その理由と、うまくいかない場合(不連続な関数、折り返し)の見分け方が分かり、差分法との使い分けを判断できます。

  • スペクトル法は、解を区間全体で定義された滑らかな関数(三角多項式・代数多項式)の和で近似します。Fourier 切断 PNuP_Nu の誤差は捨てた Fourier 係数だけで決まり、u∈Hsu \in H^s なら O(N−s)O(N^{-s})、uu が実軸のまわりの帯状領域で正則なら O(e−bN/2)O(e^{-bN/2}) です。差分法や有限要素法のように「次数 pp の方法」という上限がありません。
  • 等間隔の NN 点で関数を標本化すると、波数 nn と n+mNn + mN の指数関数は区別できません(折り返し)。離散 Fourier 係数は u~k=∑mu^(k+mN)\tilde u_k = \sum_{m}\hat u(k + mN) です。三角補間 INuI_Nu の誤差は、切断の誤差に折り返しの分が加わったもので、次数は切断と同じです。
  • 補間した三角多項式を微分して格子点で値をとる操作は行列 DD(スペクトル微分行列)で書けます。DD は歪対称な巡回行列で、固有値は ikik(∣k∣≤K|k| \le K)です。2 階微分のスペクトル半径(固有値の絶対値の最大)は K2≈N2/4K^2 \approx N^2/4 なので、陽的な時間積分の刻み幅は Δt=O(N−2)\Delta t = O(N^{-2}) に制限されます。
  • Galerkin 法は残差を近似空間に直交させ、選点法は格子点で方程式を満たさせます。両者の解の差は、右辺と「係数 × 解」の折り返し誤差で抑えられます。2 次の非線形項の折り返しは、3K+13K + 1 点以上の細かい格子で積を作れば消せます(3/2 則)。
  • 周期的でない問題では Chebyshev–Gauss–Lobatto 点 xj=cos⁡(jπ/N)x_j = \cos(j\pi/N) を使います。Bernstein 楕円 EρE_\rho(焦点が ±1\pm1 で区間 [−1,1][-1,1] を内側に含む楕円。この内側で関数が正則(複素微分できる)なら誤差が指数的に減る)で正則な関数の補間誤差は O(ρ−N)O(\rho^{-N})、導関数の誤差は O(N2ρ−N)O(N^2\rho^{-N}) です。点が端に O(N−2)O(N^{-2}) の間隔で集まるため、微分行列のノルムは N2N^2、2 階では N4N^4 の大きさになります。
  • 不連続な関数では、切断の誤差は一様には 0 に収束せず、不連続点から離れた点でも O(1/N)O(1/N) にとどまります。スペクトル法は滑らかな解に向く方法です。

2 次の中心差分で u′(x)u'(x) を近似すると誤差は O(h2)O(h^2)、4 次なら O(h4)O(h^4) です。次数を上げるには、より多くの格子点の値を使います。では、すべての格子点の値を使ったらどうなるでしょうか。周期関数の場合、NN 個の格子点の値をすべて通る三角多項式を作り、それを微分することになります。これが Fourier 選点法(擬スペクトル法)です。

§4 の数値実験では、u(x)=esin⁡xu(x) = e^{\sin x} の導関数を N=33N = 33 点で計算すると、2 次の差分の誤差が 2.4×10−22.4 \times 10^{-2}、4 次の差分が 1.0×10−31.0 \times 10^{-3} であるのに対し、スペクトル微分の誤差は 3.2×10−153.2 \times 10^{-15} です。誤差が NN の冪ではなく指数関数で減るからです。一方 ∣sin⁡x∣3|\sin x|^3 のように滑らかさが有限の関数では、3 つの方法の誤差はどれも N−2N^{-2} に比例して減り、差は定数倍にとどまります。

この章の目的は、この振る舞いを定理として述べて証明することです。鍵は 2 つあります。1 つは、近似の誤差が Fourier 係数の減り方で決まること(フーリエ級数の Parseval の等式)。もう 1 つは、格子点での標本化が高い波数を低い波数に重ねてしまうこと(折り返し)で、これは周期関数の台形則が指数的に収束する理由(補外と Romberg 積分)と同じ現象です。

離散 Fourier 変換を O(Nlog⁡N)O(N\log N) の演算量で計算する算法(FFT)は、この章では道具として使うだけにします。コードでは numpy.fft を呼びます。

T=R/2πZ\mathbb{T} = \mathbb{R}/2\pi\mathbb{Z} 上の関数(周期 2π2\pi の関数)を扱います。記号は フーリエ級数に合わせ、ek(x)=eikxe_k(x) = e^{ikx}、

u^(k)=12π∫−ππu(x)e−ikx dx,⟨u,v⟩=12π∫−ππu vˉ dx,∥u∥=⟨u,u⟩1/2\hat u(k) = \frac{1}{2\pi}\int_{-\pi}^{\pi}u(x)e^{-ikx}\,dx,\qquad \langle u, v\rangle = \frac{1}{2\pi}\int_{-\pi}^{\pi}u\,\bar v\,dx,\qquad \|u\| = \langle u, u\rangle^{1/2}

とします(定義 2.1[フーリエ級数])。{ek}\{e_k\} は L2(T)L^2(\mathbb{T}) の正規直交基底で、∥u∥2=∑k∣u^(k)∣2\|u\|^2 = \sum_k|\hat u(k)|^2 です(定理 5.1[フーリエ級数])。∥u∥∞\|u\|_\infty は最大値ノルムです。

この章を通じて、格子点の数 NN は奇数とし、N=2K+1N = 2K + 1 と書きます(偶数の場合の扱いは 注意 5.3 で述べます)。

定義 2.1(周期 Sobolev 空間と Fourier 切断)↗

s≥0s \ge 0 と u∈L2(T)u \in L^2(\mathbb{T}) について

∣u∣Hs2=∑k≠0∣k∣2s∣u^(k)∣2,∥u∥Hs2=∑k∈Z(1+k2)s∣u^(k)∣2|u|_{H^s}^2 = \sum_{k \ne 0}|k|^{2s}|\hat u(k)|^2,\qquad \|u\|_{H^s}^2 = \sum_{k\in\mathbb{Z}}(1 + k^2)^s|\hat u(k)|^2

とおき、∥u∥Hs<∞\|u\|_{H^s} \lt \infty である uu の全体を HpersH^s_{\mathrm{per}} と書く。SN=span{ek:∣k∣≤K}S_N = \mathrm{span}\{e_k : |k| \le K\}(次数 KK 以下の三角多項式の空間。次元は NN)への L2L^2 直交射影

PNu=∑∣k∣≤Ku^(k) ekP_Nu = \sum_{|k| \le K}\hat u(k)\,e_k

を Fourier 切断という。u∈Hper1u \in H^1_{\mathrm{per}} について、Fourier 係数が iku^(k)ik\hat u(k) である L2L^2 の元を u′u' と書く。

HsH^s は「ss 回微分できて、その導関数の大きさが有限」という滑らかさを、Fourier 係数の減り方で測るものです。∣k∣2s|k|^{2s} の重みは、ss 回微分すると kk 番目の係数が ∣k∣s|k|^s 倍になることに対応し、ss が整数でなくても同じ式で滑らかさの度合いを表せます。

uu が C1C^1 級なら、部分積分で u′^(k)=iku^(k)\widehat{u'}(k) = ik\hat u(k) となるので、この u′u' はふつうの導関数です。整数 ss では ∣u∣Hs=∥u(s)∥|u|_{H^s} = \|u^{(s)}\| です。全空間の Sobolev 空間(定義 3.1[Sobolev 空間])で Fourier 変換の重み ⟨ξ⟩2s\langle\xi\rangle^{2s} を使ったのと同じ定義を、Fourier 係数について行ったものです。

以下では s>1/2s \gt 1/2 について Zs=∑m=1∞m−2sZ_s = \sum_{m=1}^{\infty}m^{-2s} と書きます。m≥2m \ge 2 で m−2s≤∫m−1mx−2sdxm^{-2s} \le \int_{m-1}^{m}x^{-2s}dx なので Zs≤1+∫1∞x−2sdx=2s/(2s−1)Z_s \le 1 + \int_1^\infty x^{-2s}dx = 2s/(2s-1) です。

補題 2.2(Fourier 係数が絶対総和可能な関数)✓

u∈L2(T)u \in L^2(\mathbb{T}) が ∑k∣u^(k)∣<∞\sum_k|\hat u(k)| \lt \infty を満たすなら、uu はほとんどいたるところで連続関数 g(x)=∑ku^(k)eikxg(x) = \sum_k\hat u(k)e^{ikx}(一様収束)に等しい。s>1/2s \gt 1/2 で u∈Hpersu \in H^s_{\mathrm{per}} ならこの仮定が成り立ち、

∑k≠0∣u^(k)∣≤(2Zs)1/2 ∣u∣Hs\sum_{k \ne 0}|\hat u(k)| \le (2Z_s)^{1/2}\,|u|_{H^s}

である。

証明(補題 2.2)

∣u^(k)eikx∣=∣u^(k)∣|\hat u(k)e^{ikx}| = |\hat u(k)| で ∑k∣u^(k)∣<∞\sum_k|\hat u(k)| \lt \infty なので、級数は一様収束し(系 6.4[関数列と一様収束])、和 gg は連続です(定理 4.1[関数列と一様収束])。一様収束する級数は項別に積分できるので(定理 5.2[関数列と一様収束] を実部と虚部に使う)、g^(n)=∑ku^(k)⟨ek,en⟩=u^(n)\hat g(n) = \sum_k\hat u(k)\langle e_k, e_n\rangle = \hat u(n) です。したがって u−gu - g の Fourier 係数はすべて 0 で、Parseval の等式(定理 5.1[フーリエ級数])から ∥u−g∥=0\|u - g\| = 0、すなわちほとんどいたるところで u=gu = g です。

後半は Cauchy–Schwarz の不等式(命題 2.2[Hilbert 空間の基礎] を ℓ2\ell^2 に使う)から

∑k≠0∣u^(k)∣=∑k≠0∣k∣−s⋅∣k∣s∣u^(k)∣≤(∑k≠0∣k∣−2s)1/2(∑k≠0∣k∣2s∣u^(k)∣2)1/2=(2Zs)1/2∣u∣Hs\sum_{k\ne0}|\hat u(k)| = \sum_{k\ne0}|k|^{-s}\cdot|k|^{s}|\hat u(k)| \le \Bigl(\sum_{k\ne0}|k|^{-2s}\Bigr)^{1/2}\Bigl(\sum_{k\ne0}|k|^{2s}|\hat u(k)|^2\Bigr)^{1/2} = (2Z_s)^{1/2}|u|_{H^s}

です。

以下、この補題の仮定を満たす uu は連続な代表元 gg と同一視します。全空間での対応する結果は 定理 4.1[Sobolev 空間] です。

定理 2.3(Fourier 切断の誤差)✓

0≤r≤s0 \le r \le s、u∈Hpersu \in H^s_{\mathrm{per}}、N=2K+1N = 2K + 1 とする。このとき

∣u−PNu∣Hr≤(K+1)r−s ∣u∣Hs≤(N2)r−s∣u∣Hs,∥u−PNu∥Hr≤2r/2(K+1)r−s ∣u∣Hs|u - P_Nu|_{H^r} \le (K+1)^{r-s}\,|u|_{H^s} \le \Bigl(\frac N2\Bigr)^{r-s}|u|_{H^s},\qquad \|u - P_Nu\|_{H^r} \le 2^{r/2}(K+1)^{r-s}\,|u|_{H^s}

が成り立つ。r=0r = 0 では左辺は ∥u−PNu∥\|u - P_Nu\| である。また PNuP_Nu は、SNS_N の元のうち ∥u−v∥Hr\|u - v\|_{H^r} を最小にするものである。

証明(定理 2.3)

u−PNuu - P_Nu の Fourier 係数は、∣k∣≤K|k| \le K で 0、∣k∣>K|k| \gt K で u^(k)\hat u(k) です。∣k∣≥K+1|k| \ge K + 1 と r−s≤0r - s \le 0 から ∣k∣2r=∣k∣2(r−s)∣k∣2s≤(K+1)2(r−s)∣k∣2s|k|^{2r} = |k|^{2(r-s)}|k|^{2s} \le (K+1)^{2(r-s)}|k|^{2s} なので

∣u−PNu∣Hr2=∑∣k∣>K∣k∣2r∣u^(k)∣2≤(K+1)2(r−s)∑∣k∣>K∣k∣2s∣u^(k)∣2≤(K+1)2(r−s)∣u∣Hs2|u - P_Nu|_{H^r}^2 = \sum_{|k| \gt K}|k|^{2r}|\hat u(k)|^2 \le (K+1)^{2(r-s)}\sum_{|k| \gt K}|k|^{2s}|\hat u(k)|^2 \le (K+1)^{2(r-s)}|u|_{H^s}^2

です。K+1>N/2K + 1 \gt N/2 から 2 番目の不等式が出ます。∣k∣≥1|k| \ge 1 では 1+k2≤2k21 + k^2 \le 2k^2 なので ∥u−PNu∥Hr2≤2r∣u−PNu∣Hr2\|u - P_Nu\|_{H^r}^2 \le 2^r|u - P_Nu|_{H^r}^2 です。r=0r = 0 では u−PNuu - P_Nu に k=0k = 0 の成分がないので ∣u−PNu∣H0=∥u−PNu∥|u - P_Nu|_{H^0} = \|u - P_Nu\| です。

最後の主張を示します。v=∑∣k∣≤Kbkek∈SNv = \sum_{|k|\le K}b_ke_k \in S_N について

∥u−v∥Hr2=∑∣k∣≤K(1+k2)r∣u^(k)−bk∣2+∑∣k∣>K(1+k2)r∣u^(k)∣2\|u - v\|_{H^r}^2 = \sum_{|k|\le K}(1+k^2)^r|\hat u(k) - b_k|^2 + \sum_{|k| \gt K}(1+k^2)^r|\hat u(k)|^2

で、第 1 項は bk=u^(k)b_k = \hat u(k) のとき 0 になり、第 2 項は vv によりません。

この定理が「スペクトル精度」の中身です。uu が滑らかであるほど(ss が大きいほど)誤差の次数が上がり、方法の側に次数の上限がありません。uu が C∞C^\infty 級なら、誤差は NN のどの冪よりも速く減ります。

切断 PNuP_Nu を作るには Fourier 係数の積分が要ります。計算では、格子点での値だけから近似を作ります。

定義 3.1(離散 Fourier 係数と三角補間)↗

N=2K+1N = 2K+1、格子点を xj=2πj/Nx_j = 2\pi j/N(j=0,…,N−1j = 0, \ldots, N-1)とする。連続な周期関数 uu について

u~k=1N∑j=0N−1u(xj)e−ikxj(k∈Z),INu=∑∣k∣≤Ku~k ek\tilde u_k = \frac1N\sum_{j=0}^{N-1}u(x_j)e^{-ikx_j}\quad(k \in \mathbb{Z}),\qquad I_Nu = \sum_{|k|\le K}\tilde u_k\,e_k

を離散 Fourier 係数、三角補間という。整数 nn に対し、n≡n∗(modN)n \equiv n^{*} \pmod N かつ ∣n∗∣≤K|n^{*}| \le K を満たすただ 1 つの整数を n∗n^{*} と書き、n≠n∗n \ne n^{*} のとき、波数 nn は波数 n∗n^{*} に折り返される(エイリアシング)という。

補題 3.2(指標の離散的な直交性と補間の一意性)✓

N=2K+1N = 2K+1、xj=2πj/Nx_j = 2\pi j/N とする。

  1. 整数 nn について、1N∑j=0N−1einxj\frac1N\sum_{j=0}^{N-1}e^{inx_j} は nn が NN の倍数のとき 1、そうでないとき 0 である。
  2. v,w∈SNv, w \in S_N について 1N∑j=0N−1v(xj)w(xj)‾=⟨v,w⟩\frac1N\sum_{j=0}^{N-1}v(x_j)\overline{w(x_j)} = \langle v, w\rangle。
  3. 連続な周期関数 uu について、INuI_Nu は p(xj)=u(xj)p(x_j) = u(x_j)(j=0,…,N−1j = 0, \ldots, N-1)を満たすただ 1 つの p∈SNp \in S_N である。
証明(補題 3.2)
  1. ω=e2πin/N\omega = e^{2\pi in/N} とおくと和は 1N∑j=0N−1ωj\frac1N\sum_{j=0}^{N-1}\omega^j です。nn が NN の倍数なら ω=1\omega = 1 で和は 1。そうでなければ ω≠1\omega \ne 1、ωN=1\omega^N = 1 なので、等比数列の和の公式から ∑j=0N−1ωj=(ωN−1)/(ω−1)=0\sum_{j=0}^{N-1}\omega^j = (\omega^N - 1)/(\omega - 1) = 0 です。

  2. v=∑∣k∣≤Kakekv = \sum_{|k|\le K}a_ke_k、w=∑∣l∣≤Kblelw = \sum_{|l|\le K}b_le_l と書くと

1N∑jv(xj)w(xj)‾=∑k,lakbˉl⋅1N∑jei(k−l)xj\frac1N\sum_jv(x_j)\overline{w(x_j)} = \sum_{k,l}a_k\bar b_l\cdot\frac1N\sum_je^{i(k-l)x_j}

です。∣k−l∣≤2K<N|k - l| \le 2K \lt N なので、k−lk - l が NN の倍数になるのは k=lk = l のときだけです。1 から右辺は ∑kakbˉk\sum_ka_k\bar b_k で、これは {ek}\{e_k\} の正規直交性から ⟨v,w⟩\langle v, w\rangle に等しくなります。

  1. p=INup = I_Nu が補間の条件を満たすことを確かめます。
INu(xl)=∑∣k∣≤K1N∑ju(xj)eik(xl−xj)=∑ju(xj)⋅1N∑k=−KKωljk,ωlj=e2πi(l−j)/NI_Nu(x_l) = \sum_{|k|\le K}\frac1N\sum_ju(x_j)e^{ik(x_l - x_j)} = \sum_ju(x_j)\cdot\frac1N\sum_{k=-K}^{K}\omega_{lj}^k,\qquad \omega_{lj} = e^{2\pi i(l-j)/N}

です。l=jl = j なら ωlj=1\omega_{lj} = 1 で内側の和は 1 です。l≠jl \ne j なら ωlj≠1\omega_{lj} \ne 1、ωljN=1\omega_{lj}^N = 1 で、∑k=−KKωljk=ωlj−K(ωljN−1)/(ωlj−1)=0\sum_{k=-K}^{K}\omega_{lj}^k = \omega_{lj}^{-K}(\omega_{lj}^N - 1)/(\omega_{lj} - 1) = 0 です。したがって INu(xl)=u(xl)I_Nu(x_l) = u(x_l)。一意性: p,q∈SNp, q \in S_N が同じ補間の条件を満たせば、p−q∈SNp - q \in S_N はすべての格子点で 0 なので、2 から ∥p−q∥2=1N∑j∣(p−q)(xj)∣2=0\|p - q\|^2 = \frac1N\sum_j|(p-q)(x_j)|^2 = 0 です。

2 は、SNS_N の元どうしの内積が台形則で厳密に計算できることを言っています。周期関数の台形則が三角多項式に対して厳密であること(定理 3.2[数値積分 II])の言い換えです。

次の補題は、格子点の値だけから作った係数 u~k\tilde u_k が、本来の係数 u^(k)\hat u(k) とどう違うかを与えます。たとえば N=5N = 5 なら、波数 33 の波は格子点の上で波数 −2-2 の波と同じ値をとるので、3∗=−23^{*} = -2 です。具体的な数値は §4 の例で確かめます。

補題 3.3(折り返しの公式)✓

uu を連続な周期関数で ∑n∣u^(n)∣<∞\sum_n|\hat u(n)| \lt \infty を満たすものとする。このとき、すべての整数 kk について

u~k=∑m∈Zu^(k+mN)\tilde u_k = \sum_{m\in\mathbb{Z}}\hat u(k + mN)

が成り立つ。また INen=en∗I_Ne_n = e_{n^{*}}(n∈Zn \in \mathbb{Z})で、

INu=∑n∈Zu^(n) en∗,u−INu=∑∣n∣>Ku^(n) (en−en∗)I_Nu = \sum_{n\in\mathbb{Z}}\hat u(n)\,e_{n^{*}},\qquad u - I_Nu = \sum_{|n| \gt K}\hat u(n)\,(e_n - e_{n^{*}})

である(どちらも一様に絶対収束する)。

証明(補題 3.3)

補題 2.2 から、すべての点で u(x)=∑nu^(n)einxu(x) = \sum_n\hat u(n)e^{inx} です。x=xjx = x_j を代入して定義に入れ、有限和と絶対収束する級数を入れ替えると

u~k=1N∑j=0N−1∑nu^(n)ei(n−k)xj=∑nu^(n)⋅1N∑j=0N−1ei(n−k)xj\tilde u_k = \frac1N\sum_{j=0}^{N-1}\sum_n\hat u(n)e^{i(n-k)x_j} = \sum_n\hat u(n)\cdot\frac1N\sum_{j=0}^{N-1}e^{i(n-k)x_j}

です。補題 3.2 の 1 から、内側の和は n−kn - k が NN の倍数のとき 1、そうでないとき 0 なので、n=k+mNn = k + mN の項だけが残ります。

u=enu = e_n では u^(n)=1\hat u(n) = 1 で他の係数は 0 なので、∣k∣≤K|k| \le K について、u~k\tilde u_k は k≡n(modN)k \equiv n \pmod N すなわち k=n∗k = n^{*} のとき 1、そうでないとき 0 です。よって INen=en∗I_Ne_n = e_{n^{*}} です。一般の uu では、最初の式から

INu=∑∣k∣≤K∑mu^(k+mN) ek=∑nu^(n) en∗I_Nu = \sum_{|k|\le K}\sum_m\hat u(k + mN)\,e_k = \sum_n\hat u(n)\,e_{n^{*}}

です(n=k+mNn = k + mN と書くと n∗=kn^{*} = k で、(k,m)(k, m) と nn は 1 対 1 に対応する)。∣n∣≤K|n| \le K では n∗=nn^{*} = n なので、u=∑nu^(n)enu = \sum_n\hat u(n)e_n との差は ∣n∣>K|n| \gt K の項だけが残ります。∣en−en∗∣≤2|e_n - e_{n^{*}}| \le 2 と ∑∣u^(n)∣<∞\sum|\hat u(n)| \lt \infty から収束は一様かつ絶対です。

標本化定理(定理 2.1[標本化定理とウェーブレット])は、帯域が制限された関数は十分細かい標本から復元できると述べ、Nyquist 率より粗い標本では復元できない例がありました(命題 2.2[標本化定理とウェーブレット])。折り返しの公式は、その周期関数版を定量的にしたものです。NN 点の格子が区別できる波数は ∣k∣≤K|k| \le K の NN 個だけで、それより高い波数の成分は消えるのではなく、低い波数の成分に加わります。

次の定理の証明は、誤差を「低い波数の係数に高い波数が折り返された分」と「KK より高い波数を捨てた分」の 2 つに分け、それぞれを Cauchy–Schwarz の不等式で抑える流れです。

定理 3.4(三角補間の誤差)✓

s>1/2s \gt 1/2、u∈Hpersu \in H^s_{\mathrm{per}}、N=2K+1N = 2K+1 とする。このとき

∥u−INu∥≤(1+2Zs)1/2(2N)s∣u∣Hs\|u - I_Nu\| \le (1 + 2Z_s)^{1/2}\Bigl(\frac2N\Bigr)^{s}|u|_{H^s}

が成り立つ。

証明(定理 3.4)

補題 2.2 から ∑∣u^(n)∣<∞\sum|\hat u(n)| \lt \infty なので 補題 3.3 が使えます。INuI_Nu の Fourier 係数は、∣k∣≤K|k| \le K で u~k=u^(k)+∑m≠0u^(k+mN)\tilde u_k = \hat u(k) + \sum_{m\ne0}\hat u(k+mN)、∣k∣>K|k| \gt K で 0 です。Parseval の等式(定理 5.1[フーリエ級数])から

∥u−INu∥2=∑∣k∣≤K∣∑m≠0u^(k+mN)∣2⏟折り返しの誤差+∑∣n∣>K∣u^(n)∣2⏟切断の誤差\|u - I_Nu\|^2 = \underbrace{\sum_{|k|\le K}\Bigl|\sum_{m\ne0}\hat u(k+mN)\Bigr|^2}_{\text{折り返しの誤差}} + \underbrace{\sum_{|n| \gt K}|\hat u(n)|^2}_{\text{切断の誤差}}

です。第 2 項は 定理 2.3(r=0r = 0)の証明から (2/N)2s∑∣n∣>K∣n∣2s∣u^(n)∣2(2/N)^{2s}\sum_{|n| \gt K}|n|^{2s}|\hat u(n)|^2 以下です。

第 1 項を評価します。∣k∣≤K|k| \le K、m≠0m \ne 0 のとき ∣k+mN∣≥∣m∣N−K≥∣m∣N−N/2≥∣m∣N/2|k + mN| \ge |m|N - K \ge |m|N - N/2 \ge |m|N/2 なので

∑m≠0∣k+mN∣−2s≤2∑m=1∞(mN2)−2s=2Zs(2N)2s\sum_{m\ne0}|k+mN|^{-2s} \le 2\sum_{m=1}^{\infty}\Bigl(\frac{mN}{2}\Bigr)^{-2s} = 2Z_s\Bigl(\frac2N\Bigr)^{2s}

です。Cauchy–Schwarz の不等式(命題 2.2[Hilbert 空間の基礎])から

∣∑m≠0u^(k+mN)∣2≤∑m≠0∣k+mN∣−2s⋅∑m≠0∣k+mN∣2s∣u^(k+mN)∣2≤2Zs(2N)2s∑m≠0∣k+mN∣2s∣u^(k+mN)∣2\Bigl|\sum_{m\ne0}\hat u(k+mN)\Bigr|^2 \le \sum_{m\ne0}|k+mN|^{-2s}\cdot\sum_{m\ne0}|k+mN|^{2s}|\hat u(k+mN)|^2 \le 2Z_s\Bigl(\frac2N\Bigr)^{2s}\sum_{m\ne0}|k+mN|^{2s}|\hat u(k+mN)|^2

です。∣k∣≤K|k| \le K について足します。∣n∣>K|n| \gt K である整数 nn は n=k+mNn = k + mN(∣k∣≤K|k| \le K、m≠0m \ne 0)とただ 1 通りに書けるので、右辺の和は ∑∣n∣>K∣n∣2s∣u^(n)∣2\sum_{|n| \gt K}|n|^{2s}|\hat u(n)|^2 になります。2 つの項を合わせて

∥u−INu∥2≤(2Zs+1)(2N)2s∑∣n∣>K∣n∣2s∣u^(n)∣2≤(1+2Zs)(2N)2s∣u∣Hs2\|u - I_Nu\|^2 \le (2Z_s + 1)\Bigl(\frac2N\Bigr)^{2s}\sum_{|n| \gt K}|n|^{2s}|\hat u(n)|^2 \le (1 + 2Z_s)\Bigl(\frac2N\Bigr)^{2s}|u|_{H^s}^2

です。

補間の誤差は切断の誤差と同じ次数 N−sN^{-s} です。ただし仮定が s>1/2s \gt 1/2 に強まっています。補間は点での値を使うので、uu が連続でなければ意味をもたないからです。

uu が実軸のまわりで正則なら、Fourier 係数は指数的に減衰します(補題 3.1[数値積分 II])。これを前節の式に入れると、誤差も指数的に減ります。

補題 4.1(等比級数の裾)✓

0<q<10 \lt q \lt 1、K≥0K \ge 0 とする。このとき

∑n>Kqn=qK+11−q,∑n>Kn qn≤(K+1) qK+1(1−q)2\sum_{n \gt K}q^n = \frac{q^{K+1}}{1-q},\qquad \sum_{n \gt K}n\,q^n \le \frac{(K+1)\,q^{K+1}}{(1-q)^2}

である。

証明(補題 4.1)

1 つ目は等比級数の和(命題 3.6[級数と収束判定])に qK+1q^{K+1} を掛けたものです。2 つ目を示します。まず ∑j≥1jqj=∑i≥1∑j≥iqj=∑i≥1qi/(1−q)=q/(1−q)2\sum_{j\ge1}jq^j = \sum_{i\ge1}\sum_{j\ge i}q^j = \sum_{i\ge1}q^i/(1-q) = q/(1-q)^2 です(非負の項の二重級数なので和の順序を入れ替えてよい)。n=K+jn = K + j(j≥1j \ge 1)と書くと K+j≤(K+1)jK + j \le (K+1)j なので

∑n>Kn qn=qK∑j≥1(K+j)qj≤(K+1) qK∑j≥1jqj=(K+1) qK+1(1−q)2\sum_{n \gt K}n\,q^n = q^K\sum_{j\ge1}(K + j)q^j \le (K+1)\,q^K\sum_{j\ge1}jq^j = \frac{(K+1)\,q^{K+1}}{(1-q)^2}

です。

定理 4.2(解析関数に対する指数収束)✓

a>0a \gt 0 とし、uu は帯状領域 {z:∣Im z∣<a}\{z : |\mathrm{Im}\,z| \lt a\} で正則で、u(z+2π)=u(z)u(z + 2\pi) = u(z)、そこで ∣u∣≤M|u| \le M とする。0<b<a0 \lt b \lt a、N=2K+1N = 2K+1 とすると

∥u−PNu∥∞≤2Meb−1 e−bK,∥u−INu∥∞≤4Meb−1 e−bK,∥u′−(INu)′∥∞≤4M eb(eb−1)2 (K+1) e−bK\begin{aligned} \|u - P_Nu\|_\infty &\le \frac{2M}{e^{b}-1}\,e^{-bK},\\ \|u - I_Nu\|_\infty &\le \frac{4M}{e^{b}-1}\,e^{-bK},\\ \|u' - (I_Nu)'\|_\infty &\le \frac{4M\,e^{b}}{(e^{b}-1)^2}\,(K+1)\,e^{-bK} \end{aligned}

が成り立つ。K=(N−1)/2K = (N-1)/2 なので、右辺はそれぞれ O(e−bN/2)O(e^{-bN/2})、O(e−bN/2)O(e^{-bN/2})、O(Ne−bN/2)O(Ne^{-bN/2}) である。

証明(定理 4.2)

補題 3.1[数値積分 II] から ∣u^(n)∣≤Me−b∣n∣|\hat u(n)| \le Me^{-b|n|} です。q=e−bq = e^{-b} とおきます。とくに ∑n∣n∣∣u^(n)∣<∞\sum_n|n||\hat u(n)| \lt \infty です。

切断: 補題 2.2 から u=∑nu^(n)enu = \sum_n\hat u(n)e_n(一様収束)なので、補題 4.1 から

∣u(x)−PNu(x)∣≤∑∣n∣>K∣u^(n)∣≤2M∑n>Kqn=2MqK+11−q=2Meb−1e−bK|u(x) - P_Nu(x)| \le \sum_{|n| \gt K}|\hat u(n)| \le 2M\sum_{n \gt K}q^n = \frac{2Mq^{K+1}}{1-q} = \frac{2M}{e^b - 1}e^{-bK}

です。

補間: 補題 3.3 の u−INu=∑∣n∣>Ku^(n)(en−en∗)u - I_Nu = \sum_{|n| \gt K}\hat u(n)(e_n - e_{n^{*}}) と ∣en−en∗∣≤2|e_n - e_{n^{*}}| \le 2 から、切断の評価の 2 倍になります。

導関数: 級数 ∑nu^(n)en\sum_n\hat u(n)e_n を項別に微分した級数 ∑ninu^(n)en\sum_nin\hat u(n)e_n は ∑∣n∣∣u^(n)∣<∞\sum|n||\hat u(n)| \lt \infty から一様収束するので、uu は C1C^1 級で u′=∑ninu^(n)enu' = \sum_nin\hat u(n)e_n です(定理 7.3[関数列と一様収束] を実部と虚部に使う)。同じ理由で ∑nu^(n)en∗\sum_n\hat u(n)e_{n^{*}} も項別に微分でき(∣en∗′∣=∣n∗∣≤∣n∣|e_{n^{*}}'| = |n^{*}| \le |n|)、

u′−(INu)′=∑∣n∣>Ku^(n) i (n en−n∗en∗)u' - (I_Nu)' = \sum_{|n| \gt K}\hat u(n)\,i\,(n\,e_n - n^{*}e_{n^{*}})

です。∣n∗∣≤K<∣n∣|n^{*}| \le K \lt |n| なので各項の絶対値は 2∣n∣∣u^(n)∣2|n||\hat u(n)| 以下で、補題 4.1 から

∥u′−(INu)′∥∞≤2∑∣n∣>K∣n∣∣u^(n)∣≤4M∑n>Knqn≤4M(K+1)qK+1(1−q)2=4Meb(eb−1)2(K+1)e−bK\|u' - (I_Nu)'\|_\infty \le 2\sum_{|n| \gt K}|n||\hat u(n)| \le 4M\sum_{n \gt K}nq^n \le \frac{4M(K+1)q^{K+1}}{(1-q)^2} = \frac{4Me^{b}}{(e^b-1)^2}(K+1)e^{-bK}

です(最後は分母と分子に e2be^{2b} を掛けた)。

格子点での (INu)′(I_Nu)' の値が、次節のスペクトル微分行列による計算結果です。

例 4.3(スペクトル微分と中心差分)

u(x)=esin⁡xu(x) = e^{\sin x} は整関数で、∣esin⁡z∣≤ecosh⁡a|e^{\sin z}| \le e^{\cosh a}(∣Im z∣≤a|\mathrm{Im}\,z| \le a)なので、任意の aa で 定理 4.2 が使えます。一方 u(x)=∣sin⁡x∣3u(x) = |\sin x|^3 は C2C^2 級ですが 3 階導関数が x=0,πx = 0, \pi で跳びます。それぞれの導関数を、2 次の中心差分、4 次の中心差分、スペクトル微分で近似し、格子点での最大誤差を比べます。

# Python 3.9.6 / NumPy 2.0.2
import numpy as np
def spectral_derivative(v):
"""奇数 N 点(x_j = 2πj/N)の格子値から、三角補間の導関数の格子値を返す。"""
N = len(v)
k = np.fft.fftfreq(N, d=1.0 / N) # 0, 1, ..., K, -K, ..., -1
return np.real(np.fft.ifft(1j * k * np.fft.fft(v)))
def fd2(v, h):
return (np.roll(v, -1) - np.roll(v, 1)) / (2 * h)
def fd4(v, h):
return (8 * (np.roll(v, -1) - np.roll(v, 1)) - (np.roll(v, -2) - np.roll(v, 2))) / (12 * h)
cases = [("exp(sin x)", lambda x: np.exp(np.sin(x)), lambda x: np.cos(x) * np.exp(np.sin(x))),
("|sin x|^3", lambda x: np.abs(np.sin(x)) ** 3, lambda x: 3 * np.sin(x) * np.abs(np.sin(x)) * np.cos(x))]
for name, f, df in cases:
print(name)
print(" N 2nd-order FD 4th-order FD spectral")
for N in [9, 17, 33, 65, 129, 257]:
x = 2 * np.pi * np.arange(N) / N
h = 2 * np.pi / N
v, exact = f(x), df(x)
errs = [np.max(np.abs(d - exact)) for d in (fd2(v, h), fd4(v, h), spectral_derivative(v))]
print(f"{N:5d} {errs[0]:.3e} {errs[1]:.3e} {errs[2]:.3e}")
exp(sin x)
N 2nd-order FD 4th-order FD spectral
9 2.795e-01 1.186e-01 4.946e-03
17 8.909e-02 1.318e-02 1.891e-07
33 2.435e-02 1.033e-03 3.195e-15
65 6.322e-03 7.133e-05 1.121e-14
129 1.608e-03 4.642e-06 8.682e-14
257 4.054e-04 2.952e-07 1.064e-13
|sin x|^3
N 2nd-order FD 4th-order FD spectral
9 4.696e-01 2.781e-01 7.078e-02
17 1.496e-01 7.070e-02 1.911e-02
33 4.238e-02 1.598e-02 5.558e-03
65 1.104e-02 3.817e-03 1.516e-03
129 2.814e-03 9.468e-04 3.973e-04
257 7.099e-04 2.371e-04 1.018e-04

esin⁡xe^{\sin x} では、差分の誤差が NN を 2 倍にするごとに約 1/41/4、約 1/161/16 になるのに対し、スペクトル微分は N=33N = 33 で丸めの大きさに達します。それ以降は誤差が少しずつ増えています。微分は波数 kk の成分の丸め誤差を kk 倍するので、丸め誤差の寄与が NN に比例して増えるためです。∣sin⁡x∣3|\sin x|^3 では 3 つとも NN を 2 倍にするごとに約 1/41/4 で、方法の次数ではなく関数の滑らかさが誤差を決めています。

例 4.4(高い波数が低い波数に見える)

N=9N = 9(K=4K = 4)の格子で sin⁡(nx)\sin(nx) を標本化し、離散 Fourier 係数が 0 でない波数を調べます。補題 3.3 によれば、sin⁡(nx)\sin(nx) は格子点の上で sin⁡(n∗x)\sin(n^{*}x) と一致するはずです。

# Python 3.9.6 / NumPy 2.0.2
import numpy as np
N = 9 # 格子点の数(K = 4)
x = 2 * np.pi * np.arange(N) / N
k = np.fft.fftfreq(N, d=1.0 / N).astype(int)
for n in [3, 7, 11, 13, 22]:
v = np.sin(n * x)
c = np.fft.fft(v) / N # 離散 Fourier 係数
support = sorted(int(kk) for kk, cc in zip(k, c) if abs(cc) > 1e-12)
alias = (n + N // 2) % N - N // 2 # n と N を法として合同な |k| <= K の整数
diff = np.max(np.abs(v - np.sin(alias * x)))
print(f"n = {n:2d}: nonzero at k = {support}, alias = {alias:2d}, "
f"max_j |sin(n x_j) - sin(alias x_j)| = {diff:.1e}")
n = 3: nonzero at k = [-3, 3], alias = 3, max_j |sin(n x_j) - sin(alias x_j)| = 0.0e+00
n = 7: nonzero at k = [-2, 2], alias = -2, max_j |sin(n x_j) - sin(alias x_j)| = 4.9e-15
n = 11: nonzero at k = [-2, 2], alias = 2, max_j |sin(n x_j) - sin(alias x_j)| = 4.9e-15
n = 13: nonzero at k = [-4, 4], alias = 4, max_j |sin(n x_j) - sin(alias x_j)| = 2.4e-15
n = 22: nonzero at k = [-4, 4], alias = 4, max_j |sin(n x_j) - sin(alias x_j)| = 8.1e-15

7=−2+97 = -2 + 9、11=2+911 = 2 + 9、13=4+913 = 4 + 9、22=4+2⋅922 = 4 + 2\cdot9 のとおりです。sin⁡(7x)\sin(7x) は格子の上では sin⁡(−2x)=−sin⁡(2x)\sin(-2x) = -\sin(2x) と区別できません。

定義 5.1(スペクトル微分行列)↗

N=2K+1N = 2K+1、xj=2πj/Nx_j = 2\pi j/N とする。格子値のベクトル v=(v0,…,vN−1)\boldsymbol{v} = (v_0, \ldots, v_{N-1}) に対し、p(xj)=vjp(x_j) = v_j を満たす p∈SNp \in S_N(補題 3.2 の 3)をとり、(Dv)j=p′(xj)(D\boldsymbol{v})_j = p'(x_j) で定まる NN 次の行列 DD をスペクトル微分行列という。

命題 5.2(スペクトル微分行列の成分と固有値)✓

定義 5.1 の DD について次が成り立つ。

  1. Djj=0D_{jj} = 0 で、j≠lj \ne l のとき Djl=(−1)j−l2sin⁡((xj−xl)/2).D_{jl} = \frac{(-1)^{j-l}}{2\sin\bigl((x_j - x_l)/2\bigr)}.
  2. DD は実の歪対称行列(DT=−DD^{\mathsf T} = -D)で、巡回行列である(DjlD_{jl} は j−lj - l を NN で割った余りだけで決まる)。
  3. vk=(eikxj)j=0N−1\boldsymbol{v}_k = (e^{ikx_j})_{j=0}^{N-1}(∣k∣≤K|k| \le K)は互いに直交する DD の固有ベクトルで、Dvk=ik vkD\boldsymbol{v}_k = ik\,\boldsymbol{v}_k。DD の固有値は ikik(∣k∣≤K|k| \le K)ですべてであり、∥D∥2=K\|D\|_2 = K。
  4. 2 階微分の行列(p′′(xj)p''(x_j) を与える行列)は D2D^2 に等しく、実対称で、固有値は −k2-k^2(∣k∣≤K|k| \le K)、スペクトル半径は K2=(N−1)2/4K^2 = (N-1)^2/4 である。
証明(命題 5.2)
  1. C(x)=1N∑∣k∣≤KeikxC(x) = \frac1N\sum_{|k|\le K}e^{ikx} とおくと、定義 3.1 から
p(x)=∑∣k∣≤K1N∑lvleik(x−xl)=∑l=0N−1vl C(x−xl)p(x) = \sum_{|k|\le K}\frac1N\sum_lv_le^{ik(x - x_l)} = \sum_{l=0}^{N-1}v_l\,C(x - x_l)

なので、Djl=C′(xj−xl)D_{jl} = C'(x_j - x_l) です。Dirichlet 核の公式(補題 3.1[フーリエ級数])から、xx が 2π2\pi の整数倍でないとき C(x)=sin⁡(Nx/2)/(Nsin⁡(x/2))C(x) = \sin(Nx/2)/(N\sin(x/2)) で、

C′(x)=N2cos⁡Nx2 sin⁡x2−12sin⁡Nx2 cos⁡x2Nsin⁡2x2C'(x) = \frac{\frac N2\cos\frac{Nx}2\,\sin\frac x2 - \frac12\sin\frac{Nx}2\,\cos\frac x2}{N\sin^2\frac x2}

です。x=xj−xl=2π(j−l)/Nx = x_j - x_l = 2\pi(j-l)/N(j≠lj \ne l)では Nx/2=π(j−l)Nx/2 = \pi(j-l) なので sin⁡(Nx/2)=0\sin(Nx/2) = 0、cos⁡(Nx/2)=(−1)j−l\cos(Nx/2) = (-1)^{j-l} で、C′(x)=(−1)j−l/(2sin⁡(x/2))C'(x) = (-1)^{j-l}/(2\sin(x/2)) となります。j=lj = l では C′(0)=1N∑∣k∣≤Kik=0C'(0) = \frac1N\sum_{|k|\le K}ik = 0 です。

  1. jj と ll を入れ替えると、(−1)j−l(-1)^{j-l} は変わらず、sin⁡((xj−xl)/2)\sin((x_j - x_l)/2) は符号が変わるので Dlj=−DjlD_{lj} = -D_{jl}。j−lj - l を j−l+Nj - l + N に置き換えると、(−1)j−l(-1)^{j-l} は NN が奇数なので符号が変わり、sin⁡(π(j−l)/N+π)=−sin⁡(π(j−l)/N)\sin(\pi(j-l)/N + \pi) = -\sin(\pi(j-l)/N) も符号が変わるので、DjlD_{jl} は変わりません。

  2. ek∈SNe_k \in S_N は自分自身の補間なので、定義から (Dvk)j=ek′(xj)=ik eikxj(D\boldsymbol{v}_k)_j = e_k'(x_j) = ik\,e^{ikx_j} です。補題 3.2 の 2 から 1Nvl∗vk=⟨ek,el⟩\frac1N\boldsymbol{v}_l^{*}\boldsymbol{v}_k = \langle e_k, e_l\rangle で、これは k=lk = l のとき 1、そうでないとき 0 です。したがって {vk/N}∣k∣≤K\{\boldsymbol{v}_k/\sqrt N\}_{|k|\le K} は CN\mathbb{C}^N の正規直交基底で、DD の固有値は ikik(∣k∣≤K|k| \le K)の NN 個ですべてです。x=∑kckvk/N\boldsymbol{x} = \sum_kc_k\boldsymbol{v}_k/\sqrt N と展開すると ∥Dx∥22=∑kk2∣ck∣2≤K2∥x∥22\|D\boldsymbol{x}\|_2^2 = \sum_kk^2|c_k|^2 \le K^2\|\boldsymbol{x}\|_2^2 で、x=vK\boldsymbol{x} = \boldsymbol{v}_K で等号が成り立つので ∥D∥2=K\|D\|_2 = K です。

  3. p∈SNp \in S_N なら p′∈SNp' \in S_N なので、p′p' の格子値 DvD\boldsymbol{v} を補間する SNS_N の元は p′p' 自身で、その導関数 p′′p'' の格子値は D(Dv)D(D\boldsymbol{v}) です。D2D^2 は (D2)T=(DT)2=D2(D^2)^{\mathsf T} = (D^{\mathsf T})^2 = D^2 から対称で、3 から D2vk=−k2vkD^2\boldsymbol{v}_k = -k^2\boldsymbol{v}_k です。絶対値が最大の固有値は −K2-K^2 です。

DD は密行列ですが、3 から、DvD\boldsymbol{v} は「離散 Fourier 変換をして ikik を掛けて逆変換する」ことで計算できます。例 4.3 の spectral_derivative がそれです。

4 は時間発展の方程式を陽的に解くときの刻み幅を決めます。熱方程式 ut=uxxu_t = u_{xx} を空間についてスペクトル法で離散化した系 v′=D2v\boldsymbol{v}' = D^2\boldsymbol{v} に陽的 Euler 法を使うと、波数 kk の成分は 1 ステップで 1−Δt k21 - \Delta t\,k^2 倍されるので、すべての成分が増えないためには Δt≤2/K2=8/(N−1)2\Delta t \le 2/K^2 = 8/(N-1)^2 が必要十分です。2 次の中心差分の場合の条件 Δt≤h2/2=2π2/N2\Delta t \le h^2/2 = 2\pi^2/N^2 と同じ O(N−2)O(N^{-2}) ですが、定数は π2/4≈2.5\pi^2/4 \approx 2.5 倍厳しくなります。差分の最大固有値 4/h24/h^2 が、厳密な K2=(π/h)2K^2 = (\pi/h)^2 より小さいためです。

注意 5.3(N が偶数のとき)

numpy.fft を使う計算では NN を偶数(とくに 2 の冪)にとることが多いです。N=2KN = 2K のとき、波数 KK と −K-K は格子の上で同じ値 (−1)j(-1)^j をとるので、補間の空間を span{ek:∣k∣<K}⊕span{cos⁡Kx}\mathrm{span}\{e_k : |k| \lt K\} \oplus \mathrm{span}\{\cos Kx\} にとります。このとき補間は p(x)=∑lvlC(x−xl)p(x) = \sum_lv_lC(x - x_l)、C(x)=1Nsin⁡(Kx)cot⁡(x/2)C(x) = \frac1N\sin(Kx)\cot(x/2) と書け、同じ計算で Djl=12(−1)j−lcot⁡((xj−xl)/2)D_{jl} = \frac12(-1)^{j-l}\cot\bigl((x_j - x_l)/2\bigr)(j≠lj \ne l)が得られます。cos⁡Kx\cos Kx の導関数 −Ksin⁡Kx-K\sin Kx は格子点で 0 なので、DD の固有値は ikik(∣k∣<K|k| \lt K)と、波数 KK に対応する 0 です。1 階微分では波数 KK の成分に 0 を掛け、2 階微分では −K2-K^2 を掛けるのが整合的な扱いで、このとき 2 階微分の行列は D2D^2 とは波数 KK の成分だけ異なり、スペクトル半径は N2/4N^2/4 です。この章の定理は奇数の NN で述べますが、偶数でも波数 KK の項の扱いが変わるだけで、誤差の次数は同じです(Trefethen の教科書の第 3 章に偶数の場合の導出があります)。

周期境界の境界値問題

−u′′+c(x) u=f(x)(x∈T)-u'' + c(x)\,u = f(x)\qquad(x \in \mathbb{T})

を考えます。この節では関数はすべて実数値とし、cc は連続で 0<c0≤c(x)≤c10 \lt c_0 \le c(x) \le c_1 とします。SNS_N も実数値の元(v^(−k)=v^(k)‾\hat v(-k) = \overline{\hat v(k)} を満たすもの)に限ります。実数値の関数の PNuP_Nu と INuI_Nu は実数値です。

定義 6.1(Fourier–Galerkin 法と選点法)↗

a(u,v)=⟨u′,v′⟩+⟨cu,v⟩a(u, v) = \langle u', v'\rangle + \langle cu, v\rangle(u,v∈Hper1u, v \in H^1_{\mathrm{per}})とおく。f∈L2(T)f \in L^2(\mathbb{T}) に対し、a(u,v)=⟨f,v⟩a(u, v) = \langle f, v\rangle(すべての v∈Hper1v \in H^1_{\mathrm{per}})を満たす u∈Hper1u \in H^1_{\mathrm{per}} を弱解という。

  • uN∈SNu_N \in S_N で a(uN,v)=⟨f,v⟩a(u_N, v) = \langle f, v\rangle(すべての v∈SNv \in S_N)を満たすものを Fourier–Galerkin 解という。
  • ff が連続のとき、uNc∈SNu_N^{c} \in S_N で −(uNc)′′(xj)+c(xj)uNc(xj)=f(xj)-(u_N^{c})''(x_j) + c(x_j)u_N^{c}(x_j) = f(x_j)(j=0,…,N−1j = 0, \ldots, N-1)を満たすものを選点法の解(擬スペクトル法の解)という。

α=min⁡(1,c0)\alpha = \min(1, c_0)、Ma=max⁡(1,c1)M_a = \max(1, c_1) とおくと、∥v∥H12=∥v∥2+∥v′∥2\|v\|_{H^1}^2 = \|v\|^2 + \|v'\|^2 から

a(v,v)≥α∥v∥H12,∣a(u,v)∣≤Ma∥u∥H1∥v∥H1a(v, v) \ge \alpha\|v\|_{H^1}^2,\qquad |a(u, v)| \le M_a\|u\|_{H^1}\|v\|_{H^1}

です。Hper1H^1_{\mathrm{per}} は重み (1+k2)(1 + k^2) つきの ℓ2\ell^2 空間と等長なので Hilbert 空間で、弱解は Lax–Milgram の定理(定理 3.2[楕円型方程式の弱解と変分法])からただ 1 つ存在します。Galerkin 解も同じ定理を SNS_N に使ってただ 1 つ存在します(定理 2.3[有限要素法 I])。

定理 6.2(Fourier–Galerkin 法の収束)✓

f∈L2(T)f \in L^2(\mathbb{T})、uu を弱解、uNu_N を Fourier–Galerkin 解とする。

  1. cc が正の定数なら u^(k)=f^(k)/(k2+c)\hat u(k) = \hat f(k)/(k^2 + c) で、uN=PNuu_N = P_Nu である。したがって誤差は 定理 2.3 のとおりで、uu が 定理 4.2 の仮定を満たせば指数的に減る。
  2. 一般の cc では、s≥1s \ge 1 で u∈Hpersu \in H^s_{\mathrm{per}} のとき ∥u−uN∥H1≤Maα∥u−PNu∥H1≤2 Maα(K+1)1−s∣u∣Hs.\|u - u_N\|_{H^1} \le \frac{M_a}{\alpha}\|u - P_Nu\|_{H^1} \le \frac{\sqrt2\,M_a}{\alpha}(K+1)^{1-s}|u|_{H^s}.
証明(定理 6.2)
  1. cc が定数のとき、弱解の定義で vv として eke_k の実部と虚部をとると、Parseval の等式から (k2+c)u^(k)=f^(k)(k^2 + c)\hat u(k) = \hat f(k) です。Galerkin 解についても、∣k∣≤K|k| \le K で同じ式 (k2+c)u^N(k)=f^(k)(k^2 + c)\hat u_N(k) = \hat f(k) が成り立ち、∣k∣>K|k| \gt K では u^N(k)=0\hat u_N(k) = 0 です。よって uN=PNuu_N = P_Nu です。

  2. Céa の補題(定理 2.5[有限要素法 I])から ∥u−uN∥H1≤(Ma/α)inf⁡v∈SN∥u−v∥H1\|u - u_N\|_{H^1} \le (M_a/\alpha)\inf_{v\in S_N}\|u - v\|_{H^1} です。v=PNuv = P_Nu をとり、定理 2.3(r=1r = 1)を使います。

有限要素法では、近似空間が区分多項式なので inf⁡v∥u−v∥H1\inf_v\|u - v\|_{H^1} は O(hk)O(h^k) で頭打ちでした。同じ Céa の補題でも、近似空間を SNS_N にとると、右辺は uu の滑らかさの分だけ小さくなります。

選点法は、積分を計算せずに格子点の値だけで方程式を立てられるので、変数係数や非線形の問題で使いやすい方法です。その代わり、積 c uNc\,u_N と右辺 ff を格子点で標本化するときに折り返しが入ります。

次の定理は、選点法の解 uNcu_N^{c} が Galerkin 解 uNu_N からどれだけずれるかを調べます。証明の方針は 3 段階です。まず補間の誤差が小さい(定数 N0N_0 は、N≥N0N \ge N_0 ならその誤差が α/2\alpha/2 倍以下になるように選んだ値)ことで選点法の解の存在と一意性を示し、次に両者の差が満たす式を作り、最後に u′′u'' の補間誤差でずれの大きさを評価します。

定理 6.3(選点法の解と Galerkin 解の差)✓

cc を C1C^1 級、ff を連続とし、γ=max⁡(∥c∥∞,∥c′∥∞)\gamma = \max(\|c\|_\infty, \|c'\|_\infty)、N0=410 γ/αN_0 = 4\sqrt{10}\,\gamma/\alpha とおく。N=2K+1≥N0N = 2K + 1 \ge N_0 のとき、選点法の解 uNcu_N^{c} はただ 1 つ存在し、Galerkin 解 uNu_N との差は

α ∥uNc−uN∥H1≤∥(1−IN)(cuNc−f)∥\alpha\,\|u_N^{c} - u_N\|_{H^1} \le \bigl\|(1 - I_N)(cu_N^{c} - f)\bigr\|

を満たす(右辺は cuNccu_N^{c} と ff の折り返しを含む補間誤差である)。さらに弱解 uu が s>5/2s \gt 5/2 について HpersH^s_{\mathrm{per}} に属するなら

∥u−uNc∥H1≤2∥u−uN∥H1+2α(1+2Zs−2)1/2(2N)s−2∣u∣Hs\|u - u_N^{c}\|_{H^1} \le 2\|u - u_N\|_{H^1} + \frac{2}{\alpha}(1 + 2Z_{s-2})^{1/2}\Bigl(\frac2N\Bigr)^{s-2}|u|_{H^s}

である。

証明(定理 6.3)

選点法の方程式の書き換え。 w∈SNw \in S_N について、−w′′+IN(cw)−INf-w'' + I_N(cw) - I_Nf は SNS_N の元で、格子点での値は −w′′(xj)+c(xj)w(xj)−f(xj)-w''(x_j) + c(x_j)w(x_j) - f(x_j) です。補題 3.2 の 3(一意性)から、ww が選点法の解であることと、SNS_N の元として −w′′+IN(cw)=INf-w'' + I_N(cw) = I_Nf が成り立つことは同値です。

補間誤差の評価。 w∈Hper1w \in H^1_{\mathrm{per}} が C1C^1 級なら、(cw)′=c′w+cw′(cw)' = c'w + cw' から ∣cw∣H1=∥(cw)′∥≤γ(∥w∥+∥w′∥)≤2 γ∥w∥H1|cw|_{H^1} = \|(cw)'\| \le \gamma(\|w\| + \|w'\|) \le \sqrt2\,\gamma\|w\|_{H^1} です。定理 3.4(s=1s = 1。Z1≤2Z_1 \le 2 なので (1+2Z1)1/2≤5(1 + 2Z_1)^{1/2} \le \sqrt5)から

∥(1−IN)(cw)∥≤5⋅2N⋅2 γ ∥w∥H1=210 γN∥w∥H1≤α2∥w∥H1(N≥N0)\|(1 - I_N)(cw)\| \le \sqrt5\cdot\frac2N\cdot\sqrt2\,\gamma\,\|w\|_{H^1} = \frac{2\sqrt{10}\,\gamma}{N}\|w\|_{H^1} \le \frac\alpha2\|w\|_{H^1}\qquad(N \ge N_0)

です。

一意性と存在。 ff の格子値がすべて 0 のときの解 w∈SNw \in S_N は −w′′+IN(cw)=0-w'' + I_N(cw) = 0 を満たします。ww との内積をとり、⟨−w′′,w⟩=∥w′∥2\langle -w'', w\rangle = \|w'\|^2(Parseval の等式)を使うと

a(w,w)=∥w′∥2+⟨cw,w⟩=⟨cw−IN(cw),w⟩≤α2∥w∥H1∥w∥≤α2∥w∥H12a(w, w) = \|w'\|^2 + \langle cw, w\rangle = \langle cw - I_N(cw), w\rangle \le \frac\alpha2\|w\|_{H^1}\|w\| \le \frac\alpha2\|w\|_{H^1}^2

です。a(w,w)≥α∥w∥H12a(w, w) \ge \alpha\|w\|_{H^1}^2 と合わせて w=0w = 0。選点法の方程式は未知数 NN 個・方程式 NN 個の連立 1 次方程式なので、一意性から解の存在が従います。

Galerkin 解との差。 e=uNc−uN∈SNe = u_N^{c} - u_N \in S_N とおきます。v∈SNv \in S_N について、Galerkin 解の定義から a(uN,v)=⟨f,v⟩a(u_N, v) = \langle f, v\rangle、選点法の方程式から ⟨−(uNc)′′,v⟩=⟨INf−IN(cuNc),v⟩\langle -(u_N^{c})'', v\rangle = \langle I_Nf - I_N(cu_N^{c}), v\rangle なので

a(e,v)=⟨−(uNc)′′+cuNc,v⟩−⟨f,v⟩=⟨(1−IN)(cuNc−f),v⟩a(e, v) = \langle -(u_N^{c})'' + cu_N^{c}, v\rangle - \langle f, v\rangle = \bigl\langle (1 - I_N)(cu_N^{c} - f), v\bigr\rangle

です。v=ev = e とすると α∥e∥H12≤a(e,e)≤∥(1−IN)(cuNc−f)∥ ∥e∥H1\alpha\|e\|_{H^1}^2 \le a(e, e) \le \|(1 - I_N)(cu_N^{c} - f)\|\,\|e\|_{H^1} で、最初の不等式が出ます。

誤差の次数。 u∈Hpersu \in H^s_{\mathrm{per}}(s>5/2s \gt 5/2)とします。∑k∣k∣∣u^(k)∣<∞\sum_k|k||\hat u(k)| \lt \infty(補題 2.2 を u′u' に使う)から uu は C1C^1 級です。弱解の定義で vv に eke_k の実部と虚部をとると k2u^(k)=(f−cu)^(k)k^2\hat u(k) = \widehat{(f - cu)}(k) なので、u′′=cu−fu'' = cu - f(u′′u'' は Fourier 係数が −k2u^(k)-k^2\hat u(k) の L2L^2 の元)で、u′′∈Hpers−2u'' \in H^{s-2}_{\mathrm{per}}、∣u′′∣Hs−2=∣u∣Hs|u''|_{H^{s-2}} = |u|_{H^s} です。そこで

(1−IN)(cuNc−f)=(1−IN)u′′+(1−IN)(c (uNc−u))(1 - I_N)(cu_N^{c} - f) = (1 - I_N)u'' + (1 - I_N)\bigl(c\,(u_N^{c} - u)\bigr)

と分けます。第 1 項は 定理 3.4(s−2>1/2s - 2 \gt 1/2)から (1+2Zs−2)1/2(2/N)s−2∣u∣Hs(1 + 2Z_{s-2})^{1/2}(2/N)^{s-2}|u|_{H^s} 以下、第 2 項は上の補間誤差の評価から (α/2)∥uNc−u∥H1≤(α/2)(∥e∥H1+∥uN−u∥H1)(\alpha/2)\|u_N^{c} - u\|_{H^1} \le (\alpha/2)(\|e\|_{H^1} + \|u_N - u\|_{H^1}) 以下です。最初の不等式に入れて (α/2)∥e∥H1(\alpha/2)\|e\|_{H^1} を左辺に移すと

∥e∥H1≤2α(1+2Zs−2)1/2(2N)s−2∣u∣Hs+∥u−uN∥H1\|e\|_{H^1} \le \frac2\alpha(1 + 2Z_{s-2})^{1/2}\Bigl(\frac2N\Bigr)^{s-2}|u|_{H^s} + \|u - u_N\|_{H^1}

です。∥u−uNc∥H1≤∥u−uN∥H1+∥e∥H1\|u - u_N^{c}\|_{H^1} \le \|u - u_N\|_{H^1} + \|e\|_{H^1} から結論が出ます。

注意 6.4(選点法の次数について)

この評価では、選点法の H1H^1 誤差は O(N2−s)O(N^{2-s}) で、Galerkin 法の O(N1−s)O(N^{1-s})(定理 6.2)より NN の冪が 1 つ悪くなります。∣u∣Hs|u|_{H^s} だけを使う評価としては、この冪は改良できません。cc が定数のとき、選点法の解の Fourier 係数は f~k/(k2+c)=u^(k)+∑m≠0f^(k+mN)/(k2+c)\tilde f_k/(k^2 + c) = \hat u(k) + \sum_{m\ne0}\hat f(k + mN)/(k^2 + c) で、高い波数の f^(k+mN)=((k+mN)2+c) u^(k+mN)\hat f(k + mN) = ((k+mN)^2 + c)\,\hat u(k+mN) が低い波数 kk にそのまま加わります。Galerkin 法では、同じ成分は (k+mN)2+c(k+mN)^2 + c で割られた形で誤差に入ります。実際、NN ごとに u=2N−scos⁡Nxu = 2N^{-s}\cos Nx(∣u∣Hs=2|u|_{H^s} = \sqrt2)をとると、f=(N2+c)uf = (N^2 + c)u の格子値はすべて 2(N2+c)N−s2(N^2+c)N^{-s} なので選点法の解は定数 2(N2+c)N−s/c2(N^2+c)N^{-s}/c で、∥u−uNc∥H1≥2N2−s/c\|u - u_N^{c}\|_{H^1} \ge 2N^{2-s}/c です。一方 uN=PNu=0u_N = P_Nu = 0 で ∥u−uN∥H1=2 (1+N2)1/2N−s\|u - u_N\|_{H^1} = \sqrt2\,(1+N^2)^{1/2}N^{-s} です。ただし、これは HsH^s の単位球の上での最悪の場合の比較です。1 つの uu を固定したとき、Fourier 係数が ∣n∣−σ|n|^{-\sigma} のように単調に減る関数では、両者の差は N1/2N^{1/2} 倍程度にとどまります。どちらも uu の滑らかさに応じて任意の次数で減り、uu と ff が解析的なら指数的に減るので、滑らかな解ではこの差は実用上問題になりません。

非線形の方程式では、折り返しは安定性にも影響します。Burgers 方程式 ut+(u2/2)x=νuxxu_t + (u^2/2)_x = \nu u_{xx} の u2u^2 のような 2 次の項は、次の方法で折り返しなしに計算できます。

定義 6.5(3/2 則による折り返しの除去)↗

u,v∈SNu, v \in S_N(N=2K+1N = 2K+1)の積の切断 PN(uv)P_N(uv) を、M≥3K+1M \ge 3K + 1 点の格子で uu と vv の値を求めて掛け、その離散 Fourier 係数のうち ∣k∣≤K|k| \le K のものだけを残して計算する方法を、3/2 則(零詰めによる折り返しの除去)という。M≈(3/2)NM \approx (3/2)N である。

命題 6.6(3/2 則は Galerkin の積を厳密に与える)✓

u,v∈SNu, v \in S_N、M≥3K+1M \ge 3K + 1 とし、MM 点の格子 yj=2πj/My_j = 2\pi j/M での離散 Fourier 係数を w~k(M)=1M∑j=0M−1w(yj)e−ikyj\tilde w^{(M)}_k = \frac1M\sum_{j=0}^{M-1}w(y_j)e^{-iky_j} と書く。このとき w=uvw = uv について w~k(M)=w^(k)\tilde w^{(M)}_k = \hat w(k)(∣k∣≤K|k| \le K)である。M=NM = N では一般に w~k(N)≠w^(k)\tilde w^{(N)}_k \ne \hat w(k) である。

証明(命題 6.6)

w=uvw = uv は次数 2K2K 以下の三角多項式なので、∣n∣>2K|n| \gt 2K で w^(n)=0\hat w(n) = 0 です。折り返しの公式(補題 3.3 の最初の式。証明は格子点の数が偶数でもそのまま通る)から w~k(M)=∑mw^(k+mM)\tilde w^{(M)}_k = \sum_m\hat w(k + mM) です。∣k∣≤K|k| \le K、m≠0m \ne 0 のとき ∣k+mM∣≥M−K≥2K+1|k + mM| \ge M - K \ge 2K + 1 なので、m≠0m \ne 0 の項はすべて 0 です。M=NM = N の反例は u=v=eK+e−Ku = v = e_K + e_{-K} で、w=e2K+2+e−2Kw = e_{2K} + 2 + e_{-2K}、w^(−1)=0\hat w(-1) = 0 ですが、2K=−1+N2K = -1 + N なので w~−1(N)=w^(2K)=1\tilde w^{(N)}_{-1} = \hat w(2K) = 1 です。

例 6.7(積の係数の折り返し)

K=8K = 8 の実三角多項式 uu(係数は乱数)について、u2u^2 の Fourier 係数(∣k∣≤K|k| \le K)を MM 点の格子で求め、係数の畳み込みで求めた厳密な値と比べます。

# Python 3.9.6 / NumPy 2.0.2
import numpy as np
K = 8
rng = np.random.default_rng(0)
c = rng.normal(size=K + 1) + 1j * rng.normal(size=K + 1)
c[0] = c[0].real
def coeffs(M):
"""次数 K の実三角多項式 u の u^2 の Fourier 係数(|k| <= K)を、M 点の格子上の積から求める。"""
x = 2 * np.pi * np.arange(M) / M
u = c[0].real + 2 * np.real(sum(c[n] * np.exp(1j * n * x) for n in range(1, K + 1)))
w = np.fft.fft(u * u) / M
return np.array([w[k % M] for k in range(-K, K + 1)])
full = np.zeros(2 * K + 1, dtype=complex) # u の係数(k = -K, ..., K)
full[K:] = c
full[:K] = np.conj(c[:0:-1])
exact = np.convolve(full, full)[K:3 * K + 1] # 畳み込みで求めた u^2 の係数(|k| <= K)
for M in [2 * K + 1, 3 * K, 3 * K + 1, 4 * K]:
print(f"M = {M:2d}: max error of the coefficients of u^2 = {np.max(np.abs(coeffs(M) - exact)):.2e}")
M = 17: max error of the coefficients of u^2 = 8.51e+00
M = 24: max error of the coefficients of u^2 = 5.95e-01
M = 25: max error of the coefficients of u^2 = 3.58e-14
M = 32: max error of the coefficients of u^2 = 2.49e-14

M=3K=24M = 3K = 24 ではまだ折り返しが残り、M=3K+1=25M = 3K + 1 = 25 で丸めの大きさになります。命題 6.6 の条件 M≥3K+1M \ge 3K + 1 のとおりです。

例 6.8(Fourier 選点法と 4 次 Runge–Kutta 法)

移流方程式 ut+ux=0u_t + u_x = 0 と熱方程式 ut=uxxu_t = u_{xx} を、初期値 u0=esin⁡xu_0 = e^{\sin x}、空間は Fourier 選点法、時間は古典的な 4 次 Runge–Kutta 法で解きます。離散 Fourier 変換をした側では、波数 kk の成分は w′=λkww' = \lambda_kw(移流は λk=−ik\lambda_k = -ik、熱は λk=−k2\lambda_k = -k^2)で、Runge–Kutta 法の 1 ステップは R(Δtλk)R(\Delta t\lambda_k) 倍、R(z)=1+z+z2/2+z3/6+z4/24R(z) = 1 + z + z^2/2 + z^3/6 + z^4/24 です。純虚数 z=iyz = iy では ∣R(iy)∣2=1−y6/72+y8/576|R(iy)|^2 = 1 - y^6/72 + y^8/576 なので ∣R(iy)∣≤1  ⟺  ∣y∣≤22|R(iy)| \le 1 \iff |y| \le 2\sqrt2、負の実数では R(−2.7)≈0.879R(-2.7) \approx 0.879、R(−3.2)≈1.828R(-3.2) \approx 1.828 です。

# Python 3.9.6 / NumPy 2.0.2
import numpy as np
def rk4(L, v, dt, steps):
"""v' = L v(L は Fourier 側の対角成分)を古典的な 4 次 Runge–Kutta 法で進める。"""
w = np.fft.fft(v)
for _ in range(steps):
k1 = L * w
k2 = L * (w + 0.5 * dt * k1)
k3 = L * (w + 0.5 * dt * k2)
k4 = L * (w + dt * k3)
w = w + dt * (k1 + 2 * k2 + 2 * k3 + k4) / 6
return np.real(np.fft.ifft(w))
u0 = lambda x: np.exp(np.sin(x))
T = 1.0
print("advection u_t + u_x = 0, error at T = 1")
print(" N \\ steps 50 100 200 400")
for N in [9, 17, 33, 65]:
x = 2 * np.pi * np.arange(N) / N
k = np.fft.fftfreq(N, d=1.0 / N)
row = [np.max(np.abs(rk4(-1j * k, u0(x), T / s, s) - u0(x - T))) for s in (50, 100, 200, 400)]
print(f"{N:5d} " + " ".join(f"{e:.3e}" for e in row))
print("heat u_t = u_xx, error at T = 1 against the exact solution of the semi-discrete system")
print(" N steps (dt K^2 = 2.7) error steps (dt K^2 = 3.2) error")
for N in [17, 33, 65]:
x = 2 * np.pi * np.arange(N) / N
k = np.fft.fftfreq(N, d=1.0 / N)
K2 = np.max(k**2)
ref = np.real(np.fft.ifft(np.exp(-k**2 * T) * np.fft.fft(u0(x))))
out = []
for z in (2.7, 3.2):
steps = int(np.ceil(T * K2 / z))
out.append((steps, np.max(np.abs(rk4(-k**2, u0(x), T / steps, steps) - ref))))
print(f"{N:5d} {out[0][0]:6d} {out[0][1]:.3e} {out[1][0]:6d} {out[1][1]:.3e}")
advection u_t + u_x = 0, error at T = 1
N \ steps 50 100 200 400
9 1.086e-03 1.086e-03 1.086e-03 1.086e-03
17 4.524e-08 1.836e-08 1.774e-08 1.771e-08
33 3.304e-08 2.067e-09 1.292e-10 8.078e-12
65 3.291e-08 2.052e-09 1.284e-10 8.033e-12
heat u_t = u_xx, error at T = 1 against the exact solution of the semi-discrete system
N steps (dt K^2 = 2.7) error steps (dt K^2 = 3.2) error
17 24 1.680e-07 20 3.448e-02
33 95 6.155e-10 80 4.289e+04
65 380 2.349e-12 320 2.629e+67

移流方程式では、N=9N = 9 の行はステップ数を変えても誤差が変わりません(空間の誤差が支配)。N=33,65N = 33, 65 の行は NN によらず、ステップ数を 2 倍にするごとに誤差が約 1/161/16 になっています(時間の誤差が支配)。N=33N = 33 で空間の誤差は 10−1210^{-12} より小さいので、精度を決めているのは時間積分です。熱方程式では、ΔtK2=2.7\Delta tK^2 = 2.7 では安定で、3.23.2 では最高波数の成分が毎ステップ約 1.831.83 倍に増えて発散します。K2≈N2/4K^2 \approx N^2/4 なので、安定な刻み幅は Δt≈11/N2\Delta t \approx 11/N^2 以下です。

周期的でない関数を三角多項式で近似すると、端での不一致が不連続として働き、収束が遅くなります(§8)。区間 [−1,1][-1,1] 上の周期的でない問題では、代数多項式による補間を使います。等間隔の点での高次の補間は不安定なので、端に密な点をとります。

定義 7.1(Chebyshev–Gauss–Lobatto 点と Chebyshev 微分行列)↗

N≥1N \ge 1 とする(この節の NN は多項式の次数で、偶奇は問わない)。xj=cos⁡(jπ/N)x_j = \cos(j\pi/N)(j=0,…,Nj = 0, \ldots, N)を Chebyshev–Gauss–Lobatto 点という。[−1,1][-1,1] 上の連続関数 uu について、pN(xj)=u(xj)p_N(x_j) = u(x_j)(j=0,…,Nj = 0, \ldots, N)を満たす NN 次以下の多項式 pNp_N(定理 2.2[多項式補間])を uu の Chebyshev 補間という。格子値のベクトル v=(v0,…,vN)\boldsymbol{v} = (v_0, \ldots, v_N) を補間する NN 次以下の多項式 pp について (DNv)j=p′(xj)(D_N\boldsymbol{v})_j = p'(x_j) で定まる (N+1)(N+1) 次の行列 DND_N を Chebyshev 微分行列という。境界値問題を、pNp_N が内部の点 x1,…,xN−1x_1, \ldots, x_{N-1} で微分方程式を満たし、x0,xNx_0, x_N で境界条件を満たすように解く方法を Chebyshev 選点法という。

x0=1x_0 = 1、xN=−1x_N = -1 で、点は右から左へ並びます。Chebyshev 多項式 TkT_k(定義 2.1[誤差保証つきの求積と関数近似])は Tk(cos⁡θ)=cos⁡kθT_k(\cos\theta) = \cos k\theta を満たすので(補題 6.1[多項式補間])、x=cos⁡θx = \cos\theta と置くと Tk(xj)=cos⁡(kjπ/N)T_k(x_j) = \cos(kj\pi/N) です。xjx_j は、θ\theta について等間隔な点 θj=jπ/N\theta_j = j\pi/N の像で、Chebyshev 補間は偶関数 u(cos⁡θ)u(\cos\theta) の余弦による三角補間です。そのため Fourier の場合と同じ折り返しが起こります。

補題 7.2(Chebyshev 多項式の折り返し)✓

整数 k≥0k \ge 0 に対し、kk を 2N2N で割った余りを rr とし、k♯=rk^{\sharp} = r(r≤Nr \le N のとき)、k♯=2N−rk^{\sharp} = 2N - r(r>Nr \gt N のとき)とおく。このとき Tk(xj)=Tk♯(xj)T_k(x_j) = T_{k^{\sharp}}(x_j)(j=0,…,Nj = 0, \ldots, N)で、TkT_k の Chebyshev 補間は Tk♯T_{k^{\sharp}} である。

証明(補題 7.2)

k=2Nm+rk = 2Nm + r と書くと、Tk(xj)=cos⁡(kjπ/N)=cos⁡(rjπ/N+2πmj)=cos⁡(rjπ/N)T_k(x_j) = \cos(kj\pi/N) = \cos(rj\pi/N + 2\pi mj) = \cos(rj\pi/N) です。r≤Nr \le N ならこれは Tr(xj)T_r(x_j)。r>Nr \gt N なら cos⁡((2N−r)jπ/N)=cos⁡(2πj−rjπ/N)=cos⁡(rjπ/N)\cos((2N - r)j\pi/N) = \cos(2\pi j - rj\pi/N) = \cos(rj\pi/N) なので T2N−r(xj)T_{2N-r}(x_j) に等しくなります。0≤k♯≤N0 \le k^{\sharp} \le N なので Tk♯T_{k^{\sharp}} は NN 次以下で、補間多項式の一意性(定理 2.2[多項式補間])から TkT_k の補間です。

補題 7.3(Chebyshev 多項式の導関数)✓

k≥0k \ge 0 について、[−1,1][-1,1] 上で ∣Tk′(x)∣≤k2|T_k'(x)| \le k^2 であり、Tk′(1)=k2T_k'(1) = k^2、Tk′′(1)=k2(k2−1)/3T_k''(1) = k^2(k^2-1)/3 である。また 0<θ<π0 \lt \theta \lt \pi で Tk′(cos⁡θ)=ksin⁡kθ/sin⁡θT_k'(\cos\theta) = k\sin k\theta/\sin\theta である。

証明(補題 7.3)

Tk(cos⁡θ)=cos⁡kθT_k(\cos\theta) = \cos k\theta を θ\theta で微分すると −sin⁡θ Tk′(cos⁡θ)=−ksin⁡kθ-\sin\theta\,T_k'(\cos\theta) = -k\sin k\theta なので、0<θ<π0 \lt \theta \lt \pi で Tk′(cos⁡θ)=ksin⁡kθ/sin⁡θT_k'(\cos\theta) = k\sin k\theta/\sin\theta です。∣sin⁡kθ∣≤k∣sin⁡θ∣|\sin k\theta| \le k|\sin\theta| を kk についての帰納法で示します。k=0,1k = 0, 1 では等号。∣sin⁡(k+1)θ∣=∣sin⁡kθcos⁡θ+cos⁡kθsin⁡θ∣≤∣sin⁡kθ∣+∣sin⁡θ∣≤(k+1)∣sin⁡θ∣|\sin(k+1)\theta| = |\sin k\theta\cos\theta + \cos k\theta\sin\theta| \le |\sin k\theta| + |\sin\theta| \le (k+1)|\sin\theta| です。よって (−1,1)(-1,1) で ∣Tk′∣≤k2|T_k'| \le k^2 で、Tk′T_k' は連続なので [−1,1][-1,1] でも成り立ちます。θ→0\theta \to 0 とすると sin⁡kθ/sin⁡θ→k\sin k\theta/\sin\theta \to k なので Tk′(1)=k2T_k'(1) = k^2 です。

g(θ)=Tk(cos⁡θ)=cos⁡kθg(\theta) = T_k(\cos\theta) = \cos k\theta は g′′=−k2gg'' = -k^2g を満たします。g′=−sin⁡θ Tk′g' = -\sin\theta\,T_k'、g′′=sin⁡2θ Tk′′−cos⁡θ Tk′g'' = \sin^2\theta\,T_k'' - \cos\theta\,T_k'(TkT_k の引数は cos⁡θ\cos\theta)なので、x=cos⁡θx = \cos\theta について (1−x2)Tk′′(x)−xTk′(x)+k2Tk(x)=0(1 - x^2)T_k''(x) - xT_k'(x) + k^2T_k(x) = 0 が (−1,1)(-1,1) で成り立ち、両辺は多項式なのですべての xx で成り立ちます。これを微分すると (1−x2)Tk′′′−3xTk′′+(k2−1)Tk′=0(1-x^2)T_k''' - 3xT_k'' + (k^2 - 1)T_k' = 0 で、x=1x = 1 とすると Tk′′(1)=(k2−1)Tk′(1)/3=k2(k2−1)/3T_k''(1) = (k^2-1)T_k'(1)/3 = k^2(k^2-1)/3 です。

定理 7.4(Chebyshev 補間の誤差)✓

ρ>1\rho \gt 1 とし、uu は Bernstein 楕円 EρE_\rho で正則で [−1,1][-1,1] 上で実数値とする。1<r<ρ1 \lt r \lt \rho、Mr=max⁡∂Er∣u∣M_r = \max_{\partial E_r}|u|、Cr=∑j≥1(1+j)2r−jC_r = \sum_{j\ge1}(1+j)^2r^{-j} とおく。uu の Chebyshev 補間 pNp_N について

max⁡[−1,1]∣u−pN∣≤4Mrr−1 r−N,max⁡[−1,1]∣u′−pN′∣≤4MrCr N2r−N\max_{[-1,1]}|u - p_N| \le \frac{4M_r}{r - 1}\,r^{-N},\qquad \max_{[-1,1]}|u' - p_N'| \le 4M_rC_r\,N^2r^{-N}

が成り立つ。

証明(定理 7.4)

定理 3.1[誤差保証つきの求積と関数近似] から、u=∑k≥0akTku = \sum_{k\ge0}a_kT_k([−1,1][-1,1] で絶対かつ一様に収束)、∣ak∣≤2Mrr−k|a_k| \le 2M_rr^{-k}(k≥1k \ge 1)です。

補間の表示。 q=∑k≥0akTk♯q = \sum_{k\ge0}a_kT_{k^{\sharp}} とおきます。∑k∣ak∣<∞\sum_k|a_k| \lt \infty なので、l=0,…,Nl = 0, \ldots, N ごとに k♯=lk^{\sharp} = l となる kk についての和 ∑ak\sum a_k は絶対収束し、qq は T0,…,TNT_0, \ldots, T_N の 1 次結合、すなわち NN 次以下の多項式です。補題 7.2 から q(xj)=∑kakTk(xj)=u(xj)q(x_j) = \sum_ka_kT_k(x_j) = u(x_j) なので、一意性から q=pNq = p_N です。k≤Nk \le N では k♯=kk^{\sharp} = k なので

u−pN=∑k>Nak (Tk−Tk♯)u - p_N = \sum_{k \gt N}a_k\,(T_k - T_{k^{\sharp}})

です。

関数値。 [−1,1][-1,1] で ∣Tk∣≤1|T_k| \le 1(補題 6.1[多項式補間])なので、補題 4.1(q=1/rq = 1/r)から

∣u−pN∣≤2∑k>N∣ak∣≤4Mr∑k>Nr−k=4Mr r−N−11−r−1=4Mrr−1r−N|u - p_N| \le 2\sum_{k \gt N}|a_k| \le 4M_r\sum_{k \gt N}r^{-k} = \frac{4M_r\,r^{-N-1}}{1 - r^{-1}} = \frac{4M_r}{r-1}r^{-N}

です。

導関数。 補題 7.3 から ∣akTk′∣≤2Mrk2r−k|a_kT_k'| \le 2M_rk^2r^{-k} で、∑kk2r−k\sum_kk^2r^{-k} は比判定法(定理 6.2[級数と収束判定])で収束するので、∑kakTk′\sum_ka_kT_k' は [−1,1][-1,1] で一様収束します。項別微分(定理 7.3[関数列と一様収束])から u′=∑kakTk′u' = \sum_ka_kT_k' で、pN′=∑kakTk♯′p_N' = \sum_ka_kT_{k^{\sharp}}' も同様です(∣Tk♯′∣≤(k♯)2≤k2|T_{k^{\sharp}}'| \le (k^{\sharp})^2 \le k^2)。k>Nk \gt N では (k♯)2≤N2<k2(k^{\sharp})^2 \le N^2 \lt k^2 なので

∣u′−pN′∣≤∑k>N∣ak∣(k2+(k♯)2)≤4Mr∑k>Nk2r−k|u' - p_N'| \le \sum_{k \gt N}|a_k|\bigl(k^2 + (k^{\sharp})^2\bigr) \le 4M_r\sum_{k \gt N}k^2r^{-k}

です。k=N+jk = N + j(j≥1j \ge 1)と書くと N+j≤N(1+j)N + j \le N(1 + j) なので ∑k>Nk2r−k≤N2r−N∑j≥1(1+j)2r−j=CrN2r−N\sum_{k \gt N}k^2r^{-k} \le N^2r^{-N}\sum_{j\ge1}(1+j)^2r^{-j} = C_rN^2r^{-N} です。

Chebyshev 多項式の零点(Chebyshev 点)での補間については、Lebesgue 定数を使った評価 O(r−nlog⁡n)O(r^{-n}\log n) がありました(系 6.7[多項式補間])。ここでは折り返しを使って、Lebesgue 定数を経由せずに対数の因子のない評価を得ています。導関数の誤差は N2N^2 倍になります。この N2N^2 は Tk′T_k' が端で k2k^2 の大きさをもつことから来ていて、次の命題のとおり微分行列の大きさにも現れます。

次の命題の 1 の証明では、点 x0,…,xNx_0, \ldots, x_N をちょうど零点にもつ多項式 ω(x)=(1−x2)TN′(x)\omega(x) = (1 - x^2)T_N'(x) を使います。Lagrange の基底多項式は「その点で 1、他の点で 0」の多項式で、分母にこの ω\omega の導関数が現れるため、ω′\omega' の値さえ分かれば微分行列の成分が書き下せるからです。

命題 7.5(Chebyshev 微分行列)✓

N≥1N \ge 1、c0=cN=2c_0 = c_N = 2、cj=1c_j = 1(0<j<N0 \lt j \lt N)とする。

  1. j≠lj \ne l のとき DND_N の成分は (DN)jl=cjcl⋅(−1)j+lxj−xl(D_N)_{jl} = \frac{c_j}{c_l}\cdot\frac{(-1)^{j+l}}{x_j - x_l} で、対角成分は (DN)jj=−∑l≠j(DN)jl(D_N)_{jj} = -\sum_{l\ne j}(D_N)_{jl} である。
  2. NN 次以下の多項式 pp は p(cos⁡θ)=∑k=0Nbkcos⁡kθp(\cos\theta) = \sum_{k=0}^{N}b_k\cos k\theta と書け、0<θ<π0 \lt \theta \lt \pi で p′(cos⁡θ)=∑k=1Nk bksin⁡kθ/sin⁡θp'(\cos\theta) = \sum_{k=1}^{N}k\,b_k\sin k\theta/\sin\theta である。
  3. 端の点の間隔は x0−x1=2sin⁡2(π/(2N))≤π2/(2N2)x_0 - x_1 = 2\sin^2(\pi/(2N)) \le \pi^2/(2N^2) である。
  4. ∥DN∥∞≥N2\|D_N\|_\infty \ge N^2、∥DN2∥∞≥N2(N2−1)/3\|D_N^2\|_\infty \ge N^2(N^2-1)/3 である。一方 DNN+1=0D_N^{N+1} = 0 である。
証明(命題 7.5)
  1. ω(x)=(1−x2)TN′(x)\omega(x) = (1 - x^2)T_N'(x) とおきます。補題 7.3 から TN′(cos⁡θ)=Nsin⁡Nθ/sin⁡θT_N'(\cos\theta) = N\sin N\theta/\sin\theta で、これは θj=jπ/N\theta_j = j\pi/N(j=1,…,N−1j = 1, \ldots, N-1)で 0 です。TN′T_N' は N−1N - 1 次なので、零点は x1,…,xN−1x_1, \ldots, x_{N-1} ですべてで、ω\omega は x0,…,xNx_0, \ldots, x_N をちょうど零点とする N+1N + 1 次の多項式です。ω(x)=κ∏m(x−xm)\omega(x) = \kappa\prod_m(x - x_m) と書くと ω′(xl)=κ∏m≠l(xl−xm)\omega'(x_l) = \kappa\prod_{m\ne l}(x_l - x_m) なので、Lagrange の基底多項式(定理 2.2[多項式補間])は ℓl(x)=ω(x)/(ω′(xl)(x−xl))\ell_l(x) = \omega(x)/(\omega'(x_l)(x - x_l)) です。p=∑lvlℓlp = \sum_lv_l\ell_l から (DN)jl=ℓl′(xj)(D_N)_{jl} = \ell_l'(x_j) で、j≠lj \ne l のとき ω(xj)=0\omega(x_j) = 0 を使うと
ℓl′(xj)=ω′(xj)(xj−xl)−ω(xj)ω′(xl)(xj−xl)2=ω′(xj)ω′(xl)(xj−xl)\ell_l'(x_j) = \frac{\omega'(x_j)(x_j - x_l) - \omega(x_j)}{\omega'(x_l)(x_j - x_l)^2} = \frac{\omega'(x_j)}{\omega'(x_l)(x_j - x_l)}

です。ω′(xj)\omega'(x_j) を求めます。0<θ<π0 \lt \theta \lt \pi で ω(cos⁡θ)=Nsin⁡θsin⁡Nθ\omega(\cos\theta) = N\sin\theta\sin N\theta なので、θ\theta で微分して

ω′(cos⁡θ)=−N(cos⁡θ sin⁡Nθsin⁡θ+Ncos⁡Nθ)\omega'(\cos\theta) = -N\Bigl(\cos\theta\,\frac{\sin N\theta}{\sin\theta} + N\cos N\theta\Bigr)

です。θ=θj\theta = \theta_j(0<j<N0 \lt j \lt N)では sin⁡Nθj=0\sin N\theta_j = 0、cos⁡Nθj=(−1)j\cos N\theta_j = (-1)^j なので ω′(xj)=−N2(−1)j\omega'(x_j) = -N^2(-1)^j。θ→0\theta \to 0 では sin⁡Nθ/sin⁡θ→N\sin N\theta/\sin\theta \to N なので ω′(1)=−2N2\omega'(1) = -2N^2。θ=π−φ\theta = \pi - \varphi、φ→0\varphi \to 0 では sin⁡Nθ/sin⁡θ=−(−1)Nsin⁡Nφ/sin⁡φ→−(−1)NN\sin N\theta/\sin\theta = -(-1)^N\sin N\varphi/\sin\varphi \to -(-1)^NN、cos⁡θ→−1\cos\theta \to -1、cos⁡Nθ→(−1)N\cos N\theta \to (-1)^N なので ω′(−1)=−2N2(−1)N\omega'(-1) = -2N^2(-1)^N。まとめて ω′(xj)=−cjN2(−1)j\omega'(x_j) = -c_jN^2(-1)^j で、(DN)jl=cj(−1)j/(cl(−1)l(xj−xl))(D_N)_{jl} = c_j(-1)^j/(c_l(-1)^l(x_j - x_l)) です。対角成分: 定数関数 1 は NN 次以下の多項式で導関数が 0 なので、DND_N の各行の成分の和は 0 です。

  1. T0,…,TNT_0, \ldots, T_N は次数が 0,…,N0, \ldots, N なので NN 次以下の多項式の基底で、p=∑kbkTkp = \sum_kb_kT_k と書けます。Tk(cos⁡θ)=cos⁡kθT_k(\cos\theta) = \cos k\theta から最初の式が出て、θ\theta で微分すると −sin⁡θ p′(cos⁡θ)=−∑kkbksin⁡kθ-\sin\theta\,p'(\cos\theta) = -\sum_kkb_k\sin k\theta です。

  2. 1−cos⁡(π/N)=2sin⁡2(π/(2N))1 - \cos(\pi/N) = 2\sin^2(\pi/(2N)) と sin⁡t≤t\sin t \le t から出ます。

  3. v=(TN(xj))j=((−1)j)j\boldsymbol{v} = (T_N(x_j))_j = ((-1)^j)_j は ∥v∥∞=1\|\boldsymbol{v}\|_\infty = 1 で、補間する多項式は TNT_N 自身なので、(DNv)0=TN′(1)=N2(D_N\boldsymbol{v})_0 = T_N'(1) = N^2(補題 7.3)。よって ∥DN∥∞≥∥DNv∥∞≥N2\|D_N\|_\infty \ge \|D_N\boldsymbol{v}\|_\infty \ge N^2 です。NN 次以下の多項式の導関数は NN 次以下なので、DN2vD_N^2\boldsymbol{v} は 2 階導関数の格子値で、(DN2v)0=TN′′(1)=N2(N2−1)/3(D_N^2\boldsymbol{v})_0 = T_N''(1) = N^2(N^2-1)/3 です。同じ理由で DNN+1vD_N^{N+1}\boldsymbol{v} は N+1N + 1 階導関数の格子値で、NN 次以下の多項式では 0 です。

2 が「Fourier の場合への帰着」です。Chebyshev 補間の微分は、余弦級数の係数 bkb_k を離散余弦変換(FFT)で求め、kbkkb_k を係数とする正弦級数を作って sin⁡θ\sin\theta で割ることでも計算できます。

4 の DNN+1=0D_N^{N+1} = 0 は、境界条件を課さない DND_N の固有値がすべて 0 であることを意味します。時間発展の安定性に関係するのは、境界条件を入れた行列です。たとえば u(±1)=0u(\pm1) = 0 のもとでの 2 階微分は、DN2D_N^2 から最初と最後の行と列を除いた (N−1)(N-1) 次の行列 D~N(2)\tilde D^{(2)}_N で表されます。

注意 7.6(境界条件つきの微分行列の固有値(文献))

D~N(2)\tilde D^{(2)}_N の固有値はすべて負の実数で、絶対値が最大のものは N→∞N \to \infty で約 0.048 N40.048\,N^4 のように増えます(Gottlieb–Lustman の定理と Weideman–Trefethen の解析。参考文献 [6])。この証明は多項式の零点についての議論を要するので、この章では下の数値で確かめるにとどめます。4 の下界 ∥DN2∥∞≥N2(N2−1)/3\|D_N^2\|_\infty \ge N^2(N^2-1)/3 は、この増え方がノルムの段階ですでに現れていることを示します。上からの評価 max⁡[−1,1]∣p′∣≤N2max⁡[−1,1]∣p∣\max_{[-1,1]}|p'| \le N^2\max_{[-1,1]}|p|(pp は NN 次以下の多項式)は Markov の不等式で、Cheney の教科書(参考文献 [5])に証明があります。対角成分の閉じた形((DN)00=(2N2+1)/6(D_N)_{00} = (2N^2+1)/6 など)は Trefethen の教科書の第 6 章にあります。

したがって、熱方程式を Chebyshev 選点法と陽的な時間積分で解くと、刻み幅は Δt=O(N−4)\Delta t = O(N^{-4}) に制限されます。1 階の方程式(移流・波動)では O(N−2)O(N^{-2}) です。Fourier の場合(O(N−2)O(N^{-2})・O(N−1)O(N^{-1}))より厳しいのは、3 のとおり端の点の間隔が O(N−2)O(N^{-2}) だからで、最も細かい格子幅についての CFL 条件に当たります。陰的な方法か、端の密集を緩める変数変換を使うのが普通です。

例 7.7(Chebyshev 選点法による境界値問題)

u′′=e4xu'' = e^{4x}、u(±1)=0u(\pm1) = 0 の解は u(x)=(e4x−xsinh⁡4−cosh⁡4)/16u(x) = (e^{4x} - x\sinh4 - \cosh4)/16 です。uu は整関数なので、定理 7.4 から補間の誤差はどんな rr についても O(r−N)O(r^{-N}) です。選点法の方程式 D~N(2)u=(e4xj)j=1N−1\tilde D^{(2)}_N\boldsymbol{u} = (e^{4x_j})_{j=1}^{N-1} を解き、あわせて D~N(2)\tilde D^{(2)}_N のスペクトル半径と ∥DN∥∞\|D_N\|_\infty を調べます。

# Python 3.9.6 / NumPy 2.0.2
import numpy as np
def cheb(N):
"""Chebyshev–Gauss–Lobatto 点 x_j = cos(jπ/N) と微分行列 D((N+1) 次)。"""
j = np.arange(N + 1)
x = np.cos(np.pi * j / N)
c = np.where((j == 0) | (j == N), 2.0, 1.0) * (-1.0) ** j
dx = x[:, None] - x[None, :] + np.eye(N + 1) # 対角は仮に 1
D = (c[:, None] / c[None, :]) / dx
D -= np.diag(D.sum(axis=1)) # 対角成分は行和が 0 になるように決める
return D, x
exact = lambda x: (np.exp(4 * x) - x * np.sinh(4.0) - np.cosh(4.0)) / 16
print(" N max error rho(D2_interior) rho / N^4 ||D||_inf / N^2")
for N in [4, 8, 12, 16, 20, 24, 32, 48, 64]:
D, x = cheb(N)
D2 = (D @ D)[1:N, 1:N] # 両端の行と列を除く(u(±1) = 0)
u = np.linalg.solve(D2, np.exp(4 * x[1:N]))
err = np.max(np.abs(u - exact(x[1:N])))
rho = np.max(np.abs(np.linalg.eigvals(D2)))
print(f"{N:4d} {err:.3e} {rho:.6e} {rho / N**4:.5f} "
f"{np.max(np.sum(np.abs(D), axis=1)) / N**2:.4f}")
N max error rho(D2_interior) rho / N^4 ||D||_inf / N^2
4 1.039e-01 1.954400e+01 0.07634 1.0000
8 2.162e-04 2.143723e+02 0.05234 1.0000
12 1.067e-07 1.023326e+03 0.04935 1.0000
16 1.935e-11 3.174792e+03 0.04844 1.0000
20 2.887e-15 7.687117e+03 0.04804 1.0000
24 7.994e-15 1.586978e+04 0.04783 1.0000
32 3.508e-14 4.993925e+04 0.04763 1.0000
48 5.551e-14 2.520431e+05 0.04748 1.0000
64 1.814e-13 7.957304e+05 0.04743 1.0000

誤差は N=20N = 20 で丸めの大きさに達します(N=16N = 16 で 2×10−112\times10^{-11})。それ以降は、行列の条件数が N4N^4 で増えるため、丸め誤差の寄与が少しずつ大きくなります。スペクトル半径は 0.047 N40.047\,N^4 程度で、注意 7.6 の値と合います。∥DN∥∞/N2\|D_N\|_\infty/N^2 は表示の桁で 1 で、命題 7.5 の 4 の下界 N2N^2 がこの範囲では等号に近いことが分かります。

例 7.8(調和振動子の固有値)

−u′′+y2u=Eu-u'' + y^2u = Eu(y∈Ry \in \mathbb{R})の固有値は E=1,3,5,…E = 1, 3, 5, \ldots です。区間 [−L,L][-L, L](L=8L = 8)に切って両端で u=0u = 0 とし、y=Lxy = Lx の変数変換で Chebyshev 選点法を使うと、行列 −D~N(2)/L2+diag(L2xj2)-\tilde D^{(2)}_N/L^2 + \mathrm{diag}(L^2x_j^2) の固有値が近似を与えます(例 7.7 の cheb を使い、np.linalg.eigvals で固有値を求めました)。

NNE1E_1E2E_2E3E_3E4E_4
160.90546141457993.53352475198474.317226562991810.8740876566453
240.99879549055843.01485420220364.88582225585427.3416780603733
320.99999728252153.00006358167534.99917720193607.0053199034813
480.99999999999983.00000000001014.99999999974567.0000000039444
641.00000000000003.00000000000005.00000000000007.0000000000000

固有関数 e−y2/2×e^{-y^2/2}\times(多項式)は整関数なので、収束は指数的です。N=16N = 16 では点が足りず、近似固有値は真の値の上にも下にもずれています。選点法は Galerkin 法ではないので、近似固有値が上界になる保証(Rayleigh–Ritz の上界)はありません。区間を切ったことによる誤差は e−L2e^{-L^2} 程度で、この表では見えません(切断の誤差は固有値問題の離散化で評価します)。無限区間を切らずに扱うには、Hermite 関数を基底にとる方法があります(Boyd の教科書の第 17 章)。

スペクトル法の高い精度は、解が滑らかであることに依存します。不連続があると、誤差は不連続点の近くだけでなく区間全体で大きくなります。

命題 8.1(不連続な関数の Fourier 切断)✓

f(θ)=sgn θf(\theta) = \mathrm{sgn}\,\theta(−π<θ<π-\pi \lt \theta \lt \pi)とし、Snf=∑∣k∣≤nf^(k)ekS_nf = \sum_{|k|\le n}\hat f(k)e_k を部分和とする。

  1. sup⁡θ∣f(θ)−Snf(θ)∣\sup_\theta|f(\theta) - S_nf(\theta)| は n→∞n \to \infty で 0 に収束しない。
  2. すべての n≥0n \ge 0 で ∥f−Snf∥2≥4π2(n+2)\|f - S_nf\|^2 \ge \dfrac{4}{\pi^2(n+2)}。
  3. 不連続点から離れた点 θ=π/2\theta = \pi/2 で、すべての m≥0m \ge 0 について ∣f(π/2)−S2m+1f(π/2)∣≥2π(2m+5)\bigl|f(\pi/2) - S_{2m+1}f(\pi/2)\bigr| \ge \dfrac{2}{\pi(2m+5)}。
証明(命題 8.1)
  1. 定理 6.1[フーリエ級数] から S2m+1f(π/(2m+2))→2π∫0πsin⁡uudu≈1.179S_{2m+1}f(\pi/(2m+2)) \to \frac2\pi\int_0^\pi\frac{\sin u}{u}du \approx 1.179 で、f(π/(2m+2))=1f(\pi/(2m+2)) = 1 なので、十分大きい mm で sup⁡θ∣f−S2m+1f∣>0.17\sup_\theta|f - S_{2m+1}f| \gt 0.17 です。f^(k)\hat f(k) は偶数の kk で 0 なので(下の 2 の計算)S2m+2f=S2m+1fS_{2m+2}f = S_{2m+1}f で、偶数の nn でも同じです。

  2. f^(k)=12π∫−ππsgn θ e−ikθdθ=−iπ∫0πsin⁡kθ dθ=−i(1−cos⁡kπ)πk\hat f(k) = \frac1{2\pi}\int_{-\pi}^{\pi}\mathrm{sgn}\,\theta\,e^{-ik\theta}d\theta = -\frac{i}{\pi}\int_0^\pi\sin k\theta\,d\theta = -\frac{i(1 - \cos k\pi)}{\pi k} なので、kk が奇数のとき ∣f^(k)∣2=4/(π2k2)|\hat f(k)|^2 = 4/(\pi^2k^2)、偶数のとき 0 です。Parseval の等式から ∥f−Snf∥2=8π2∑k>n, k 奇数k−2\|f - S_nf\|^2 = \frac{8}{\pi^2}\sum_{k \gt n,\ k\text{ 奇数}}k^{-2} です。nn より大きい最小の奇数を aa とすると a≤n+2a \le n + 2 で、t↦(a+2t)−2t \mapsto (a + 2t)^{-2} は減少するので

∑j≥01(a+2j)2≥∫0∞dt(a+2t)2=12a≥12(n+2)\sum_{j\ge0}\frac1{(a+2j)^2} \ge \int_0^\infty\frac{dt}{(a+2t)^2} = \frac1{2a} \ge \frac1{2(n+2)}

です。

  1. 定理 6.1[フーリエ級数] の式から S2m+1f(π/2)=4π∑k=0m(−1)k2k+1S_{2m+1}f(\pi/2) = \frac4\pi\sum_{k=0}^{m}\frac{(-1)^k}{2k+1} です。ff は π/2\pi/2 の近くで定数なので、定理 3.4[フーリエ級数] から Snf(π/2)→f(π/2)=1S_nf(\pi/2) \to f(\pi/2) = 1 です。したがって
f(π/2)−S2m+1f(π/2)=4π∑k>m(−1)k2k+1=4π(−1)m+1∑j≥0(12m+3+4j−12m+5+4j)f(\pi/2) - S_{2m+1}f(\pi/2) = \frac4\pi\sum_{k \gt m}\frac{(-1)^k}{2k+1} = \frac4\pi(-1)^{m+1}\sum_{j\ge0}\Bigl(\frac1{2m+3+4j} - \frac1{2m+5+4j}\Bigr)

です(収束する級数の隣り合う 2 項をまとめた)。各項は 2(2m+3+4j)(2m+5+4j)≥2(2m+5+4j)2\frac{2}{(2m+3+4j)(2m+5+4j)} \ge \frac{2}{(2m+5+4j)^2} で、2 と同じく積分と比べると ∑j≥02(a+4j)2≥2∫0∞dt(a+4t)2=12a\sum_{j\ge0}\frac{2}{(a+4j)^2} \ge 2\int_0^\infty\frac{dt}{(a+4t)^2} = \frac1{2a}(a=2m+5a = 2m+5)です。よって絶対値は 4π⋅12(2m+5)\frac4\pi\cdot\frac1{2(2m+5)} 以上です。

3 が差分法との違いです。差分法では、不連続の影響は(線形で安定なスキームなら)不連続点の近くにとどまります。スペクトル法では、どの点の近似にもすべての点の値を使うので、1 か所の不連続が区間全体の誤差を O(1/N)O(1/N) にします。周期的でない滑らかな関数(たとえば [0,2π][0, 2\pi] 上の xx)を Fourier 級数で近似しようとした場合も、周期的に延長すると端で跳ぶので、同じことが起こります。これが、周期的でない問題に Chebyshev 多項式を使う理由です。

注意 8.2(この章で扱わなかったこと)

区間を要素に分けて各要素で高次の多項式を使うスペクトル要素法、Legendre 多項式による Galerkin 法とその安定性、不連続のある解に対するフィルタや Gegenbauer 再構成、非線形の方程式で折り返しが引き起こす不安定性の理論は、Canuto・Hussaini・Quarteroni・Zang の教科書(参考文献 [2])と Gottlieb–Orszag のモノグラフ(参考文献 [4])にあります。折り返しの除去は Orszag の 1971 年の論文(参考文献 [7])が出発点です。

演習 9.1易

N=5N = 5(K=2K = 2)とする。3∗3^{*} を求め、sin⁡3x\sin 3x と −sin⁡2x-\sin 2x が 5 個の格子点 xj=2πj/5x_j = 2\pi j/5 で一致することを確かめよ。また ∥e3−I5e3∥\|e_3 - I_5e_3\| を求めよ。

解答

3≡−2(mod5)3 \equiv -2 \pmod 5 で ∣−2∣≤2|-2| \le 2 なので 3∗=−23^{*} = -2。3xj=−2xj+5xj=−2xj+2πj3x_j = -2x_j + 5x_j = -2x_j + 2\pi j なので sin⁡3xj=sin⁡(−2xj)=−sin⁡2xj\sin 3x_j = \sin(-2x_j) = -\sin 2x_j です。補題 3.3 から I5e3=e−2I_5e_3 = e_{-2} で、e3e_3 と e−2e_{-2} は直交する単位ベクトルなので ∥e3−e−2∥2=1+1=2\|e_3 - e_{-2}\|^2 = 1 + 1 = 2、∥e3−I5e3∥=2\|e_3 - I_5e_3\| = \sqrt2 です。補間が e3e_3 を「捨てる」のではなく、別の波数に置き換えていることが、切断の誤差(∥e3−P5e3∥=1\|e_3 - P_5e_3\| = 1)より大きい値に表れています。

演習 9.2標準

uu を連続な周期関数で ∑n∣u^(n)∣<∞\sum_n|\hat u(n)| \lt \infty を満たすものとする。台形則 TN(u)=2πN∑j=0N−1u(xj)T_N(u) = \frac{2\pi}{N}\sum_{j=0}^{N-1}u(x_j) と積分 I(u)=∫02πu dxI(u) = \int_0^{2\pi}u\,dx について、TN(u)−I(u)=2π∑m≠0u^(mN)T_N(u) - I(u) = 2\pi\sum_{m\ne0}\hat u(mN) を折り返しの公式から導け。

解答

定義から TN(u)=2πu~0T_N(u) = 2\pi\tilde u_0、I(u)=2πu^(0)I(u) = 2\pi\hat u(0) です。補題 3.3(k=0k = 0)から u~0=∑mu^(mN)\tilde u_0 = \sum_m\hat u(mN) なので、TN(u)−I(u)=2π(u~0−u^(0))=2π∑m≠0u^(mN)T_N(u) - I(u) = 2\pi(\tilde u_0 - \hat u(0)) = 2\pi\sum_{m\ne0}\hat u(mN) です。これは 定理 3.2[数値積分 II] の 2 の等式で、台形則の誤差は「波数 mNmN の成分が波数 0 に折り返された分」です。uu が帯状領域で正則なら各項が Me−b∣m∣NMe^{-b|m|N} 以下なので、誤差は O(e−bN)O(e^{-bN}) になります。補間の誤差 O(e−bN/2)O(e^{-bN/2}) より指数が 2 倍よいのは、補間では波数 K≈N/2K \approx N/2 のすぐ外の成分が効くのに対し、積分では波数 NN 以上の成分しか効かないからです。

演習 9.3標準

N=2K+1N = 2K+1、K≥1K \ge 1 とする。半離散の移流方程式 v′=−Dv\boldsymbol{v}' = -D\boldsymbol{v} に陽的 Euler 法 vn+1=(I−ΔtD)vn\boldsymbol{v}^{n+1} = (I - \Delta tD)\boldsymbol{v}^n を使うと、どんな Δt>0\Delta t \gt 0 でも ∥(I−ΔtD)n∥2→∞\|(I - \Delta tD)^n\|_2 \to \infty(n→∞n \to \infty)となることを示せ。また、T=nΔtT = n\Delta t を固定して Δt→0\Delta t \to 0 とするとき ∥(I−ΔtD)n∥2\|(I - \Delta tD)^n\|_2 が有界にとどまるための、Δt\Delta t と KK の関係を求めよ。

解答

命題 5.2 の 3 から、I−ΔtDI - \Delta tD は正規直交な固有ベクトル vk/N\boldsymbol{v}_k/\sqrt N と固有値 1−ikΔt1 - ik\Delta t をもつので、∥(I−ΔtD)n∥2=max⁡∣k∣≤K∣1−ikΔt∣n=(1+K2Δt2)n/2\|(I - \Delta tD)^n\|_2 = \max_{|k|\le K}|1 - ik\Delta t|^n = (1 + K^2\Delta t^2)^{n/2} です。K≥1K \ge 1、Δt>0\Delta t \gt 0 なら底が 1 より大きいので発散します。n=T/Δtn = T/\Delta t のとき (1+K2Δt2)T/(2Δt)≤eTK2Δt/2(1 + K^2\Delta t^2)^{T/(2\Delta t)} \le e^{TK^2\Delta t/2} で、また K2Δt→∞K^2\Delta t \to \infty なら左辺は発散するので(y=K2Δt2≤1y = K^2\Delta t^2 \le 1 のときは log⁡(1+y)≥y/2\log(1 + y) \ge y/2 から左辺は eTK2Δt/4e^{TK^2\Delta t/4} 以上、y>1y \gt 1 のときは 2T/(2Δt)2^{T/(2\Delta t)} 以上)、有界であるための条件は K2ΔtK^2\Delta t が有界、すなわち Δt=O(N−2)\Delta t = O(N^{-2}) です。純虚数の固有値をもつ問題に陽的 Euler 法を使うと、1 階の方程式でも放物型と同じ厳しさの刻み幅が要ります。例 6.8 の 4 次 Runge–Kutta 法では、安定領域が虚軸の区間 ∣y∣≤22|y| \le 2\sqrt2 を含むので Δt≤22/K\Delta t \le 2\sqrt2/K で済みます。

演習 9.4難

N≥1N \ge 1 とする。TN+1T_{N+1} の Chebyshev 補間 pNp_N を求め、誤差が TN+1(x)−pN(x)=−2N(1−x2)TN′(x)T_{N+1}(x) - p_N(x) = -\frac2N(1 - x^2)T_N'(x) と書けることを示せ。これを補間誤差の公式(定理 4.1[多項式補間])と比べよ。

解答

補題 7.2 で k=N+1k = N + 1 とします。N≥2N \ge 2 なら r=N+1>Nr = N + 1 \gt N なので k♯=2N−(N+1)=N−1k^{\sharp} = 2N - (N+1) = N - 1、N=1N = 1 なら r=0r = 0 で k♯=0=N−1k^{\sharp} = 0 = N - 1。どちらも pN=TN−1p_N = T_{N-1} です。x=cos⁡θx = \cos\theta とすると

TN+1(x)−TN−1(x)=cos⁡(N+1)θ−cos⁡(N−1)θ=−2sin⁡Nθ sin⁡θT_{N+1}(x) - T_{N-1}(x) = \cos(N+1)\theta - \cos(N-1)\theta = -2\sin N\theta\,\sin\theta

で、補題 7.3 から sin⁡Nθsin⁡θ=sin⁡2θ⋅TN′(cos⁡θ)/N=(1−x2)TN′(x)/N\sin N\theta\sin\theta = \sin^2\theta\cdot T_N'(\cos\theta)/N = (1 - x^2)T_N'(x)/N です。

補間誤差の公式は u−pN=u(N+1)(ξ)(N+1)!∏j=0N(x−xj)u - p_N = \frac{u^{(N+1)}(\xi)}{(N+1)!}\prod_{j=0}^{N}(x - x_j) です。u=TN+1u = T_{N+1} では u(N+1)=2N(N+1)!u^{(N+1)} = 2^N(N+1)!(最高次の係数が 2N2^N)なので、誤差は 2N∏j(x−xj)2^N\prod_j(x - x_j) です。一方 ω(x)=(1−x2)TN′(x)\omega(x) = (1 - x^2)T_N'(x) は x0,…,xNx_0, \ldots, x_N を零点にもち、最高次の係数は −N⋅2N−1-N\cdot2^{N-1} なので ∏j(x−xj)=−ω(x)/(N2N−1)\prod_j(x - x_j) = -\omega(x)/(N2^{N-1})、よって誤差は −2ω(x)/N-2\omega(x)/N で、上の結果と一致します。max⁡[−1,1]∣∏j(x−xj)∣=max⁡∣2sin⁡Nθsin⁡θ∣/2N≤21−N\max_{[-1,1]}|\prod_j(x - x_j)| = \max|2\sin N\theta\sin\theta|/2^N \le 2^{1-N} で、Chebyshev 点の節点多項式の最大値 2−N2^{-N}(定理 6.2[多項式補間])の 2 倍以内です。端点を補間点に含めても、節点多項式の大きさはほとんど変わりません。

  1. L. N. Trefethen, Spectral Methods in MATLAB, SIAM, 2000 — 第 3 章(周期格子と FFT)、第 4 章(滑らかさとスペクトル精度)、第 6 章(Chebyshev 微分行列)。
  2. C. Canuto, M. Y. Hussaini, A. Quarteroni, T. A. Zang, Spectral Methods: Fundamentals in Single Domains, Springer, 2006 — Fourier・Chebyshev 近似の誤差評価と、Galerkin 法・選点法の解析。
  3. J. P. Boyd, Chebyshev and Fourier Spectral Methods, 2nd ed., Dover, 2001 — 折り返しと 3/2 則、無限区間の基底。
  4. D. Gottlieb, S. A. Orszag, Numerical Analysis of Spectral Methods: Theory and Applications, SIAM, 1977.
  5. E. W. Cheney, Introduction to Approximation Theory, 2nd ed., AMS Chelsea, 1982 — Markov の不等式。
  6. J. A. C. Weideman, L. N. Trefethen, “The eigenvalues of second-order spectral differentiation matrices”, SIAM Journal on Numerical Analysis 25 (1988), 1279–1298.
  7. S. A. Orszag, “On the elimination of aliasing in finite-difference schemes by filtering high-wavenumber components”, Journal of the Atmospheric Sciences 28 (1971), 1074.

このテーマの 100 本ノック(50 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。