# 有限要素法 I：Galerkin 近似・Céa の補題・1 次元の誤差評価

> 変分問題を有限次元部分空間で解く Galerkin 近似について、適切性・Galerkin 直交性・Céa の補題を証明し、1 次元の区分 1 次要素で補間誤差、エネルギーノルムと L² ノルムの誤差評価（双対論法）、節点での厳密性、剛性行列の条件数を導く。
> https://rikai.mugen-giken.com/computer-science/pde-discretization/finite-element-galerkin

## 0. この記事の要点

曲がった形の物体の熱の伝わり方や、橋の部材のたわみを計算機で求めるとき、答えの関数をそのまま扱うことはできません。そこで答えを「折れ線のような単純な関数のつなぎ合わせ」で近似し、その係数だけを連立一次方程式で求めます。この記事は、その近似がどれだけ正しいか（細かく刻むと誤差がどう小さくなるか）を、1 次元の問題で最後まで確かめます。読み終えると、有限要素法の誤差が刻み幅 $h$ のどんな冪で減るか、その理由を説明できるようになります。

- 変分問題「すべての $v \in V$ で $a(u,v) = f(v)$」を、有限次元の部分空間 $V_h \subset V$ の上で同じ式のまま解くのが **Galerkin 近似**です。$a$ が有界で強圧的なら、近似解 $u_h$ はただ 1 つ存在し、$h$ によらず $\|u_h\| \le \|f\|/\alpha$ です（安定性）。
- 誤差は $V_h$ のすべての元と「直交」します（**Galerkin 直交性** $a(u - u_h, v_h) = 0$）。ここから **Céa の補題** $\|u - u_h\| \le \frac{M}{\alpha}\inf_{v_h}\|u - v_h\|$ が出て、誤差評価が「$V_h$ で $u$ をどれだけ近似できるか」という近似論の問題に帰着します。
- 1 次元の区分 1 次要素では、節点補間の誤差が $\|(u - I_hu)'\| \le \frac{h}{\pi}\|u''\|$、$\|u - I_hu\| \le \frac{h^2}{\pi^2}\|u''\|$ です。したがって有限要素解の誤差は $H^1$ で $O(h)$ です。
- $L^2$ での誤差は、双対問題を使う **Aubin–Nitsche の論法**で $O(h^2)$ に上がります。$-u'' = f$ では、有限要素解は節点で厳密解に一致します。
- 等間隔の分割では、剛性行列は 3 点差分の行列の $h$ 倍です。剛性行列の[条件数](/mathematics/numerical-linear-algebra/norms-and-conditioning#def-condition-number)（連立方程式の解きにくさの目安）は $O(h^{-2})$、質量行列の条件数は $O(1)$ です。

<Aside type="tip" title="この記事で使う事前知識">

- **弱解**: 微分方程式に試験関数を掛けて積分した形（弱形式）を満たす解のこと。→ [弱解](/mathematics/pde/elliptic-weak-solutions#def-weak-solution)
- **Lax–Milgram の定理**: 有界で強圧的な双線形形式の変分問題には、解がただ 1 つ存在するという定理。→ [楕円型方程式の弱解と変分法](/mathematics/pde/elliptic-weak-solutions)
- **Hilbert 空間**: 内積をもち、ノルムについて完備な空間のこと。→ [Hilbert 空間](/mathematics/functional-analysis/hilbert-spaces#def-hilbert-space)
- **直交射影**: ある元から閉部分空間の中で最も近い点を選ぶ操作。→ [直交射影](/mathematics/functional-analysis/hilbert-spaces#def-orthogonal-projection)
- **有界線形汎関数**: 関数 1 つに数を 1 つ対応させる線形な対応で、大きさが抑えられているもの。→ [有界線形汎関数](/mathematics/functional-analysis/hilbert-spaces#def-bounded-linear-functional)
- **差分法の整合性**: 離散の式に厳密解を代入したとき、残る誤差が小さいという性質。→ [整合性](/computer-science/pde-discretization/finite-difference-convergence#def-consistency)

</Aside>

## 1. 動機

差分法は、微分方程式の導関数を差分商に置き換えました。前章の収束定理は解が $C^4$ 級であることを仮定し、格子は座標軸に沿っていました。領域の形が複雑なとき、係数が不連続なとき、解が滑らかでないときには、どちらも不都合です。

有限要素法は、方程式ではなく解のほうを近似します。$-u'' = f$、$u(0) = u(1) = 0$ に試験関数 $v$ を掛けて部分積分すると
$$
\int_0^1u'v'\,dx = \int_0^1fv\,dx\qquad(v(0) = v(1) = 0)
$$
となります。これが弱形式（変分問題）で、$u$ に 1 階の導関数しか要求しません。ここで $u$ と $v$ を「折れ線」に限れば、有限個の未知数（節点での値）の連立一次方程式になります。

この方法の利点は、誤差解析の構造が単純なことです。差分法での「[整合性](/computer-science/pde-discretization/finite-difference-convergence#def-consistency) + 安定性 $\Rightarrow$ 収束」は、有限要素法では「近似性 + 強圧性 $\Rightarrow$ 収束」になります。安定性は連続の問題の強圧性からそのまま受け継がれ（部分空間に制限しても強圧性は壊れない）、整合性にあたるものは「部分空間が解をどれだけよく近似できるか」です。しかも Céa の補題は、有限要素解が部分空間の中の最良近似と定数倍しか違わないことを保証します。

この章では、まず抽象的な Hilbert 空間で枠組みを作り、次に 1 次元の区分 1 次要素で誤差解析を最後まで行います。弱解の一般論（Sobolev 空間、Lax–Milgram の定理、存在と一意性）は [楕円型方程式の弱解](/mathematics/pde/elliptic-weak-solutions) にあります。2 次元の三角形要素は次章で扱います。

## 2. 変分問題と Galerkin 近似

<Definition id="def-variational-problem" title="有界で強圧的な双線形形式と変分問題">
$V$ を実 Hilbert 空間（ノルム $\|\cdot\|_V$）とする。双線形形式 $a : V \times V \to \mathbb{R}$ が、定数 $M, \alpha > 0$ について
$$
|a(u,v)| \le M\|u\|_V\|v\|_V,\qquad a(v,v) \ge \alpha\|v\|_V^2\qquad(u, v \in V)
$$
を満たすとき、$a$ は**有界**で**強圧的**であるという。有界線形汎関数 $f \in V^{*}$ に対し
$$
u \in V,\qquad a(u,v) = f(v)\quad(\text{すべての}\ v \in V)
$$
を**変分問題**という。$a$ が対称（$a(u,v) = a(v,u)$）のとき、$\|v\|_a = a(v,v)^{1/2}$ を**エネルギーノルム**という。
</Definition>

Lax–Milgram の定理（<Ref to="mathematics/pde/elliptic-weak-solutions#thm-lax-milgram" />）から、変分問題の解 $u$ はただ 1 つ存在し、$\|u\|_V \le \|f\|_{V^{*}}/\alpha$ です。$a$ が対称なら、$a(\cdot,\cdot)$ は $V$ の内積で、$\alpha\|v\|_V^2 \le \|v\|_a^2 \le M\|v\|_V^2$ からエネルギーノルムは $\|\cdot\|_V$ と同値です。

<Definition id="def-galerkin" title="Galerkin 近似と Ritz 射影">
$V_h \subset V$ を有限次元の部分空間とする。
$$
u_h \in V_h,\qquad a(u_h, v_h) = f(v_h)\quad(\text{すべての}\ v_h \in V_h)
$$
を満たす $u_h$ を変分問題の **Galerkin 近似**という。$w \in V$ に対し、$a(R_hw - w, v_h) = 0$（すべての $v_h \in V_h$）を満たす $R_hw \in V_h$ を $w$ の **Ritz 射影**という。$V_h$ の基底 $\varphi_1, \ldots, \varphi_n$ について
$$
K = \bigl(a(\varphi_j, \varphi_i)\bigr)_{i,j},\qquad \boldsymbol{b} = \bigl(f(\varphi_i)\bigr)_i
$$
を**剛性行列**、**荷重ベクトル**という。
</Definition>

Ritz 射影は、右辺を $v \mapsto a(w, v)$ に置き換えた問題を $V_h$ の中で解いた Galerkin 近似にあたります。あとの補題で、$u_h$ がちょうど $u$ の Ritz 射影であることを確かめます。

$u_h = \sum_jc_j\varphi_j$ と書くと、Galerkin 近似の式は $v_h = \varphi_i$（$i = 1, \ldots, n$）で確かめれば十分で、連立一次方程式 $K\boldsymbol{c} = \boldsymbol{b}$ になります。添字 $h$ は部分空間の細かさを表すパラメータで、次節で分割の幅になります。

<Theorem id="thm-galerkin-wellposed" title="Galerkin 近似の適切性">
$a$ が有界で強圧的ならば、任意の有限次元部分空間 $V_h \subset V$ と $f \in V^{*}$ について、Galerkin 近似 $u_h$ はただ 1 つ存在し
$$
\|u_h\|_V \le \frac{1}{\alpha}\|f\|_{V^{*}}
$$
を満たす。剛性行列 $K$ は正則で、$\boldsymbol{c} \ne \boldsymbol{0}$ なら $\boldsymbol{c}^{\mathsf{T}}K\boldsymbol{c} > 0$ である。$a$ が対称なら $K$ は正定値対称行列である。任意の $w \in V$ の Ritz 射影もただ 1 つ存在する。
</Theorem>

<Proof of="thm-galerkin-wellposed">
有限次元の部分空間は閉じているので、$V_h$ は $V$ の内積で Hilbert 空間です。$a$ を $V_h \times V_h$ に制限したものは、同じ定数 $M$、$\alpha$ で有界かつ強圧的です。$f$ の $V_h$ への制限 $f_h$ は有界線形汎関数で、$\|f_h\|_{V_h^{*}} = \sup_{v_h \ne 0}|f(v_h)|/\|v_h\|_V \le \|f\|_{V^{*}}$ です。<Ref to="mathematics/pde/elliptic-weak-solutions#thm-lax-milgram" /> を $V_h$ に適用すると、$u_h$ がただ 1 つ存在して $\|u_h\|_V \le \|f_h\|/\alpha \le \|f\|_{V^{*}}/\alpha$ です。

$\boldsymbol{c} \in \mathbb{R}^n$、$v = \sum_jc_j\varphi_j$ とすると、双線形性から $\boldsymbol{c}^{\mathsf{T}}K\boldsymbol{c} = \sum_{i,j}c_ia(\varphi_j, \varphi_i)c_j = a(v, v) \ge \alpha\|v\|_V^2$ です。基底の一次独立性から $\boldsymbol{c} \ne \boldsymbol{0}$ なら $v \ne 0$ で、$\boldsymbol{c}^{\mathsf{T}}K\boldsymbol{c} > 0$ です。特に $K\boldsymbol{c} = \boldsymbol{0}$ なら $\boldsymbol{c} = \boldsymbol{0}$ なので $K$ は正則です。$a$ が対称なら $K_{ij} = a(\varphi_j,\varphi_i) = a(\varphi_i,\varphi_j) = K_{ji}$ です。

Ritz 射影は、汎関数 $v \mapsto a(w, v)$（$|a(w,v)| \le M\|w\|_V\|v\|_V$ から有界）を右辺とする Galerkin 近似なので、ただ 1 つ存在します。
</Proof>

評価 $\|u_h\|_V \le \|f\|/\alpha$ が $V_h$ によらないことが、Galerkin 法の**安定性**です。差分法では安定性をスキームごとに確かめる必要がありましたが、ここでは連続の問題の強圧性から自動的に従います。

<Lemma id="lem-galerkin-orthogonality" title="Galerkin 直交性">
$u$ を変分問題の解、$u_h$ をその Galerkin 近似とすると、すべての $v_h \in V_h$ について $a(u - u_h, v_h) = 0$ である。すなわち $u_h = R_hu$ である。
</Lemma>

<Proof of="lem-galerkin-orthogonality">
$V_h \subset V$ なので、変分問題の式で $v = v_h$ とでき、$a(u, v_h) = f(v_h)$ です。Galerkin 近似の式 $a(u_h, v_h) = f(v_h)$ を引くと $a(u - u_h, v_h) = 0$ です。Ritz 射影の一意性（<Ref to="thm-galerkin-wellposed" />）から $u_h = R_hu$ です。
</Proof>

$V_h \subset V$（**適合性**）が効いています。差分法の言葉では、厳密解が離散の方程式を残差なしで満たす、ということで、整合性が最も強い形で成り立っています。

<Theorem id="thm-cea" title="Céa の補題">
$a$ が有界で強圧的ならば
$$
\|u - u_h\|_V \le \frac{M}{\alpha}\inf_{v_h \in V_h}\|u - v_h\|_V
$$
が成り立つ。$a$ が対称ならば、$u_h$ はエネルギーノルムでの最良近似
$$
\|u - u_h\|_a = \min_{v_h \in V_h}\|u - v_h\|_a
$$
で、$\|u - u_h\|_V \le \sqrt{\dfrac{M}{\alpha}}\displaystyle\inf_{v_h \in V_h}\|u - v_h\|_V$ である。
</Theorem>

この定理は、「有限要素解の誤差は、$V_h$ の中で $u$ に最も近い元との距離の定数倍で抑えられる」という主張です。証明の方針は、Galerkin 直交性が使えるのは $V_h$ の元を入れたときだけなので、$V_h$ の元 $u_h$ と任意の $v_h$ の差 $v_h - u_h$ も $V_h$ の元であることを使い、誤差 $u - u_h$ を $u - v_h$ の誤差に置き換えることです。

<Proof of="thm-cea">
$v_h \in V_h$ を任意にとります。$v_h - u_h \in V_h$ なので、<Ref to="lem-galerkin-orthogonality" /> から $a(u - u_h, v_h - u_h) = 0$ です。強圧性と有界性から
$$
\alpha\|u - u_h\|_V^2 \le a(u - u_h, u - u_h) = a(u - u_h, u - v_h) + a(u - u_h, v_h - u_h) = a(u - u_h, u - v_h) \le M\|u - u_h\|_V\|u - v_h\|_V
$$
です。$\|u - u_h\|_V \ne 0$ なら両辺を割って $\|u - u_h\|_V \le \frac{M}{\alpha}\|u - v_h\|_V$ で、$0$ なら自明です。$v_h$ について下限をとれば前半です。

$a$ が対称なら $a$ は内積で、同じ計算と Cauchy–Schwarz の不等式から $\|u - u_h\|_a^2 = a(u - u_h, u - v_h) \le \|u - u_h\|_a\|u - v_h\|_a$、すなわち $\|u - u_h\|_a \le \|u - v_h\|_a$ です。$v_h = u_h$ で等号なので最小です。ノルムの同値性から
$$
\alpha\|u - u_h\|_V^2 \le \|u - u_h\|_a^2 \le \|u - v_h\|_a^2 \le M\|u - v_h\|_V^2
$$
で、後半を得ます。
</Proof>

<Figure caption="a が対称なときの Céa の補題の図（内積 a で測った長さ）。V_h を水平な線、解 u をその上の点とすると、u_h は u から V_h へ下ろした垂線の足で、誤差 u − u_h は V_h に直交する（Galerkin 直交性）。V_h の他のどの元 v_h と比べても、u_h が u に最も近い。">
<svg viewBox="0 0 720 260" width="100%" role="img" aria-label="水平な線 V_h の上の点 u_h から垂直に立つ線の先に点 u があり、V_h 上の別の点 v_h と u を結ぶ斜めの線は垂線より長い。">
  <line x1="60" y1="200" x2="660" y2="200" stroke="currentColor" stroke-width="1.5" opacity="0.6" />
  <line x1="260" y1="200" x2="260" y2="50" stroke="var(--sl-color-accent)" stroke-width="2.2" />
  <line x1="260" y1="50" x2="500" y2="200" stroke="currentColor" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.7" />
  <polyline points="260,182 278,182 278,200" fill="none" stroke="currentColor" stroke-width="1.2" />
  <g fill="var(--sl-color-accent)">
    <circle cx="260" cy="200" r="4.5" /><circle cx="260" cy="50" r="4.5" />
  </g>
  <circle cx="500" cy="200" r="4.5" fill="currentColor" />
  <g fill="currentColor" font-size="14">
    <text x="640" y="226" text-anchor="end">V_h</text>
    <text x="260" y="226" text-anchor="middle">u_h（Galerkin 近似）</text>
    <text x="500" y="226" text-anchor="middle">v_h</text>
    <text x="260" y="38" text-anchor="middle">u（厳密解）</text>
    <text x="244" y="130" text-anchor="end">誤差 u − u_h</text>
    <text x="400" y="110" text-anchor="start">u − v_h</text>
  </g>
</svg>
</Figure>

対称な場合、$u_h$ は内積 $a$ についての $u$ の $V_h$ への直交射影です（<Ref to="mathematics/functional-analysis/hilbert-spaces#thm-projection" /> の最近点）。Céa の補題は、誤差評価を 2 つに分けます。方程式によるのは定数 $M/\alpha$ だけで、残りは「関数 $u$ を空間 $V_h$ の元でどれだけ近似できるか」という、方程式と無関係な問題です。

<Theorem id="thm-ritz-minimization" title="Ritz の最小化原理">
$a$ が対称、有界、強圧的とし、$J(v) = \frac12a(v,v) - f(v)$ とおく。

1. すべての $v \in V$ について $J(v) - J(u) = \frac12\|v - u\|_a^2$。したがって $u$ は $V$ 上で $J$ をただ 1 点で最小にする。
2. すべての $v_h \in V_h$ について $J(v_h) - J(u_h) = \frac12\|v_h - u_h\|_a^2$。したがって $u_h$ は $V_h$ 上で $J$ をただ 1 点で最小にする。
3. $J(u_h) - J(u) = \frac12\|u - u_h\|_a^2 \ge 0$。
</Theorem>

<Proof of="thm-ritz-minimization">
$W$ を $V$ または $V_h$、$z$ を $W$ での解（$a(z, w) = f(w)$、$w \in W$）とします。$v \in W$ について、対称性から $a(v,v) = a(v - z, v - z) + 2a(z, v - z) + a(z,z)$ なので
$$
J(v) - J(z) = \tfrac12a(v - z, v - z) + a(z, v - z) - f(v - z) = \tfrac12\|v - z\|_a^2
$$
です（$v - z \in W$ なので $a(z, v-z) = f(v-z)$）。$W = V$、$z = u$ で 1、$W = V_h$、$z = u_h$ で 2 です。$\|v - z\|_a = 0$ は $v = z$ のときに限るので最小点は一意です。3 は 1 で $v = u_h$ としたものです。
</Proof>

$J$ は物理ではポテンシャルエネルギーにあたります。$-\Delta u = f$ の場合の 1 が Dirichlet 原理（<Ref to="mathematics/pde/elliptic-weak-solutions#thm-dirichlet-principle" />）です。3 は、Galerkin 近似のエネルギー $J(u_h)$ が常に真の値より大きく、その差がちょうどエネルギーノルムの誤差の 2 乗の半分であることを示しています。

<Remark id="rem-petrov-galerkin" title="強圧的でない問題">
$a$ が強圧的でない問題（鞍点問題、Helmholtz 方程式など）や、試験関数の空間を解の空間と変える Petrov–Galerkin 法では、安定性は自動的には従いません。強圧性の代わりに inf-sup 条件 $\inf_{u_h}\sup_{v_h}\frac{a(u_h, v_h)}{\|u_h\|\|v_h\|} \ge \beta > 0$ を $V_h$ ごとに確かめる必要があります（Babuška の定理）。また、移流が拡散よりずっと強い問題 $-\varepsilon u'' + u' = f$ では、強圧性の定数 $\alpha = \varepsilon$ が小さく $M/\alpha$ が大きくなり、標準的な Galerkin 法の解は境界層の近くで振動します。等間隔の区分 1 次要素では移流項 $u'$ が中心差分 $(c_{i+1} - c_{i-1})/2$ になることが原因で、前々章の移流方程式で風上差分を使ったのと同じく、風上化にあたる安定化が要ります。Ern–Guermond（参考文献）がこれらを体系的に扱っています。
</Remark>

## 3. 1 次元のモデル問題と有限要素空間

区間 $(0,1)$ の上で、関数空間を具体的に定めます。$\|\cdot\|$ は $L^2(0,1)$ のノルム、$\langle\cdot,\cdot\rangle$ はその内積です。

<Definition id="def-sobolev-interval" title="区間上の H¹・H¹₀・H²">
$[0,1]$ 上の絶対連続な関数 $u$ で $u' \in L^2(0,1)$ となるものの全体を $H^1(0,1)$、そのうち $u(0) = u(1) = 0$ を満たすものの全体を $H^1_0(0,1)$ と書く。$C^1$ 級で $u'$ が絶対連続、$u'' \in L^2(0,1)$ となる関数の全体を $H^2(0,1)$ と書く。$H^1_0(0,1)$ には内積 $\langle u, v\rangle_V = \langle u', v'\rangle$ とノルム $\|u\|_V = \|u'\|$ を入れる。
</Definition>

絶対連続な関数はほとんどいたるところ微分可能で、$u(y) - u(x) = \int_x^yu'\,dt$ が成り立ちます（<Ref to="mathematics/real-analysis/radon-nikodym#thm-ftc-lebesgue" />）。この定義は、弱微分による定義（<Ref to="mathematics/fourier-analysis/sobolev-spaces#def-weak-derivative" />）と 1 次元では同じ空間を与えますが、以下の証明では上の具体的な定義だけを使います。

<Lemma id="lem-h10-interval" title="H¹₀(0,1) の基本性質">
1. $u, v \in H^1(0,1)$ なら $uv$ は絶対連続で、$\int_x^yu'v\,dt = \bigl[uv\bigr]_x^y - \int_x^yuv'\,dt$（部分積分）。
2. $u \in H^1_0(0,1)$ なら $\max|u| \le \|u'\|$、$\|u\| \le \frac{1}{\pi}\|u'\|$。
3. $H^1_0(0,1)$ は内積 $\langle u', v'\rangle$ について Hilbert 空間である。
</Lemma>

<Proof of="lem-h10-interval">
**1.** $u$、$v$ は連続なので有界で、$|u(y)v(y) - u(x)v(x)| \le \max|u|\,|v(y) - v(x)| + \max|v|\,|u(y) - u(x)|$ です。したがって、互いに交わらない区間の有限列についての和をとれば、$u$ と $v$ の絶対連続性から $uv$ の絶対連続性が従います。$u$ と $v$ が微分可能な点（ほとんどすべての点）で $(uv)' = u'v + uv'$ なので、<Ref to="mathematics/real-analysis/radon-nikodym#thm-ftc-lebesgue" /> から $[uv]_x^y = \int_x^y(u'v + uv')dt$ です。

**2.** $u(x) = \int_0^xu'\,dt$ と Cauchy–Schwarz の不等式から $|u(x)| \le \sqrt{x}\,\|u'\| \le \|u'\|$ です。後半は <Ref to="mathematics/computer-assisted-proofs/eigenvalue-enclosures#lem-element-poincare" /> を $a = 0$、$h = 1$ で使ったものです。

**3.** 内積であることは、$\|u'\| = 0$ なら 2 から $u = 0$ であることから分かります。完備性を示します。$(u_n)$ を Cauchy 列とすると、$(u_n')$ は $L^2(0,1)$ の Cauchy 列なので、ある $g \in L^2$ に収束します。$u(x) = \int_0^xg\,dt$ とおくと、$u$ は絶対連続で $u' = g$（a.e.）、$u(0) = 0$ です。$u(1) = \int_0^1g\,dt = \lim_n\int_0^1u_n'\,dt = \lim_n(u_n(1) - u_n(0)) = 0$ なので $u \in H^1_0(0,1)$ で、$\|u_n - u\|_V = \|u_n' - g\| \to 0$ です。
</Proof>

**モデル問題.** $p \in C^1[0,1]$、$q \in C[0,1]$、$p(x) \ge p_0 > 0$、$q(x) \ge 0$、$f \in L^2(0,1)$ とし、
$$
-(pu')' + qu = f\quad(0 < x < 1),\qquad u(0) = u(1) = 0
$$
を考えます。$V = H^1_0(0,1)$、
$$
a(u,v) = \int_0^1(pu'v' + quv)\,dx,\qquad f(v) = \int_0^1fv\,dx
$$
とおきます。$p_1 = \max p$、$q_1 = \max q$ とすると、<Ref to="lem-h10-interval" /> の 2 から
$$
|a(u,v)| \le p_1\|u'\|\|v'\| + q_1\|u\|\|v\| \le M\|u\|_V\|v\|_V,\quad M = p_1 + \frac{q_1}{\pi^2},\qquad a(v,v) \ge p_0\|v\|_V^2,\qquad|f(v)| \le \frac{\|f\|}{\pi}\|v\|_V
$$
なので、$a$ は対称、有界、強圧的（$\alpha = p_0$）で、$\|f\|_{V^{*}} \le \|f\|/\pi$ です。変分問題の解 $u \in V$ がモデル問題の**弱解**です（多次元の一般の定義は <Ref to="mathematics/pde/elliptic-weak-solutions#def-weak-solution" />、存在と一意性は <Ref to="mathematics/pde/elliptic-weak-solutions#thm-weak-existence" />）。

<Lemma id="lem-regularity-1d" title="1 次元の H² 正則性">
モデル問題の弱解 $u$ は $H^2(0,1)$ に属し、ほとんどいたるところ $-(pu')' + qu = f$ を満たす。さらに
$$
\|u'\| \le \frac{\|f\|}{\pi p_0},\qquad\|u''\| \le C_R\|f\|,\qquad C_R = \frac{1}{p_0}\Bigl(1 + \frac{q_1/\pi + \max|p'|}{\pi p_0}\Bigr)
$$
が成り立つ。$p = 1$、$q = 0$ のときは $u'' = -f$ で $\|u''\| = \|f\|$ である。
</Lemma>

この補題は、あとの誤差評価で必要な「$u''$ の大きさを右辺 $f$ で抑える」ための準備です。証明の方針は、弱形式から $pu' + G$ が定数になること（$G$ は $g$ の原始関数）を示し、そこから $u'$ が絶対連続で、方程式が各点で成り立つことを読み取ることです。定数になることは、試験関数 $v$ をうまく選んで二乗の積分を $0$ にして示します。

<Proof of="lem-regularity-1d">
$\|u'\| = \|u\|_V \le \|f\|_{V^{*}}/\alpha \le \|f\|/(\pi p_0)$ です。$g = f - qu \in L^2$、$G(x) = \int_0^xg\,dt$ とおくと、$G$ は絶対連続で $G' = g$（a.e.）です。弱形式は $\int_0^1pu'v'\,dx = \int_0^1gv\,dx$ で、<Ref to="lem-h10-interval" /> の 1 と $v(0) = v(1) = 0$ から $\int_0^1gv\,dx = -\int_0^1Gv'\,dx$ なので
$$
\int_0^1(pu' + G)v'\,dx = 0\qquad(\text{すべての}\ v \in V)
$$
です。$w = pu' + G \in L^2$、$c = \int_0^1w\,dx$ とし、$v(x) = \int_0^x(w - c)\,dt$ とおくと、$v$ は絶対連続で $v(0) = 0$、$v(1) = c - c = 0$、$v' = w - c \in L^2$ なので $v \in V$ です。この $v$ を代入すると
$$
0 = \int_0^1w(w - c)\,dx = \int_0^1(w - c)^2dx + c\int_0^1(w - c)\,dx = \int_0^1(w - c)^2dx
$$
で、$w = c$（a.e.）、すなわち $u' = (c - G)/p$（a.e.）です。右辺は連続なので、$u(x) = \int_0^xu'\,dt = \int_0^x\frac{c - G}{p}dt$ は $C^1$ 級で、すべての点で $u' = (c - G)/p$ です。$1/p$ は $C^1$ 級、$c - G$ は絶対連続なので、<Ref to="lem-h10-interval" /> の 1 と同じ議論で $u'$ は絶対連続です。$pu' = c - G$ を微分して $(pu')' = -g$（a.e.）、すなわち $-(pu')' + qu = f$ です。$u'' = -(g + p'u')/p$（a.e.）なので
$$
\|u''\| \le \frac{1}{p_0}\bigl(\|f\| + q_1\|u\| + \max|p'|\,\|u'\|\bigr) \le \frac{1}{p_0}\Bigl(1 + \frac{q_1/\pi + \max|p'|}{\pi p_0}\Bigr)\|f\|
$$
です（$\|u\| \le \|u'\|/\pi$ と $\|u'\|$ の評価を使いました）。$p = 1$、$q = 0$ なら $g = f$、$u'' = -f$ です。
</Proof>

多次元では、弱解が $H^2$ に属するかどうかは領域の形によります（次章）。1 次元では、方程式から直接 $u''$ が求まるので、常に成り立ちます。

<Definition id="def-fe-space-1d" title="1 次元の分割と有限要素空間">
$0 = x_0 < x_1 < \cdots < x_N = 1$ を $[0,1]$ の**分割**、$e_i = [x_{i-1}, x_i]$ を**要素**、$x_i$ を**節点**、$h_i = x_i - x_{i-1}$、$h = \max_ih_i$ とする。$k = 1, 2$ について
$$
V_h^k = \{v \in C[0,1] : v|_{e_i}\ \text{は}\ k\ \text{次以下の多項式}\ (1 \le i \le N),\ v(0) = v(1) = 0\}
$$
を**区分 $k$ 次の（連続な）有限要素空間**という。$V_h = V_h^1$ と書く。$\varphi_i \in V_h$（$1 \le i \le N-1$）を $\varphi_i(x_j) = \delta_{ij}$ で定め、**節点基底**（帽子関数）という。連続関数 $u$（$u(0) = u(1) = 0$）に対し
$$
I_hu = \sum_{i=1}^{N-1}u(x_i)\varphi_i
$$
を**節点補間**という。$V_h^2$ では、節点に各要素の中点を加えた点で同じように節点基底と補間 $I_h^{(2)}$ を定める。$G = (\langle\varphi_j, \varphi_i\rangle)_{i,j}$ を**質量行列**という（基底の Gram 行列。有界性の定数 $M$ と区別するため $G$ と書く）。定数 $\gamma \ge 1$ について $\min_ih_i \ge h/\gamma$ となる分割を（定数 $\gamma$ で）**準一様**という。
</Definition>

<Figure caption="区分 1 次の節点基底（帽子関数）と、関数 u の節点補間 I_h u。φ_i は節点 x_i で 1、他の節点で 0 で、隣り合う 2 つの要素の上でだけ 0 でない。このため剛性行列は三重対角になる。">
<svg viewBox="0 0 720 260" width="100%" role="img" aria-label="不等間隔の節点の上の帽子関数 3 つと、滑らかな曲線を節点で折れ線に置き換えた補間。">
  <g stroke="currentColor" stroke-width="1" opacity="0.5">
    <line x1="40" y1="220" x2="680" y2="220" />
  </g>
  <g stroke="currentColor" stroke-width="1" opacity="0.3" stroke-dasharray="3 4">
    <line x1="40" y1="220" x2="40" y2="40" /><line x1="150" y1="220" x2="150" y2="40" /><line x1="290" y1="220" x2="290" y2="40" /><line x1="400" y1="220" x2="400" y2="40" /><line x1="540" y1="220" x2="540" y2="40" /><line x1="680" y1="220" x2="680" y2="40" />
  </g>
  <g fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.7">
    <polyline points="40,220 150,120 290,220" />
    <polyline points="150,220 290,120 400,220" />
    <polyline points="400,220 540,120 680,220" />
  </g>
  <path d="M40,220 C90,120 120,70 150,62 C210,45 250,60 290,84 C330,108 370,150 400,160 C450,176 500,130 540,112 C600,90 650,170 680,220" fill="none" stroke="currentColor" stroke-width="1.2" opacity="0.6" />
  <polyline points="40,220 150,62 290,84 400,160 540,112 680,220" fill="none" stroke="var(--sl-color-accent)" stroke-width="2.2" />
  <g fill="var(--sl-color-accent)">
    <circle cx="150" cy="62" r="4" /><circle cx="290" cy="84" r="4" /><circle cx="400" cy="160" r="4" /><circle cx="540" cy="112" r="4" />
  </g>
  <g fill="currentColor" font-size="13">
    <text x="40" y="240" text-anchor="middle">x₀ = 0</text>
    <text x="150" y="240" text-anchor="middle">x₁</text>
    <text x="290" y="240" text-anchor="middle">x₂</text>
    <text x="400" y="240" text-anchor="middle">x₃</text>
    <text x="540" y="240" text-anchor="middle">x₄</text>
    <text x="680" y="240" text-anchor="middle">x₅ = 1</text>
    <text x="150" y="136" text-anchor="middle">φ₁</text>
    <text x="290" y="136" text-anchor="middle">φ₂</text>
    <text x="540" y="136" text-anchor="middle">φ₄</text>
    <text x="215" y="40" text-anchor="middle">u と I_h u</text>
  </g>
</svg>
</Figure>

区分的に多項式の連続関数は Lipschitz 連続なので絶対連続で、導関数は要素ごとの多項式の導関数（有界）です。したがって $V_h^k \subset H^1_0(0,1)$ で、Galerkin 近似の枠組みに入ります。$V_h$ の元は節点での値で決まるので $\dim V_h = N - 1$、$v_h = \sum_iv_h(x_i)\varphi_i$ です。

剛性行列・質量行列・荷重ベクトルは、要素ごとの積分の和として計算します。要素 $e_i$ の上で $0$ でない基底は $\varphi_{i-1}$ と $\varphi_i$ の 2 つだけなので、要素ごとに $2\times2$ の行列（**要素行列**）を作り、全体の行列の対応する位置に足し込みます。これを**組み立て**（アセンブリ）といいます。疎行列の格納形式（<Ref to="mathematics/numerical-linear-algebra/cholesky-and-sparse-direct#def-sparse-formats" />）のうち COO 形式は、同じ位置への重複した登録を足し合わせる約束にできるので、組み立てに向いています（§7 のコード）。

## 4. 補間誤差

Céa の補題の右辺 $\inf_{v_h}\|u - v_h\|_V$ を上から抑えるには、$V_h$ の元を 1 つ選んで誤差を評価すれば十分です。節点補間 $I_hu$ がその役をします。

<Theorem id="thm-p1-interpolation-1d" title="1 次元の節点補間の誤差">
任意の分割について次が成り立つ。

1. $u \in H^2(0,1)$、$u(0) = u(1) = 0$ ならば $\|(u - I_hu)'\| \le \dfrac{h}{\pi}\|u''\|$、$\|u - I_hu\| \le \Bigl(\dfrac{h}{\pi}\Bigr)^2\|u''\|$。
2. $u$ が $C^2$ 級で $u''$ が絶対連続、$u''' \in L^2(0,1)$、$u(0) = u(1) = 0$ ならば、区分 2 次の節点補間について $\|(u - I_h^{(2)}u)'\| \le h^2\|u'''\|$、$\|u - I_h^{(2)}u\| \le \dfrac{h^3}{2\pi}\|u'''\|$。
3. $k \ge 1$ とし、$u$ は $[0,1]$ を含む開区間で $C^{k+1}$ 級とする。各要素を $k$ 等分した $k+1$ 個の点での値を補間する区分 $k$ 次の連続関数を $I_h^{(k)}u$ とすると、$\max_{[0,1]}|u - I_h^{(k)}u| \le \dfrac{h^{k+1}}{(k+1)!}\max|u^{(k+1)}|$。
</Theorem>

1 の直感は次のとおりです。補間誤差 $w = u - I_hu$ は要素の両端で $0$ なので、短い要素の上では大きくなれません（Poincaré 不等式）。しかも $w'' = u''$ なので、$w$ の曲がり具合は $u''$ で決まります。この 2 点から、要素の長さ $\ell$ が小さいほど誤差が小さい、という評価が出ます。

<Proof of="thm-p1-interpolation-1d">
要素 $e = [x_{i-1}, x_i]$（長さ $\ell = h_i \le h$）の上で評価し、最後に要素について足します。$\|\cdot\|_e$ は $L^2(e)$ のノルムです。

**1.** $w = u - I_hu$ とおくと、$e$ の上で $w$ は $C^1$ 級、$w'$ は絶対連続で、$I_hu$ が 1 次式なので $w'' = u''$（a.e.）、また $w(x_{i-1}) = w(x_i) = 0$ です。<Ref to="mathematics/computer-assisted-proofs/eigenvalue-enclosures#lem-element-poincare" /> から
$$
\|w\|_e \le \frac{\ell}{\pi}\|w'\|_e
$$
です。次に $w'$ を評価します。<Ref to="lem-h10-interval" /> の 1 の部分積分（区間 $e$ で、$w$ と $w'$ に使う）と、両端で $w = 0$ であることから
$$
\|w'\|_e^2 = \int_ew'\cdot w'\,dx = \bigl[ww'\bigr]_{x_{i-1}}^{x_i} - \int_eww''\,dx = -\int_ewu''\,dx \le \|w\|_e\|u''\|_e \le \frac{\ell}{\pi}\|w'\|_e\|u''\|_e
$$
で、$\|w'\|_e \le \frac{\ell}{\pi}\|u''\|_e$ です。したがって $\|w\|_e \le (\frac{\ell}{\pi})^2\|u''\|_e$ です。$\ell \le h$ を使い、2 乗して要素について足すと、$\|w'\|^2 = \sum_e\|w'\|_e^2 \le (\frac{h}{\pi})^2\|u''\|^2$、同様に $\|w\|^2 \le (\frac{h}{\pi})^4\|u''\|^2$ です。

**2.** $w = u - I_h^{(2)}u$ は $e$ の両端と中点 $m$ の 3 点で $0$ です。長さ $\ell/2$ の 2 つの半区間のそれぞれに <Ref to="mathematics/computer-assisted-proofs/eigenvalue-enclosures#lem-element-poincare" /> を使って足すと $\|w\|_e \le \frac{\ell}{2\pi}\|w'\|_e$ です。$w$ は $e$ の上で $C^2$ 級なので、Rolle の定理から $w'(\xi_1) = w'(\xi_2) = 0$ となる $\xi_1 \in (x_{i-1}, m)$、$\xi_2 \in (m, x_i)$ があり、もう一度使って $w''(\eta) = 0$ となる $\eta \in (\xi_1, \xi_2)$ があります。$I_h^{(2)}u$ は $e$ の上で 2 次式なので $w''' = u'''$（a.e.）で、$w''(x) = \int_\eta^xu'''\,dt$ と Cauchy–Schwarz の不等式から $|w''(x)| \le \sqrt{\ell}\,\|u'''\|_e$、したがって $\|w''\|_e \le \ell\|u'''\|_e$ です。同じく $w'(x) = \int_{\xi_1}^xw''\,dt$ から $\|w'\|_e \le \ell\|w''\|_e \le \ell^2\|u'''\|_e$ です。要素について足せば主張を得ます。

**3.** 要素 $e$ の上で、$I_h^{(k)}u$ は $k+1$ 個の点 $y_0, \ldots, y_k \in e$ での $u$ の補間多項式です。<Ref to="mathematics/numerical-analysis/polynomial-interpolation#thm-interpolation-error" /> から、$x \in e$ について $u(x) - I_h^{(k)}u(x) = \frac{u^{(k+1)}(\xi)}{(k+1)!}\prod_j(x - y_j)$ で、$|x - y_j| \le \ell \le h$ なので主張を得ます。
</Proof>

1 の証明は、境界で $0$ の関数についての Poincaré 不等式を 2 回使っています。1 回目は $w$ に、2 回目は部分積分を通して $w'$ にです。定数 $\frac{h}{\pi}$ は、要素の上の $-d^2/dx^2$ の最小固有値 $(\pi/\ell)^2$ から来ています。証明は要素ごとなので、$u$ が全体では $H^2$ に属さなくても、各要素の上で $C^1$ 級かつ $u'$ が絶対連続で $u'' \in L^2$ ならば、同じ評価が成り立ちます（係数が不連続な問題で使います）。

次数は「$L^2$ ノルムで $h^{k+1}$、導関数で $h^k$」で、導関数を 1 回とるごとに $h$ の冪が 1 つ減ります。$k$ を上げれば次数は上がりますが、それに見合う滑らかさ（$u^{(k+1)}$）が要ります。

## 5. 有限要素解の誤差評価

<Theorem id="thm-fem-1d-energy-error" title="エネルギーノルムでの誤差">
モデル問題（$p \in C^1$、$p \ge p_0 > 0$、$q \ge 0$、$f \in L^2$）の弱解を $u$、区分 1 次の有限要素解を $u_h \in V_h$ とすると
$$
\|(u - u_h)'\| \le \sqrt{\frac{M}{p_0}}\,\frac{h}{\pi}\|u''\| \le \sqrt{\frac{M}{p_0}}\,\frac{C_R}{\pi}\,h\|f\|,\qquad\|u - u_h\|_{H^1} \le \sqrt{1 + \pi^{-2}}\,\|(u - u_h)'\|
$$
が成り立つ。ここで $\|w\|_{H^1}^2 = \|w\|^2 + \|w'\|^2$、$M = p_1 + q_1/\pi^2$、$C_R$ は <Ref to="lem-regularity-1d" /> の定数である。
</Theorem>

<Proof of="thm-fem-1d-energy-error">
<Ref to="lem-regularity-1d" /> から $u \in H^2(0,1)$、$\|u''\| \le C_R\|f\|$ です。$a$ は対称なので、<Ref to="thm-cea" /> の後半を $v_h = I_hu \in V_h$ で使い、<Ref to="thm-p1-interpolation-1d" /> の 1 を代入すると
$$
\|(u - u_h)'\| = \|u - u_h\|_V \le \sqrt{\frac{M}{p_0}}\|u - I_hu\|_V = \sqrt{\frac{M}{p_0}}\|(u - I_hu)'\| \le \sqrt{\frac{M}{p_0}}\,\frac{h}{\pi}\|u''\|
$$
です。$H^1$ ノルムについては、$u - u_h \in H^1_0(0,1)$ に <Ref to="lem-h10-interval" /> の 2 を使って $\|u - u_h\|^2 \le \pi^{-2}\|(u - u_h)'\|^2$ です。
</Proof>

この評価だけからは、$L^2$ ノルムの誤差も $O(h)$ としか言えません。しかし補間誤差は $L^2$ で $O(h^2)$ でした。有限要素解でも $O(h^2)$ になることを、次の論法で示します。

<Theorem id="thm-aubin-nitsche-1d" title="L² ノルムでの誤差（Aubin–Nitsche の双対論法）">
<Ref to="thm-fem-1d-energy-error" /> と同じ設定で
$$
\|u - u_h\| \le MC_R\,\frac{h}{\pi}\,\|(u - u_h)'\| \le MC_R\sqrt{\frac{M}{p_0}}\,\Bigl(\frac{h}{\pi}\Bigr)^2\|u''\|
$$
が成り立つ。
</Theorem>

誤差そのものを右辺にした双対問題を考える理由は、$\|e\|^2 = \langle e, e\rangle$ を $a(e, z)$ の形に書き直したいからです。そうすると Galerkin 直交性で $z$ を $z - I_hz$ に取り替えられ、補間誤差の評価が 1 回余分に使えます。

<Proof of="thm-aubin-nitsche-1d">
$e = u - u_h \in V$ とおきます。$e$ を右辺とする**双対問題**
$$
z \in V,\qquad a(v, z) = \langle e, v\rangle\quad(\text{すべての}\ v \in V)
$$
を考えます。$a$ は対称なので、これは右辺 $f = e \in L^2$ のモデル問題そのもので、<Ref to="lem-regularity-1d" /> から $z \in H^2(0,1)$、$\|z''\| \le C_R\|e\|$ です。$v = e$ とし、<Ref to="lem-galerkin-orthogonality" /> の $a(e, I_hz) = 0$（$I_hz \in V_h$）を使うと
$$
\|e\|^2 = a(e, z) = a(e, z - I_hz) \le M\|e'\|\,\|(z - I_hz)'\| \le M\|e'\|\,\frac{h}{\pi}\|z''\| \le MC_R\,\frac{h}{\pi}\,\|e'\|\,\|e\|
$$
です（<Ref to="thm-p1-interpolation-1d" /> の 1 を $z$ に使いました）。$\|e\|$ で割って最初の不等式、<Ref to="thm-fem-1d-energy-error" /> を代入して 2 番目の不等式を得ます。
</Proof>

双対論法の要点は、誤差 $e$ の $L^2$ ノルムを $a(e, z)$ と書き、Galerkin 直交性で $z$ を $z - I_hz$ に置き換えて、$h$ をもう 1 つ稼ぐことです。そのためには、双対問題の解が $H^2$ に属して $\|z''\| \le C_R\|e\|$ となること（**$H^2$ 正則性**）が必要です。1 次元では常に成り立ちますが、多次元の角のある領域では成り立たないことがあり、そのとき $L^2$ の次数は $2$ より下がります（次章）。

<Proposition id="prop-nodal-exactness" title="−u″ = f では節点で厳密">
$a(u,v) = \int_0^1u'v'\,dx$（$p = 1$、$q = 0$）とし、$F \in V^{*}$ を任意の右辺、$u \in V$ を $a(u,v) = F(v)$ の解とする。任意の分割について、区分 1 次の有限要素解は $u_h = I_hu$ である。特に $u_h(x_i) = u(x_i)$（すべての節点）。
</Proposition>

<Proof of="prop-nodal-exactness">
$v_h \in V_h$ をとると、$v_h'$ は各要素 $e_i$ の上で定数 $s_i$ です。$u - I_hu$ は絶対連続で、節点で $0$ なので
$$
a(u - I_hu, v_h) = \sum_{i=1}^{N}s_i\int_{e_i}(u - I_hu)'\,dx = \sum_{i=1}^{N}s_i\bigl[(u - I_hu)(x_i) - (u - I_hu)(x_{i-1})\bigr] = 0
$$
です。したがって $a(I_hu, v_h) = a(u, v_h) = F(v_h)$ で、$I_hu \in V_h$ は Galerkin 近似の式を満たします。一意性（<Ref to="thm-galerkin-wellposed" />）から $u_h = I_hu$ です。
</Proof>

等間隔の分割の場合が <Ref to="mathematics/computer-assisted-proofs/eigenvalue-enclosures#lem-ritz-interpolation" /> で、そこでは固有値の下界に使われています。背景には Green 関数があります。$-u'' = f$ の Green 関数 $g_y(x)$（$y$ を固定）は、$x < y$ で $x(1-y)$、$x > y$ で $y(1-x)$ という折れ線で、$y$ が節点なら $V_h$ に属します。$u(y) - u_h(y) = a(u - u_h, g_y)$ なので、Galerkin 直交性から節点で誤差が $0$ になります。

<Example id="ex-nodal-not-exact" title="係数が定数でないと節点で厳密にならない">
$-u'' + u = 1$、$u(0) = u(1) = 0$ を、$N = 2$（節点は $x_1 = \frac12$ だけ）で解きます。$\varphi_1$ は $\frac12$ で $1$ の帽子関数で、$\int\varphi_1'^2 = 4$、$\int\varphi_1^2 = \frac13$、$\int\varphi_1 = \frac12$ です。Galerkin 近似は $(4 + \frac13)c_1 = \frac12$ から $u_h(\frac12) = c_1 = \frac{3}{26} = 0.11538\ldots$ です。厳密解は $u(x) = 1 - \frac{\cosh(x - 1/2)}{\cosh(1/2)}$ で $u(\frac12) = 1 - \frac{1}{\cosh(1/2)} = 0.11318\ldots$ です。一致しません。$-u'' + u$ の Green 関数は $\sinh$ で書かれ、折れ線ではないからです。
</Example>

<Example id="ex-discontinuous-coefficient" title="不連続な係数：分割を不連続点に合わせる">
$p$ が点 $c \in (0,1)$ で跳ぶ区分的な定数（$x < c$ で $1$、$x > c$ で $p_2 \ne 1$）のとき、弱解 $u$ では $pu'$ が連続で、$u'$ は $c$ で跳びます。$u$ は $H^2(0,1)$ に属しませんが、$[0,c]$ と $[c,1]$ のそれぞれの上では滑らかです。強圧性と有界性は成り立つので <Ref to="thm-cea" /> はそのまま使えます。

$c$ が節点なら、各要素の上で $u$ は滑らかなので、<Ref to="thm-p1-interpolation-1d" /> の 1 の証明がそのまま通り、$\|(u - I_hu)'\| \le \frac{h}{\pi}(\|u''\|_{L^2(0,c)}^2 + \|u''\|_{L^2(c,1)}^2)^{1/2}$ で、誤差は $O(h)$ です。$c$ が要素 $e$ の内部にあると、$e$ の上で $u'$ は跳び $J \ne 0$ をもつのに $(I_hu)'$ は定数なので、$\|(u - I_hu)'\|_e^2$ は $J^2\ell$ に比例する大きさになり、全体の誤差は $O(h^{1/2})$ に落ちます。有限要素法では、係数や右辺の不連続点、境界の角を節点に合わせるのが原則です。
</Example>

## 6. 行列の性質と差分法との関係

<Proposition id="prop-fem-vs-fd" title="等間隔の区分 1 次要素と 3 点差分">
等間隔の分割（$h_i = h = 1/N$）で、$a(u,v) = \int_0^1u'v'\,dx$ とする。

1. 剛性行列は $K = \frac{1}{h}\,\mathrm{tridiag}(-1, 2, -1)$、質量行列は $G = \frac{h}{6}\,\mathrm{tridiag}(1, 4, 1)$ である。$K$ は 3 点差分の行列 $A = \frac{1}{h^2}\mathrm{tridiag}(-1,2,-1)$ の $h$ 倍である。
2. 荷重ベクトルは $b_i = \int_0^1f\varphi_i\,dx = h\bar f_i$ で、$\bar f_i = \frac1h\int f\varphi_i\,dx$ は重み $\varphi_i/h$（積分が $1$）による $f$ の平均である。
3. $b_i$ を $hf(x_i)$ で置き換える（質量行列の各行の和を対角に集める**集中化**にあたる）と、$K\boldsymbol{c} = \boldsymbol{b}$ は 3 点差分の方程式 $-\frac{c_{i+1} - 2c_i + c_{i-1}}{h^2} = f(x_i)$ に一致する。
</Proposition>

<Proof of="prop-fem-vs-fd">
**1.** $\varphi_i'$ は $e_i$ で $\frac1h$、$e_{i+1}$ で $-\frac1h$、他で $0$ です。$K_{ii} = \int\varphi_i'^2 = 2\cdot\frac{1}{h^2}\cdot h = \frac2h$、$K_{i,i+1} = \int_{e_{i+1}}\varphi_i'\varphi_{i+1}' = -\frac{1}{h^2}\cdot h = -\frac1h$、$|i - j| \ge 2$ では台が重ならないので $0$ です。質量行列は、$e_{i+1}$ の上で $s = x - x_i$ として $\varphi_i = 1 - \frac sh$、$\varphi_{i+1} = \frac sh$ なので、$G_{ii} = 2\int_0^h(\frac sh)^2ds = \frac{2h}{3}$、$G_{i,i+1} = \int_0^h\frac sh(1 - \frac sh)ds = \frac h2 - \frac h3 = \frac h6$ です。

**2.** $\int\varphi_i\,dx = h$（底辺 $2h$、高さ $1$ の三角形）なので、$\varphi_i/h$ は積分が $1$ の非負の重みです。

**3.** $G$ の第 $i$ 行の和は $\frac h6 + \frac{4h}{6} + \frac h6 = h$ です（両隣がともに内部の節点である行で。要素ごとに見れば、要素質量行列 $\frac h6\bigl(\begin{smallmatrix}2&1\\1&2\end{smallmatrix}\bigr)$ を対角行列 $\frac h2I$ に置き換えることにあたり、これは台形則による積分です）。$b_i = hf(x_i)$ とすると、$K\boldsymbol{c} = \boldsymbol{b}$ の第 $i$ 式は $\frac1h(-c_{i-1} + 2c_i - c_{i+1}) = hf(x_i)$ で、$h$ で割れば 3 点差分の式です。
</Proof>

つまり、等間隔の 1 次元では、有限要素法と差分法の違いは右辺の扱いだけです。有限要素法は $f$ の点での値の代わりに重みつき平均を使うので、$f$ が連続でなくても（$L^2$ でさえなくても、$V^{*}$ の元なら）意味をもちます。違いがはっきり出るのは、不等間隔の分割や多次元の不規則な分割で、そこでは差分法の式を書くこと自体が難しくなりますが、有限要素法は同じ手続き（要素ごとの積分と組み立て）で済みます。

連立方程式 $K\boldsymbol{c} = \boldsymbol{b}$ を反復法で解く手間は、条件数で決まります。次の補題は、その条件数を評価するための道具です。証明は、1 つの要素の上の 1 次式を両端の値 $\alpha$、$\beta$ で表し、導関数の二乗の積分と関数の二乗の積分を計算して比べるだけです。

<Lemma id="lem-inverse-inequality-1d" title="1 次元の逆不等式と質量行列の評価">
$v_h \in V_h$（区分 1 次）、$\boldsymbol{c} = (v_h(x_i))_{i=1}^{N-1}$、$h_{\min} = \min_ih_i$ とする。

1. 長さ $\ell$ の要素 $e$ の上で $\|v_h'\|_e \le \dfrac{\sqrt{12}}{\ell}\|v_h\|_e$。したがって $\|v_h'\| \le \dfrac{\sqrt{12}}{h_{\min}}\|v_h\|$。
2. $\dfrac{h_{\min}}{3}|\boldsymbol{c}|^2 \le \|v_h\|^2 = \boldsymbol{c}^{\mathsf{T}}G\boldsymbol{c} \le h|\boldsymbol{c}|^2$（$|\cdot|$ は Euclid ノルム）。
</Lemma>

<Proof of="lem-inverse-inequality-1d">
要素 $e$ の両端での $v_h$ の値を $\alpha$、$\beta$ とします。$v_h$ は $e$ の上で 1 次式なので、$t \in [0,1]$ を $e$ の上の座標として $v_h = \alpha(1 - t) + \beta t$ で、
$$
\int_ev_h'^2dx = \frac{(\beta - \alpha)^2}{\ell},\qquad\int_ev_h^2dx = \ell\int_0^1\bigl(\alpha(1-t) + \beta t\bigr)^2dt = \frac{\ell}{3}(\alpha^2 + \alpha\beta + \beta^2)
$$
です。

**1.** $4(\alpha^2 + \alpha\beta + \beta^2) - (\beta - \alpha)^2 = 3\alpha^2 + 6\alpha\beta + 3\beta^2 = 3(\alpha + \beta)^2 \ge 0$ なので、$\int_ev_h'^2 \le \frac{4}{\ell}(\alpha^2 + \alpha\beta + \beta^2) = \frac{12}{\ell^2}\int_ev_h^2$ です。$\ell \ge h_{\min}$ を使って要素について足せば後半です。

**2.** $|\alpha\beta| \le \frac12(\alpha^2 + \beta^2)$ から $\frac{\ell}{6}(\alpha^2 + \beta^2) \le \int_ev_h^2 \le \frac{\ell}{2}(\alpha^2 + \beta^2)$ です。要素について足すと、内部の節点 $x_i$ の値 $c_i^2$ は両側の 2 つの要素から現れ（境界の値は $0$）、
$$
\sum_{i=1}^{N-1}\frac{h_i + h_{i+1}}{6}c_i^2 \le \|v_h\|^2 \le \sum_{i=1}^{N-1}\frac{h_i + h_{i+1}}{2}c_i^2
$$
です。$2h_{\min} \le h_i + h_{i+1} \le 2h$ から主張を得ます。$\|v_h\|^2 = \sum_{i,j}c_ic_j\langle\varphi_j,\varphi_i\rangle = \boldsymbol{c}^{\mathsf{T}}G\boldsymbol{c}$ です。
</Proof>

1 は**逆不等式**と呼ばれます。一般の関数では導関数のノルムを関数のノルムで抑えることはできませんが、有限要素空間の中では、$h^{-1}$ を払えばできます。折れ線が最も激しく振動するのは節点ごとに符号を変えるとき（$\alpha = -\beta$）で、そのとき等号になります。

<Proposition id="prop-stiffness-condition" title="剛性行列と質量行列の条件数">
モデル問題の双線形形式 $a$ と、定数 $\gamma$ で準一様な分割について、2 ノルムの条件数（<Ref to="mathematics/numerical-linear-algebra/norms-and-conditioning#def-condition-number" />）は
$$
\kappa_2(G) \le 3\gamma,\qquad\kappa_2(K) \le \frac{36M\gamma^3}{\pi^2p_0}\,h^{-2}
$$
を満たす。等間隔の分割で $p = 1$、$q = 0$ のときは $\kappa_2(K) = \cot^2\frac{\pi h}{2} \ge \frac{4}{\pi^2h^2} - 1$ で、$h^{-2}$ の次数は改良できない。共役勾配法で $K\boldsymbol{c} = \boldsymbol{b}$ を解くと、エネルギーノルムの誤差を $\varepsilon$ 倍にするのに $k \ge \frac{\sqrt{\kappa_2(K)}}{2}\ln\frac{2}{\varepsilon}$ 回の反復で足り、これは $h^{-1}$ に比例する。
</Proposition>

<Proof of="prop-stiffness-condition">
正定値対称行列 $S$ は、<Ref to="mathematics/linear-algebra/spectral-theorem#cor-real-symmetric" /> の正規直交固有基底で展開すると $\|S\|_2 = \lambda_{\max}$、$\|S^{-1}\|_2 = 1/\lambda_{\min}$ なので $\kappa_2(S) = \lambda_{\max}/\lambda_{\min}$ です。また、すべての $\boldsymbol{c} \ne \boldsymbol{0}$ で $r|\boldsymbol{c}|^2 \le \boldsymbol{c}^{\mathsf{T}}S\boldsymbol{c} \le R|\boldsymbol{c}|^2$ ならば、固有ベクトルを代入して $r \le \lambda_{\min}$、$\lambda_{\max} \le R$ で、$\kappa_2(S) \le R/r$ です。

**質量行列.** <Ref to="lem-inverse-inequality-1d" /> の 2 から $r = h_{\min}/3$、$R = h$ で、$\kappa_2(G) \le 3h/h_{\min} \le 3\gamma$ です。

**剛性行列.** $v_h = \sum_ic_i\varphi_i$ とすると $\boldsymbol{c}^{\mathsf{T}}K\boldsymbol{c} = a(v_h, v_h)$ です。下からは、強圧性、<Ref to="lem-h10-interval" /> の 2、<Ref to="lem-inverse-inequality-1d" /> の 2 から
$$
a(v_h, v_h) \ge p_0\|v_h'\|^2 \ge p_0\pi^2\|v_h\|^2 \ge \frac{p_0\pi^2h_{\min}}{3}|\boldsymbol{c}|^2
$$
です。上からは、有界性と <Ref to="lem-inverse-inequality-1d" /> の 1、2 から
$$
a(v_h, v_h) \le M\|v_h'\|^2 \le \frac{12M}{h_{\min}^2}\|v_h\|^2 \le \frac{12Mh}{h_{\min}^2}|\boldsymbol{c}|^2
$$
です。したがって $\kappa_2(K) \le \frac{36Mh}{\pi^2p_0h_{\min}^3} \le \frac{36M\gamma^3}{\pi^2p_0}h^{-2}$ です。

**等間隔の場合.** <Ref to="prop-fem-vs-fd" /> から $K = hA$ で、条件数は定数倍で変わらないので、<Ref to="mathematics/numerical-linear-algebra/norms-and-conditioning#cor-laplacian-condition" /> から $\kappa_2(K) = \cot^2\frac{\pi h}{2} \ge \frac{4}{\pi^2h^2} - 1$ です。

**共役勾配法.** <Ref to="mathematics/numerical-linear-algebra/lanczos-and-conjugate-gradient#thm-cg-chebyshev-bound" /> から $\|\boldsymbol{e}_k\|_K \le 2\rho^k\|\boldsymbol{e}_0\|_K$、$\rho = \frac{\sqrt\kappa - 1}{\sqrt\kappa + 1}$ です。$s = 1/\sqrt\kappa \in (0, 1]$ として $\ln\rho = \ln(1 - s) - \ln(1 + s) \le -2s$（$\ln(1-s) \le -s$、$\ln(1+s) \le s$ から）なので $\rho^k \le e^{-2k/\sqrt\kappa}$ で、$k \ge \frac{\sqrt\kappa}{2}\ln\frac2\varepsilon$ なら $2\rho^k \le \varepsilon$ です。$\sqrt{\kappa_2(K)} = O(h^{-1})$ です。
</Proof>

条件数 $h^{-2}$ は、差分法のときと同じく、微分作用素が 2 階であることの反映です（最小固有値は $h$ によらず、最大固有値が逆不等式の定数 $h^{-2}$ で増える）。質量行列の条件数が $h$ によらないことは、放物型問題の陽的な時間積分や、$L^2$ 射影の計算で使われます。

実際の計算では、$a$ や $f$ の積分を求積則で近似します。このとき解いているのは元の Galerkin 近似ではないので、Céa の補題に補正が要ります。次の命題の $a_h$、$f_h$ は、$a$ と $f$ の積分を求積則で置き換えたもの（積分を和で近似したもの）で、元の問題との違いはこの置き換えだけです。

<Proposition id="prop-nonconforming-quadrature" title="求積による誤差（第 1 Strang の補題）">
$a$ は $V$ 上で有界（定数 $M$）、$u$ は変分問題の解とする。$V_h \times V_h$ 上の双線形形式 $a_h$ と $V_h$ 上の線形汎関数 $f_h$ が与えられ、定数 $\tilde\alpha > 0$ について $a_h(v_h, v_h) \ge \tilde\alpha\|v_h\|_V^2$（$v_h \in V_h$）とする。このとき $a_h(\tilde u_h, v_h) = f_h(v_h)$（すべての $v_h \in V_h$）を満たす $\tilde u_h \in V_h$ がただ 1 つあり
$$
\|u - \tilde u_h\|_V \le \inf_{v_h \in V_h}\Bigl[\Bigl(1 + \frac{M}{\tilde\alpha}\Bigr)\|u - v_h\|_V + \frac{1}{\tilde\alpha}\sup_{w_h \ne 0}\frac{|a(v_h, w_h) - a_h(v_h, w_h)|}{\|w_h\|_V}\Bigr] + \frac{1}{\tilde\alpha}\sup_{w_h \ne 0}\frac{|f(w_h) - f_h(w_h)|}{\|w_h\|_V}
$$
が成り立つ（上限は $w_h \in V_h$ についてとる）。
</Proposition>

<Proof of="prop-nonconforming-quadrature">
$a_h(v_h, v_h) > 0$（$v_h \ne 0$）なので、<Ref to="thm-galerkin-wellposed" /> の証明と同じく係数行列は正則で、$\tilde u_h$ はただ 1 つあります。$v_h \in V_h$ を任意にとり、$w_h = \tilde u_h - v_h$ とおきます。$a(u, w_h) = f(w_h)$ を使って
$$
\tilde\alpha\|w_h\|_V^2 \le a_h(\tilde u_h, w_h) - a_h(v_h, w_h) = f_h(w_h) - a_h(v_h, w_h) = \bigl[f_h(w_h) - f(w_h)\bigr] + a(u - v_h, w_h) + \bigl[a(v_h, w_h) - a_h(v_h, w_h)\bigr]
$$
です。$|a(u - v_h, w_h)| \le M\|u - v_h\|_V\|w_h\|_V$ を使い、$\|w_h\|_V$ で割ると（$w_h = 0$ なら自明）
$$
\|w_h\|_V \le \frac{1}{\tilde\alpha}\Bigl(M\|u - v_h\|_V + \sup_{w_h}\frac{|a(v_h, w_h) - a_h(v_h, w_h)|}{\|w_h\|_V} + \sup_{w_h}\frac{|f(w_h) - f_h(w_h)|}{\|w_h\|_V}\Bigr)
$$
で、$\|u - \tilde u_h\|_V \le \|u - v_h\|_V + \|w_h\|_V$ と合わせて、$v_h$ について下限をとれば主張を得ます。
</Proof>

誤差は「近似の誤差」と「$a$ と $f$ の整合性の誤差」の和になります。差分法の「整合性 + 安定性」の形がここで再び現れます（$\tilde\alpha$ が安定性の定数）。求積則の精度が足りないと、整合性の項が近似の誤差より大きくなり、次数が落ちます。

<Example id="ex-low-order-quadrature" title="求積の次数が足りない例">
$a(u,v) = \int u'v'$ は正確に計算し、荷重だけを各要素の左端点の値で近似します。$f_h(w_h) = \sum_ef(x_e^{\mathrm{L}})\int_ew_h\,dx$（$x_e^{\mathrm{L}}$ は $e$ の左端）です。$f \in C^1$ なら $|f(x) - f(x_e^{\mathrm{L}})| \le h\max|f'|$ なので
$$
|f(w_h) - f_h(w_h)| = \Bigl|\sum_e\int_e\bigl(f - f(x_e^{\mathrm{L}})\bigr)w_h\,dx\Bigr| \le h\max|f'|\int_0^1|w_h|\,dx \le \frac{h}{\pi}\max|f'|\,\|w_h\|_V
$$
で、<Ref to="prop-nonconforming-quadrature" /> の整合性の項は $O(h)$ です。エネルギーノルムの誤差は $O(h)$ のままですが、節点での厳密性と $L^2$ の $O(h^2)$ は保証されなくなります。§7 の表で、実際に $L^2$ と節点の誤差が $O(h)$ に落ちることを確かめます。要素の中点で $f$ を評価する（中点則）か、両端の平均（台形則。<Ref to="prop-fem-vs-fd" /> の 3 の集中化）にすれば、求積の誤差は $O(h^2)$ になり、次数は保たれます。求積則の誤差の一般的な表し方は Peano 核定理（<Ref to="mathematics/numerical-analysis/newton-cotes-and-gauss-quadrature#thm-peano-kernel" />）です。
</Example>

## 7. 数値実験

区分 1 次要素の剛性行列・質量行列・荷重ベクトルを要素ごとに組み立て、3 つの問題を解きます。どれも厳密解は $u = \sin\pi x$ です。(i) $-u'' = \pi^2\sin\pi x$、(ii) $p = 1 + x$、$q = 1$ の問題、(iii) (i) の荷重を左端点の 1 点則で近似したもの。積分は各要素で 5 点の Gauss 則を使います。

```python
# Python 3.9.6 / NumPy 2.0.2 / SciPy 1.13.1（arm64）
import numpy as np
import scipy.sparse as sp
from scipy.sparse.linalg import spsolve

GX, GW = np.polynomial.legendre.leggauss(5)     # [-1,1] の 5 点 Gauss 則

def assemble(x, p, q, f, load="gauss"):
    """節点 x の区分 1 次要素で -(p u')' + q u = f の K, M, b を要素ごとに組み立てる。"""
    N = len(x) - 1
    rows, cols, kv, mv = [], [], [], []
    b = np.zeros(N + 1)
    for e in range(N):
        a, c = x[e], x[e + 1]
        ell = c - a
        s = 0.5 * (a + c) + 0.5 * ell * GX      # 求積点
        w = 0.5 * ell * GW
        phi = np.array([(c - s) / ell, (s - a) / ell])      # 2 つの形状関数
        dphi = np.array([-1.0 / ell, 1.0 / ell])
        for i in range(2):
            for j in range(2):
                rows.append(e + i); cols.append(e + j)
                kv.append(np.sum(w * (p(s) * dphi[i] * dphi[j] + q(s) * phi[i] * phi[j])))
                mv.append(np.sum(w * phi[i] * phi[j]))
            if load == "gauss":
                b[e + i] += np.sum(w * f(s) * phi[i])
            else:                               # 左端点の 1 点則（次数不足）
                b[e + i] += 0.5 * ell * f(a)
    K = sp.coo_matrix((kv, (rows, cols)), shape=(N + 1, N + 1)).tocsr()
    M = sp.coo_matrix((mv, (rows, cols)), shape=(N + 1, N + 1)).tocsr()
    return K[1:-1, 1:-1], M[1:-1, 1:-1], b[1:-1]            # Dirichlet 条件

def errors(N, p, q, f, u, du, load="gauss"):
    x = np.linspace(0.0, 1.0, N + 1)
    K, M, b = assemble(x, p, q, f, load)
    c = np.concatenate([[0.0], spsolve(K.tocsc(), b), [0.0]])
    e0 = e1 = 0.0
    for e in range(N):
        ell = x[e + 1] - x[e]
        s = 0.5 * (x[e] + x[e + 1]) + 0.5 * ell * GX
        w = 0.5 * ell * GW
        uh = (c[e] * (x[e + 1] - s) + c[e + 1] * (s - x[e])) / ell
        e0 += np.sum(w * (u(s) - uh)**2)
        e1 += np.sum(w * (du(s) - (c[e + 1] - c[e]) / ell)**2)
    return np.sqrt(e1), np.sqrt(e0), np.max(np.abs(c - u(x)))

pi = np.pi
u, du = lambda x: np.sin(pi * x), lambda x: pi * np.cos(pi * x)
one, zero = lambda x: 1.0 + 0 * x, lambda x: 0 * x
probs = [("-u''=f", one, zero, lambda x: pi**2 * np.sin(pi * x), "gauss"),
         ("p=1+x,q=1", lambda x: 1 + x, one,
          lambda x: -pi * np.cos(pi * x) + ((1 + x) * pi**2 + 1) * np.sin(pi * x), "gauss"),
         ("-u''=f left", one, zero, lambda x: pi**2 * np.sin(pi * x), "left")]
for name, p, q, f, load in probs:
    E = np.array([errors(N, p, q, f, u, du, load) for N in (10, 20, 40, 80, 160)])
    print(name)
    for k, lab in enumerate(("H1", "L2", "node")):
        o = np.log2(E[:-1, k] / E[1:, k])
        print(f"  {lab:4s}" + " ".join(f"{v:9.2e}" for v in E[:, k])
              + "  |" + " ".join(f"{v:5.2f}" for v in o))
print("H1 上界 (h/π)‖u''‖, h=1/10:", f"{0.1 / pi * pi**2 / np.sqrt(2):.3e}")
```

```text
-u''=f
  H1   2.01e-01  1.01e-01  5.04e-02  2.52e-02  1.26e-02  | 1.00  1.00  1.00  1.00
  L2   6.36e-03  1.59e-03  3.98e-04  9.95e-05  2.49e-05  | 2.00  2.00  2.00  2.00
  node 4.44e-16  1.11e-15  3.44e-15  2.66e-15  9.83e-14  |-1.32 -1.63  0.37 -5.20
p=1+x,q=1
  H1   2.01e-01  1.01e-01  5.04e-02  2.52e-02  1.26e-02  | 1.00  1.00  1.00  1.00
  L2   5.96e-03  1.49e-03  3.73e-04  9.32e-05  2.33e-05  | 2.00  2.00  2.00  2.00
  node 8.93e-04  2.24e-04  5.62e-05  1.41e-05  3.52e-06  | 1.99  1.99  2.00  2.00
-u''=f left
  H1   2.52e-01  1.26e-01  6.31e-02  3.15e-02  1.58e-02  | 1.00  1.00  1.00  1.00
  L2   2.87e-02  1.25e-02  6.01e-03  2.97e-03  1.48e-03  | 1.19  1.06  1.02  1.00
  node 4.25e-02  1.91e-02  8.93e-03  4.30e-03  2.11e-03  | 1.15  1.10  1.05  1.03
H1 上界 (h/π)‖u''‖, h=1/10: 2.221e-01
```

**検算.** (a) 参照解は製造解 $\sin\pi x$ です。(ii) の右辺は $-(pu')' + qu = -p'u' - pu'' + qu = -\pi\cos\pi x + (1+x)\pi^2\sin\pi x + \sin\pi x$ です。(b) 観測次数は $H^1$ で $1$、$L^2$ で $2$ で、<Ref to="thm-fem-1d-energy-error" /> と <Ref to="thm-aubin-nitsche-1d" /> に合います。(i) の $H^1$ 誤差 $0.201$（$h = 0.1$）は、上界 $\frac{h}{\pi}\|u''\| = \frac{0.1}{\pi}\cdot\frac{\pi^2}{\sqrt2} = 0.222$ の内側です（$p = 1$、$q = 0$ では $M = p_0 = 1$）。(c) (i) の節点での誤差は丸めの大きさ（$10^{-16}$〜$10^{-13}$。次数の欄に意味はありません）で、<Ref to="prop-nodal-exactness" /> のとおりです。$N$ とともに少しずつ増えるのは、条件数 $O(h^{-2})$（<Ref to="prop-stiffness-condition" />）で丸め誤差が拡大されるためです。(ii) の節点での誤差は $O(h^2)$ で、厳密ではありません（<Ref to="ex-nodal-not-exact" />）。(d) 別の方法との照合として、(i) では $u_h = I_hu$ なので $\|(u - u_h)'\|^2 = \|u'\|^2 - \sum_i(u(x_i) - u(x_{i-1}))^2/h$ と閉じた形で書けます。$h = 0.1$ では $\|u'\|^2 = \pi^2/2 = 4.9348$、第 2 項は $\frac{1}{h}\sum_i(\sin\pi x_i - \sin\pi x_{i-1})^2 = \frac{4\sin^2(\pi h/2)}{h}\cdot\frac{1}{2h} = 4.8944$ で、差の平方根は $0.201$ となり表と一致します。(e) (iii) では $L^2$ と節点の誤差が $O(h)$ に落ち、<Ref to="ex-low-order-quadrature" /> の説明と合います。

次に、等間隔の分割での $K$ と $G$ の条件数と、共役勾配法（相対残差 $10^{-8}$ で停止）の反復回数です。

```python
# Python 3.9.6 / NumPy 2.0.2 / SciPy 1.13.1（arm64）
import numpy as np
import scipy.sparse as sp
from scipy.sparse.linalg import cg

print("   N    cond(K)   cot^2(pi h/2)  cond(M)   CG 反復  sqrt(cond)/2*ln(2e8)")
for N in (16, 32, 64, 128, 256):
    h = 1.0 / N
    K = sp.diags([-1, 2, -1], [-1, 0, 1], shape=(N - 1, N - 1)) / h
    M = sp.diags([1, 4, 1], [-1, 0, 1], shape=(N - 1, N - 1)) * h / 6
    ek, em = np.linalg.eigvalsh(K.toarray()), np.linalg.eigvalsh(M.toarray())
    b = h * np.ones(N - 1)
    b[: N // 3] *= -2.0                         # 対称性のない右辺
    it = [0]
    x, info = cg(K.tocsr(), b, rtol=1e-8, atol=0.0,
                 callback=lambda xk: it.__setitem__(0, it[0] + 1))
    kap = ek[-1] / ek[0]
    print(f"{N:4d} {kap:10.1f} {1 / np.tan(np.pi * h / 2)**2:12.1f} "
          f"{em[-1] / em[0]:9.3f} {it[0]:7d} {0.5 * np.sqrt(kap) * np.log(2e8):10.1f}")
```

```text
   N    cond(K)   cot^2(pi h/2)  cond(M)   CG 反復  sqrt(cond)/2*ln(2e8)
  16      103.1        103.1     2.925      15       97.0
  32      414.3        414.3     2.981      31      194.5
  64     1659.4       1659.4     2.995      63      389.3
 128     6639.5       6639.5     2.999     127      778.7
 256    26560.1      26560.1     3.000     255     1557.5
```

**検算.** (a) $K$ の条件数は閉じた形 $\cot^2\frac{\pi h}{2}$ と一致し、$N$ を 2 倍にすると約 4 倍になります（$h^{-2}$）。(b) 質量行列（コードの `M`、本文の $G$）の条件数は $3$ に近づき、<Ref to="prop-stiffness-condition" /> の上界 $3\gamma = 3$ の内側です。$G = \frac h6\mathrm{tridiag}(1,4,1)$ の固有値は <Ref to="mathematics/numerical-linear-algebra/norms-and-conditioning#lem-tridiagonal-toeplitz-eigen" /> から $\frac h6(4 + 2\cos k\pi h)$ で、比は $\frac{4 + 2\cos\pi h}{4 - 2\cos\pi h} \to 3$ です。(c) 共役勾配法の反復回数は $N - 1$（未知数の個数）で、$h^{-1}$ に比例します。上界 $\frac{\sqrt\kappa}{2}\ln\frac{2}{\varepsilon}$ よりずっと少ないのは、共役勾配法が高々未知数の個数の反復で厳密解に達するからです。1 次元の三重対角行列では 1 回の反復で情報が隣の節点にしか伝わらないので、$N$ に比例する回数は避けられません。

<Example id="ex-singular-solution" title="H² に属さない解と、特異点に寄せた分割">
$u(x) = x^{0.6} - x$ は $H^1_0(0,1)$ に属します（$u' = 0.6x^{-0.4} - 1$、$\int_0^1x^{-0.8}dx < \infty$）が、$u'' = -0.24x^{-1.4}$ は $L^2$ に属さないので $H^2$ には属しません。$F(v) = \int_0^1u'v'\,dx$ は $V$ 上の有界線形汎関数で、$u$ は $a(u,v) = \int u'v' = F(v)$ の解です。<Ref to="prop-nodal-exactness" /> から有限要素解は $u_h = I_hu$ なので、誤差 $\|(u - I_hu)'\|$ を直接計算できます。要素ごとに $\int_e(u' - s_e)^2 = \int_eu'^2 - (u(x_i) - u(x_{i-1}))^2/h_i$（$s_e$ は $I_hu$ の傾き）で、$\int u'^2$ は原始関数 $\frac{0.36}{0.2}x^{0.2} - 2x^{0.6} + x$ で求まります。分割は $x_i = (i/N)^\beta$ とし、$\beta = 1$（等間隔）と、$0$ に節点を寄せた $\beta = 5$、$12$ を比べます。

```python
# Python 3.9.6 / NumPy 2.0.2（arm64）
import numpy as np

al = 0.6                                        # u = x^al - x は H^2 に属さない
u = lambda x: x**al - x
F = lambda x: al**2 * x**(2 * al - 1) / (2 * al - 1) - 2 * x**al + x   # ∫ u'^2 の原始関数

def h1_error(x):
    """節点補間（= 有限要素解）の H^1 半ノルム誤差。要素ごとに ∫u'^2 - (Δu)^2/ℓ。"""
    ell, du = np.diff(x), np.diff(u(x))
    return np.sqrt(np.sum(np.diff(F(x)) - du**2 / ell))

for beta in (1.0, 5.0, 12.0):
    Ns = (16, 32, 64, 128, 256)
    e = [h1_error((np.arange(N + 1) / N)**beta) for N in Ns]
    o = [np.log2(e[i] / e[i + 1]) for i in range(4)]
    print(f"beta={beta:4.1f} " + " ".join(f"{v:9.2e}" for v in e)
          + "  |" + " ".join(f"{v:5.2f}" for v in o))
```

```text
beta= 1.0  6.79e-01  6.33e-01  5.91e-01  5.51e-01  5.14e-01  | 0.10  0.10  0.10  0.10
beta= 5.0  2.81e-01  2.00e-01  1.42e-01  1.01e-01  7.13e-02  | 0.49  0.49  0.50  0.50
beta=12.0  2.11e-01  1.15e-01  6.12e-02  3.19e-02  1.64e-02  | 0.87  0.91  0.94  0.96
```

等間隔では次数は $0.1$ で、ほとんど収束しません。最初の要素 $[0, h]$ だけで $\int_0^h(u' - s_e)^2dx$ が $h^{0.2}$ に比例する大きさになるからです。$u'$ の特異な部分 $0.6x^{-0.4}$ の 2 乗の積分は $1.8h^{0.2}$、傾きは $s_e \approx h^{-0.4}$ で $s_e^2h \approx h^{0.2}$ なので、差はおよそ $0.8h^{0.2}$ で、その平方根が $h^{0.1}$ に比例します（$N = 16$ で $\sqrt{0.8\cdot16^{-0.2}} = 0.68$。表の $0.679$ と合います）。$\beta = 5$ では、最初の要素の長さが $N^{-5}$ なので同じ量が $N^{-5\times0.1} = N^{-0.5}$ になり、表の次数 $0.5$ と合います。$\beta = 12$ では次数が $1$ に近づき、滑らかな解と同じ速さが（節点の個数 $N$ について）回復します。解の特異性が分かっていれば、分割をそこに寄せることで次数を取り戻せます。特異性が分からないときに誤差の大きい要素を自動的に見つけて細分するのが、事後誤差評価と適応的な細分です（次章の注意）。
</Example>

## 8. 演習

<Exercise id="exr-element-matrices" difficulty="易">
長さ $\ell$ の要素の上の区分 1 次要素について、$a(u,v) = \int u'v'$ の要素剛性行列と要素質量行列を求めよ。それを使って、$N = 3$ の等間隔の分割の剛性行列（$2 \times 2$）を組み立てよ。
<Solution>
要素の上の 2 つの形状関数は $\psi_1 = 1 - t$、$\psi_2 = t$（$t = (x - x_{i-1})/\ell$）で、$\psi_1' = -1/\ell$、$\psi_2' = 1/\ell$ です。
$$
K_e = \frac{1}{\ell}\begin{pmatrix}1 & -1\\ -1 & 1\end{pmatrix},\qquad G_e = \frac{\ell}{6}\begin{pmatrix}2 & 1\\ 1 & 2\end{pmatrix}
$$
です（$\int_0^1t^2dt = \frac13$、$\int_0^1t(1-t)dt = \frac16$ に $\ell$ を掛ける）。$N = 3$、$\ell = \frac13$ では、節点 $x_0, \ldots, x_3$ について $4 \times 4$ の行列に 3 つの $K_e = 3\bigl(\begin{smallmatrix}1&-1\\-1&1\end{smallmatrix}\bigr)$ を足し込み、境界の節点 $x_0$、$x_3$ の行と列を除くと
$$
K = \begin{pmatrix}3 + 3 & -3\\ -3 & 3 + 3\end{pmatrix} = \begin{pmatrix}6 & -3\\ -3 & 6\end{pmatrix} = \frac1h\begin{pmatrix}2 & -1\\ -1 & 2\end{pmatrix}
$$
で、<Ref to="prop-fem-vs-fd" /> の 1 と一致します。
</Solution>
</Exercise>

<Exercise id="exr-convection-diffusion" difficulty="標準">
$\varepsilon > 0$ とし、$V = H^1_0(0,1)$ 上の双線形形式 $a(u,v) = \int_0^1(\varepsilon u'v' + u'v)\,dx$（$-\varepsilon u'' + u' = f$ の弱形式）を考える。$a$ は対称でないが、有界で強圧的であることを示し、定数 $M$、$\alpha$ と Céa の補題の定数 $M/\alpha$ を求めよ。$\varepsilon \to 0$ で何が起きるか。
<Solution>
$v \in V$ について、<Ref to="lem-h10-interval" /> の 1 から $\int_0^1v'v\,dx = \bigl[v^2\bigr]_0^1 - \int_0^1vv'\,dx$ で、$v(0) = v(1) = 0$ なので $\int_0^1v'v\,dx = 0$ です。したがって $a(v,v) = \varepsilon\|v'\|^2$ で、$\alpha = \varepsilon$ で強圧的です。有界性は、同じ補題の 2 から $|a(u,v)| \le \varepsilon\|u'\|\|v'\| + \|u'\|\|v\| \le (\varepsilon + \frac1\pi)\|u'\|\|v'\|$ で、$M = \varepsilon + \frac1\pi$ です。<Ref to="thm-cea" /> の前半（対称性を使わない形）から
$$
\|(u - u_h)'\| \le \Bigl(1 + \frac{1}{\pi\varepsilon}\Bigr)\inf_{v_h}\|(u - v_h)'\|
$$
です。$\varepsilon \to 0$ で定数が $\frac{1}{\pi\varepsilon}$ のように大きくなり、$h$ が $\varepsilon$ に比べて大きいあいだは、最良近似がよくても有限要素解がよいとは保証されません。実際、この領域では解に振動が現れます（<Ref to="rem-petrov-galerkin" />）。
</Solution>
</Exercise>

<Exercise id="exr-max-norm" difficulty="標準">
$f \in C[0,1]$ とし、$-u'' = f$、$u(0) = u(1) = 0$ の区分 1 次の有限要素解を $u_h$ とする。$\max_{[0,1]}|u - u_h| \le \frac{h^2}{8}\max|f|$ を示せ。
<Solution>
$f$ が連続なので、<Ref to="lem-regularity-1d" /> の証明から $u' = c - G$（$G(x) = \int_0^xf$）は $C^1$ 級で、$u \in C^2[0,1]$、$u'' = -f$ です。<Ref to="prop-nodal-exactness" /> から $u_h = I_hu$ です。長さ $\ell$ の要素 $[x_{i-1}, x_i]$ の上で、$I_hu$ は 2 点 $x_{i-1}$、$x_i$ での $u$ の 1 次の補間多項式なので、<Ref to="mathematics/numerical-analysis/polynomial-interpolation#thm-interpolation-error" /> から（この定理は節点を含む開区間での 2 回微分可能性を仮定するので、$u$ を $x < 0$ では $u(0) + u'(0)x + \frac12u''(0)x^2$、$x > 1$ でも同様の 2 次式で延長して $[0,1]$ を含む開区間で $C^2$ 級にしておきます。$\xi$ は $[x_{i-1}, x_i]$ にとれるので、延長の仕方は結論に影響しません）
$$
u(x) - I_hu(x) = \frac{u''(\xi)}{2}(x - x_{i-1})(x - x_i)
$$
です（要素の内部の点 $x$ について。端点では両辺 $0$）。$|(x - x_{i-1})(x - x_i)| \le \ell^2/4$（中点で最大）なので $|u - u_h| \le \frac{\ell^2}{8}\max|u''| \le \frac{h^2}{8}\max|f|$ です。1 次元の $-u'' = f$ では、最大値ノルムでも $O(h^2)$ が初等的に得られます。
</Solution>
</Exercise>

## 参考文献

- S. C. Brenner, L. R. Scott『The Mathematical Theory of Finite Element Methods』3rd ed., Springer, 2008 — 第 0 章（1 次元のモデル問題と双対論法）、第 2 章（変分問題と Céa の補題）。
- P. G. Ciarlet『The Finite Element Method for Elliptic Problems』North-Holland, 1978（SIAM Classics, 2002）— Galerkin 近似の抽象論、補間誤差、求積の影響。
- G. Strang, G. J. Fix『An Analysis of the Finite Element Method』Prentice-Hall, 1973 — Ritz 法としての有限要素法、1 次元の誤差解析、条件数、求積と「変分法の罪」。
- A. Ern, J.-L. Guermond『Theory and Practice of Finite Elements』Springer, 2004 — inf-sup 条件と Petrov–Galerkin 法、移流が支配的な問題の安定化。
- 菊地文雄『有限要素法の数理』培風館、1994 — 日本語での数学的な基礎。
- J. Céa, "Approximation variationnelle des problèmes aux limites", *Annales de l'Institut Fourier* 14 (1964), 345–444 — Céa の補題の原論文。
