<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>綴 / WRITING — KENTARO</title>
<link>https://eigen-kentaro.com/blog/</link>
<atom:link href="https://eigen-kentaro.com/blog/index.xml" rel="self" type="application/rss+xml"/>
<description>乱流・モード分解・写真・音についての考察 / Notes on turbulence, modal decomposition, photography and sound.</description>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Tue, 11 Aug 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>渦の骨格 — PODは何を捨てているのかThe Skeleton of a Vortex — What POD Throws Away</title>
  <link>https://eigen-kentaro.com/blog/posts/2026-08-11-pod-skeleton/</link>
  <description><![CDATA[ 





<div class="re-badge laminar">
<p>Re = 2.3×10² — LAMINAR</p>
</div>
<div class="jp">
<p>流れ場のデータは大きい。格子点数 <img src="https://latex.codecogs.com/png.latex?10%5E7">、時刻数 <img src="https://latex.codecogs.com/png.latex?10%5E3"> ともなれば、それだけで数百 GB になる。しかしその中で実際に「起きていること」は、たいてい数本の構造で説明がつく。固有直交分解（POD）は、その数本を取り出すための最も素直な道具です。</p>
<p>素直であることと、正しいことは違います。この記事は POD の擁護ではなく、<strong>POD が何を捨てているか</strong>の記録です。</p>
</div>
<div class="en-t">
<p>Flow data is large. With <img src="https://latex.codecogs.com/png.latex?10%5E7"> grid points and <img src="https://latex.codecogs.com/png.latex?10%5E3"> time steps, a single dataset runs to hundreds of gigabytes. Yet what is actually <em>happening</em> inside it can usually be described by a handful of structures. Proper Orthogonal Decomposition (POD) is the most straightforward tool for pulling those few out.</p>
<p>Straightforward is not the same as correct. This post is not a defence of POD but a record of <strong>what POD throws away</strong>.</p>
</div>
<section id="definition" class="level2">
<h2 class="anchored" data-anchor-id="definition">定義 / The decomposition</h2>
<div class="jp">
<p>速度場（あるいは渦度場）の時間平均を引いた変動成分を <img src="https://latex.codecogs.com/png.latex?u'(%5Cmathbf%7Bx%7D,%20t)"> とし、これを空間モード <img src="https://latex.codecogs.com/png.latex?%5Cphi_k(%5Cmathbf%7Bx%7D)"> と時間係数 <img src="https://latex.codecogs.com/png.latex?a_k(t)"> の積の和に分けます。</p>
</div>
<div class="en-t">
<p>Let <img src="https://latex.codecogs.com/png.latex?u'(%5Cmathbf%7Bx%7D,%20t)"> be the fluctuation left after subtracting the time mean of the velocity (or vorticity) field, and split it into a sum of products of spatial modes <img src="https://latex.codecogs.com/png.latex?%5Cphi_k(%5Cmathbf%7Bx%7D)"> and temporal coefficients <img src="https://latex.codecogs.com/png.latex?a_k(t)">.</p>
</div>
<p><img src="https://latex.codecogs.com/png.latex?%0Au'(%5Cmathbf%7Bx%7D,%20t)%20%5C;=%5C;%20%5Csum_%7Bk=1%7D%5E%7B%5Cinfty%7D%20a_k(t)%5C,%5Cphi_k(%5Cmathbf%7Bx%7D)%0A%5C;%5Capprox%5C;%20%5Csum_%7Bk=1%7D%5E%7Br%7D%20a_k(t)%5C,%5Cphi_k(%5Cmathbf%7Bx%7D)%0A"></p>
<div class="jp">
<p>実際の計算では、各時刻のスナップショットを列に並べた行列 <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bn%20%5Ctimes%20m%7D">（<img src="https://latex.codecogs.com/png.latex?n">＝空間自由度、<img src="https://latex.codecogs.com/png.latex?m">＝スナップショット数）を特異値分解します。</p>
</div>
<div class="en-t">
<p>In practice one stacks the snapshots as columns of a matrix <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bn%20%5Ctimes%20m%7D"> (<img src="https://latex.codecogs.com/png.latex?n"> spatial DOF, <img src="https://latex.codecogs.com/png.latex?m"> snapshots) and takes its singular value decomposition.</p>
</div>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7BX%7D%20=%20%5Cmathbf%7BU%7D%5Cboldsymbol%7B%5CSigma%7D%5Cmathbf%7BV%7D%5E%7B%5Cmathsf%7BT%7D%7D,%0A%5Cqquad%0AE_r%20=%20%5Cfrac%7B%5Csum_%7Bk=1%7D%5E%7Br%7D%5Csigma_k%5E%7B2%7D%7D%7B%5Csum_%7Bk=1%7D%5E%7Bm%7D%5Csigma_k%5E%7B2%7D%7D%0A"></p>
<div class="jp">
<p><img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BU%7D"> の列が空間モード、<img src="https://latex.codecogs.com/png.latex?%5Csigma_k%5E2"> がそのモードの持つエネルギー、<img src="https://latex.codecogs.com/png.latex?E_r"> が <img src="https://latex.codecogs.com/png.latex?r"> 本で再現できるエネルギー比です。POD の最適性は明快で、<strong>任意の <img src="https://latex.codecogs.com/png.latex?r"> 次元線形部分空間の中で、平均二乗誤差を最小にするのは POD 基底</strong>であることが示せます。ここに議論の余地はありません。</p>
<p>余地があるのは、「平均二乗誤差が小さいこと」と「流れを理解したこと」が同じか、という点です。</p>
</div>
<div class="en-t">
<p>The columns of <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BU%7D"> are the spatial modes, <img src="https://latex.codecogs.com/png.latex?%5Csigma_k%5E2"> is the energy carried by each, and <img src="https://latex.codecogs.com/png.latex?E_r"> is the fraction of energy recovered by <img src="https://latex.codecogs.com/png.latex?r"> of them. POD’s optimality is unambiguous: <strong>among all <img src="https://latex.codecogs.com/png.latex?r">-dimensional linear subspaces, the POD basis minimises the mean-square error</strong>. There is no arguing with that.</p>
<p>What is arguable is whether a small mean-square error is the same thing as having understood the flow.</p>
</div>
</section>
<section id="synthetic" class="level2">
<h2 class="anchored" data-anchor-id="synthetic">合成場で確かめる / A synthetic check</h2>
<div class="jp">
<p>渦対がゆっくり首を振るだけの、単純な合成渦度場を作ります。物理としては退屈ですが、退屈な流れでこそ POD の癖が見えます。</p>
</div>
<div class="en-t">
<p>Here is a synthetic vorticity field: a counter-rotating vortex pair that slowly oscillates. Physically dull — but a dull flow is exactly where POD’s habits become visible.</p>
</div>
<div id="dfa65c5d" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"></span>
<span id="cb1-3">nx, ny, nt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">96</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">64</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">240</span></span>
<span id="cb1-4">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.pi, nx)</span>
<span id="cb1-5">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>, ny)</span>
<span id="cb1-6">X, Y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.meshgrid(x, y, indexing<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ij"</span>)</span>
<span id="cb1-7">t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.pi, nt)</span>
<span id="cb1-8"></span>
<span id="cb1-9"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> vorticity(tk, sigma<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.35</span>):</span>
<span id="cb1-10">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""A counter-rotating Gaussian vortex pair, oscillating about x = 2π."""</span></span>
<span id="cb1-11">    xc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.pi <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.sin(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> tk)</span>
<span id="cb1-12">    yc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.cos(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> tk)</span>
<span id="cb1-13">    plus  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>((X <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> xc) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (Y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> yc) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> sigma)</span>
<span id="cb1-14">    minus <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>((X <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> xc) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (Y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> yc) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> sigma)</span>
<span id="cb1-15">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> plus <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> minus</span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># snapshot matrix: n spatial DOF × m snapshots, time mean removed</span></span>
<span id="cb1-18">S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.stack([vorticity(tk).ravel() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> tk <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> t], axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-19">S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-=</span> S.mean(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, keepdims<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-20"></span>
<span id="cb1-21">U, sig, Vt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linalg.svd(S, full_matrices<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-22">energy <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> sig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(sig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb1-23">cum <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.cumsum(energy)</span>
<span id="cb1-24">r99 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>(np.searchsorted(cum, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.99</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-25"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"snapshot matrix : </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>S<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>shape[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> × </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>S<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>shape[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-26"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"modes for 99 %  : </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>r99<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>snapshot matrix : 6144 × 240
modes for 99 %  : 5</code></pre>
</div>
</div>
<div id="cell-fig-pod" class="cell" data-execution_count="3">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb3-2"></span>
<span id="cb3-3">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.4</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.4</span>),</span>
<span id="cb3-4">                       gridspec_kw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"width_ratios"</span>: [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]})</span>
<span id="cb3-5"></span>
<span id="cb3-6">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].semilogy(np.arange(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">21</span>), energy[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"o-"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>BLUE, ms<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-7">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mode index $k$"</span>)</span>
<span id="cb3-8">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">sigma_k^2 / </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Sigma</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">sigma^2$"</span>)</span>
<span id="cb3-9">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"energy spectrum"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM)</span>
<span id="cb3-10"></span>
<span id="cb3-11">lim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(U[:, :<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb3-12"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> j <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb3-13">    ax[j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].pcolormesh(X, Y, U[:, j].reshape(nx, ny),</span>
<span id="cb3-14">                         cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>VORT, vmin<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=-</span>lim, vmax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>lim, shading<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"auto"</span>)</span>
<span id="cb3-15">    ax[j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_title(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">phi_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$  (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>energy[j] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.1f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> % energy)"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM)</span>
<span id="cb3-16">    ax[j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_xticks([])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> ax[j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_yticks([])</span>
<span id="cb3-17">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> s <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> ax[j <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].spines.values():</span>
<span id="cb3-18">        s.set_visible(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb3-19"></span>
<span id="cb3-20">fig.tight_layout()</span>
<span id="cb3-21">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="fig-pod" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-pod-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://eigen-kentaro.com/blog/posts/2026-08-11-pod-skeleton/index_files/figure-html/fig-pod-output-1.png" width="1167" height="329" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-pod-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Singular-value spectrum of the synthetic field, and the first two POD modes. Blue is ω &lt; 0, red is ω &gt; 0.
</figcaption>
</figure>
</div>
</div>
</div>
<div class="jp">
<p>渦対はたった一つ、振り子のように往復しているだけです。それでもエネルギーの 99 % を再現するには 5 本のモードが必要でした。第1・第2モードは互いに位相が四分の一ずれた形をしており、<strong>「動く一つの構造」を、静止した複数の形の重ね合わせとして表現し直している</strong>ことが見て取れます。</p>
</div>
<div class="en-t">
<p>There is exactly one vortex pair, swinging like a pendulum. Even so, recovering 99 % of the energy took 5 modes. The first and second modes are quarter-phase shifted copies of one another — POD has <strong>re-expressed a single moving structure as a superposition of several stationary shapes</strong>.</p>
</div>
</section>
<section id="discarded" class="level2">
<h2 class="anchored" data-anchor-id="discarded">捨てているもの / What is discarded</h2>
<div class="jp">
<p>上の実験が示しているのは、POD の三つの性質です。</p>
<p><strong>1. 移流はモードを浪費する。</strong> 進行する構造を静止基底で表そうとすると、原理的に sin と cos の対が必要になります。渦が一つしかなくても <img src="https://latex.codecogs.com/png.latex?r"> は増える。移流が支配的な流れで POD のモード数が膨らむのはこのためで、<strong>流れが複雑だからではなく、基底が動かないから</strong>です。周波数ごとに分ける SPOD や、単一周波数・単一成長率を持つモードを取り出す DMD が使われるのは、この浪費を避けるためです。</p>
<p><strong>2. エネルギー順位は、力学的重要度の順位ではない。</strong> <img src="https://latex.codecogs.com/png.latex?%5Csigma_k%5E2"> が並べているのは分散であって、感度ではありません。遷移の引き金になるような撹乱は、エネルギーとしては小さいまま系を不安定化させることがあります。「上位 10 本で 99 %」という数字は、<strong>再現には十分だが、予測に十分とは限らない</strong>。</p>
<p><strong>3. 線形部分空間しか張れない。</strong> POD は非線形相互作用そのものを表現しません。表現するのは、非線形相互作用が生んだ「結果」の統計だけです。</p>
</div>
<div class="en-t">
<p>The experiment exposes three properties of POD.</p>
<p><strong>1. Advection wastes modes.</strong> Representing a travelling structure on a stationary basis requires, in principle, a sine–cosine pair. Even with a single vortex, <img src="https://latex.codecogs.com/png.latex?r"> grows. That is why mode counts balloon in advection-dominated flows — <strong>not because the flow is complex, but because the basis does not move</strong>. SPOD, which separates by frequency, and DMD, which extracts modes of a single frequency and growth rate, exist to avoid this waste.</p>
<p><strong>2. The energy ranking is not a ranking of dynamical importance.</strong> What <img src="https://latex.codecogs.com/png.latex?%5Csigma_k%5E2"> orders is variance, not sensitivity. A disturbance that triggers transition can destabilise a system while remaining small in energy. “99 % in the top ten modes” is <strong>enough for reconstruction, not necessarily enough for prediction</strong>.</p>
<p><strong>3. Only a linear subspace is available.</strong> POD does not represent nonlinear interaction itself. It represents only the statistics of what that interaction produced.</p>
</div>
<div class="jp">
<blockquote class="blockquote">
<p>圧縮とは、何を残すかを決めることではなく、<strong>何を捨てても構わないかを決めること</strong>です。捨てた側を書き留めておかないと、モデルは静かに嘘をつき始めます。</p>
</blockquote>
</div>
<div class="en-t">
<blockquote class="blockquote">
<p>Compression is not a decision about what to keep. It is a decision about <strong>what may safely be thrown away</strong>. Unless the discarded half is written down somewhere, the model begins, quietly, to lie.</p>
</blockquote>
</div>
<div class="jp">
<p>次は、同じ道具を音楽に向けたときに何が起きるかを書きます。</p>
</div>
<div class="en-t">
<p>Next, what happens when the same tool is pointed at music.</p>
</div>
<div class="sig">
<p>健太郎</p>
</div>


</section>

 ]]></description>
  <category>laminar</category>
  <category>POD</category>
  <category>turbulence</category>
  <guid>https://eigen-kentaro.com/blog/posts/2026-08-11-pod-skeleton/</guid>
  <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>音楽の座標空間 — PODという比喩はどこまで正しいかA Coordinate Space for Music — How Far the POD Analogy Holds</title>
  <link>https://eigen-kentaro.com/blog/posts/2026-08-04-music-coordinates/</link>
  <description><![CDATA[ 





<div class="re-badge transition">
<p>Re = 1.2×10⁴ — TRANSITIONAL</p>
</div>
<div class="jp">
<p>音楽の探し方が、タグに頼りすぎていると感じています。「chill」「作業用」「エモい」。どれも他人の言葉であって、音そのものの座標ではありません。</p>
<p>流体では、数億自由度の場を少数のモードに畳んできました。同じことを楽曲にできないか——物理的・知覚的な根拠を持つ 8 本前後の軸で音楽を張れないか、というのが今のところの問いです。</p>
</div>
<div class="en-t">
<p>I have come to feel that we search for music almost entirely through tags: <em>chill</em>, <em>for focus</em>, <em>emotional</em>. Every one of them is somebody else’s word, not a coordinate of the sound itself.</p>
<p>In fluids, I fold fields with hundreds of millions of DOF into a few modes. Could the same be done for songs — could music be spanned by around eight axes with physical and perceptual grounding? That is the question at the moment.</p>
</div>
<section id="same-operation" class="level2">
<h2 class="anchored" data-anchor-id="same-operation">同じ演算である / Literally the same operation</h2>
<div class="jp">
<p>まず事実確認から。流体で言う POD と、データ解析で言う PCA は、<strong>離散データに対しては同じ演算</strong>です。中心化した行列 <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D"> の共分散行列の固有分解、あるいは <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D"> の特異値分解。呼び名が違うのは、適用対象と歴史が違うだけです。</p>
</div>
<div class="en-t">
<p>A point of fact first. POD in fluid dynamics and PCA in data analysis are, <strong>for discrete data, the same operation</strong>: the eigendecomposition of the covariance of a centred matrix <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D">, or equivalently the SVD of <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D">. The two names differ only in the field and the history that produced them.</p>
</div>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7BC%7D%20=%20%5Cfrac%7B1%7D%7Bm-1%7D%5Cmathbf%7BX%7D%5Cmathbf%7BX%7D%5E%7B%5Cmathsf%7BT%7D%7D,%0A%5Cqquad%0A%5Cmathbf%7BC%7D%5C,%5Cphi_k%20=%20%5Clambda_k%20%5Cphi_k,%0A%5Cqquad%0A%5Clambda_k%20=%20%5Cfrac%7B%5Csigma_k%5E%7B2%7D%7D%7Bm-1%7D%0A"></p>
<div class="jp">
<p>なので「楽曲の特徴量行列を PCA にかける」ことは、技術的には何の飛躍でもありません。飛躍が起きるのは、その軸に<strong>意味を読もうとした瞬間</strong>です。</p>
</div>
<div class="en-t">
<p>So “running PCA on a matrix of song features” is, technically, no leap at all. The leap happens the moment one tries to <strong>read meaning into the axes</strong>.</p>
</div>
<div id="3fff1a91" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"></span>
<span id="cb1-3">rng <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.random.default_rng(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb1-4">n_songs, n_feat, n_latent <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">600</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">24</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span></span>
<span id="cb1-5"></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 24 measured descriptors generated from 8 latent factors + noise:</span></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># a deliberately favourable setting for PCA.</span></span>
<span id="cb1-8">W <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rng.normal(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n_feat, n_latent)) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.linspace(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.6</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>, n_latent)</span>
<span id="cb1-9">Z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rng.normal(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n_latent, n_songs))</span>
<span id="cb1-10">F <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> W <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span> Z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.35</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> rng.normal(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n_feat, n_songs))</span>
<span id="cb1-11">F <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-=</span> F.mean(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, keepdims<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-12"></span>
<span id="cb1-13">U, sig, Vt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linalg.svd(F, full_matrices<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-14">explained <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> sig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(sig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb1-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"explained variance, first 10 axes:"</span>)</span>
<span id="cb1-16"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(explained[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>))</span>
<span id="cb1-17"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"cumulative at 8 axes : </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>explained[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.3f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>explained variance, first 10 axes:
[0.327 0.25  0.13  0.126 0.072 0.036 0.027 0.019 0.001 0.001]
cumulative at 8 axes : 0.988</code></pre>
</div>
</div>
<div id="cell-fig-pca" class="cell" data-execution_count="3">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb3-2"></span>
<span id="cb3-3">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">7.6</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.7</span>))</span>
<span id="cb3-4"></span>
<span id="cb3-5">k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.arange(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>)</span>
<span id="cb3-6">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].plot(k, np.cumsum(explained[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>]), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"o-"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>BLUE, ms<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-7">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].axvline(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">.6</span>, ls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">":"</span>)</span>
<span id="cb3-8">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"number of axes"</span>)</span>
<span id="cb3-9">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cumulative variance"</span>)</span>
<span id="cb3-10">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].set_ylim(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.02</span>)</span>
<span id="cb3-11"></span>
<span id="cb3-12">P <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (np.diag(sig[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">@</span> Vt[:<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]).T          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># songs projected on the first two axes</span></span>
<span id="cb3-13">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].scatter(P[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], P[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>], s<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">.45</span>, linewidths<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb3-14">s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.9</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(P).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>()</span>
<span id="cb3-15">theta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.deg2rad(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">37</span>)                      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># an arbitrary rotation of the same subspace</span></span>
<span id="cb3-16"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (dx, dy), style, c <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-"</span>, BLUE), ((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-"</span>, BLUE),</span>
<span id="cb3-17">                           ((np.cos(theta), np.sin(theta)), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"--"</span>, RED),</span>
<span id="cb3-18">                           ((<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>np.sin(theta), np.cos(theta)), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"--"</span>, RED)]:</span>
<span id="cb3-19">    ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].plot([<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dx, s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dx], [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dy, s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dy], style, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>c, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-20">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_xticks([])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_yticks([])</span>
<span id="cb3-21">ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].set_aspect(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"equal"</span>)</span>
<span id="cb3-22"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> sp <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> ax[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].spines.values():</span>
<span id="cb3-23">    sp.set_visible(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb3-24"></span>
<span id="cb3-25">fig.tight_layout()</span>
<span id="cb3-26">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="fig-pca" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-pca-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://eigen-kentaro.com/blog/posts/2026-08-04-music-coordinates/index_files/figure-html/fig-pca-output-1.png" width="967" height="373" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-pca-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Left: cumulative explained variance — eight axes are enough. Right: the same 2-D cloud with the PCA axes (solid) and an arbitrary rotation of them (dashed). Both reconstruct the data equally well.
</figcaption>
</figure>
</div>
</div>
</div>
</section>
<section id="breaks" class="level2">
<h2 class="anchored" data-anchor-id="breaks">比喩が壊れる三箇所 / Where the analogy breaks</h2>
<div class="jp">
<p><strong>1. 軸は分散が決めているだけで、意味は決めていない。</strong> 右の図がその全てです。実線が PCA の軸、破線はそれを 37° 回転させただけの軸。<strong>再構成誤差はまったく同じ</strong>です。低次元部分空間は一意に決まりますが、その中の軸の取り方は決まらない。「第3軸＝明るさ」のような解釈は、数学が与えてくれるものではなく、こちらが<strong>追加の制約（疎性・非負性・独立性など）を課して初めて得られる</strong>ものです。8 次元は発見するものではなく、設計するものだ、というのが今の結論です。</p>
<p><strong>2. 特徴量が線形でない。</strong> 流体のスナップショットは物理量そのものですが、音楽の「特徴量」は既に人の手が入った変換です。テンポやラウドネスは対数的にしか知覚されず、線形結合に意味があるとは限りません。</p>
<p><strong>3. 距離が知覚と一致しない。</strong> ユークリッド距離が近い二曲が似て聴こえる保証はありません。流体では <img src="https://latex.codecogs.com/png.latex?L%5E2"> ノルムがエネルギーという物理量に直結していましたが、音楽の座標空間には対応する保存量がない。<strong>ノルムを正当化するものが無い</strong>——これが一番効いている差だと思っています。</p>
</div>
<div class="en-t">
<p><strong>1. The axes are fixed by variance, not by meaning.</strong> The right-hand figure is the whole argument. Solid lines are the PCA axes; dashed lines are the same axes rotated by 37°. <strong>The reconstruction error is identical.</strong> The low-dimensional subspace is unique; the choice of axes within it is not. An interpretation such as “axis 3 = brightness” is not something the mathematics hands you — it appears only once you <strong>impose extra constraints</strong> (sparsity, non-negativity, independence). Eight dimensions are not discovered; they are designed. That is my current conclusion.</p>
<p><strong>2. The features are not linear.</strong> A flow snapshot <em>is</em> the physical quantity. A musical “feature” is already a human-made transform. Tempo and loudness are perceived logarithmically, so a linear combination of them need not mean anything.</p>
<p><strong>3. Distance does not match perception.</strong> Two songs close in Euclidean distance are not guaranteed to sound alike. In fluids the <img src="https://latex.codecogs.com/png.latex?L%5E2"> norm is tied to energy, a physical quantity; a music coordinate space has no corresponding conserved quantity. <strong>Nothing justifies the norm</strong> — to me, that is the difference that bites hardest.</p>
</div>
<div class="jp">
<p>それでも続けているのは、比喩が壊れる場所こそ、その分野固有の問題が露出する場所だからです。流体で <img src="https://latex.codecogs.com/png.latex?L%5E2"> が正しかったのは幸運であって、当たり前ではなかった——音楽をやってみて初めてそう思うようになりました。</p>
</div>
<div class="en-t">
<p>I keep going anyway, because the place where an analogy breaks is exactly where a field’s own problem is exposed. That <img src="https://latex.codecogs.com/png.latex?L%5E2"> was the right norm in fluids was good fortune, not a law of nature — a thing I only started to see by working on music.</p>
</div>
<div class="sig">
<p>健太郎</p>
</div>


</section>

 ]]></description>
  <category>transition</category>
  <category>POD</category>
  <category>music</category>
  <guid>https://eigen-kentaro.com/blog/posts/2026-08-04-music-coordinates/</guid>
  <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>写真は、乱流のスナップショットA Photograph Is a Snapshot of Turbulence</title>
  <link>https://eigen-kentaro.com/blog/posts/2026-07-28-photograph-as-snapshot/</link>
  <description><![CDATA[ 





<div class="re-badge turbulent">
<p>Re = 9.0×10⁵ — TURBULENT</p>
</div>
<div class="jp">
<p><span class="mincho">街の交差点は、二度と同じ配置に戻りません。</span></p>
<p>同じ時刻に、同じ場所に、同じレンズで立っても、光と人の並びは別のものになっている。それでも「あの交差点らしさ」は失われない。この二つが同時に成り立っていることが、写真を撮っていて一番おもしろいところです。</p>
<p>そして、これは乱流でずっと見てきた性質そのものです。</p>
</div>
<div class="en-t">
<p><span class="mincho">A city intersection never returns to the same configuration.</span></p>
<p>Stand at the same place, at the same hour, with the same lens, and the arrangement of light and people is different. And yet the <em>character</em> of that intersection survives. The fact that both of these hold at once is the most interesting thing about photography, to me.</p>
<p>It is also exactly the property I have spent years looking at in turbulence.</p>
</div>
<section id="realisation" class="level2">
<h2 class="anchored" data-anchor-id="realisation">一実現値と、統計量 / One realisation, and a statistic</h2>
<div class="jp">
<p>乱流は決定論的な方程式に従いますが、初期条件のわずかな差が指数的に開くため、一つ一つの実現値は再現できません。再現できるのは統計量のほうです。平均、分散、相関、そしてスペクトル。</p>
<p>Kolmogorov の相似則は、十分に高い Reynolds 数の慣性小領域で、エネルギースペクトルが</p>
</div>
<div class="en-t">
<p>Turbulence obeys deterministic equations, but small differences in initial conditions separate exponentially, so no individual realisation is reproducible. What <em>is</em> reproducible are the statistics: means, variances, correlations, and spectra.</p>
<p>Kolmogorov’s similarity theory states that, in the inertial subrange of a sufficiently high-Reynolds-number flow, the energy spectrum follows</p>
</div>
<p><img src="https://latex.codecogs.com/png.latex?%0AE(k)%20=%20C%5C,%5Cvarepsilon%5E%7B2/3%7D%20k%5E%7B-5/3%7D%0A"></p>
<div class="jp">
<p>という形をとる、と述べます（<img src="https://latex.codecogs.com/png.latex?%5Cvarepsilon">＝単位質量あたりのエネルギー散逸率、<img src="https://latex.codecogs.com/png.latex?k">＝波数、<img src="https://latex.codecogs.com/png.latex?C">＝Kolmogorov定数）。ここで述べられているのは、渦一つ一つの位置ではなく、<strong>スケール間でエネルギーがどう配分されるか</strong>だけです。個々の渦の居場所は誰にも言えない。それでも配分の法則は言える。</p>
</div>
<div class="en-t">
<p>where <img src="https://latex.codecogs.com/png.latex?%5Cvarepsilon"> is the dissipation rate per unit mass, <img src="https://latex.codecogs.com/png.latex?k"> the wavenumber, and <img src="https://latex.codecogs.com/png.latex?C"> the Kolmogorov constant. What this describes is not the position of any individual eddy but only <strong>how energy is distributed across scales</strong>. Nobody can tell you where a given eddy is. The law of the distribution can still be stated.</p>
</div>
<div id="cell-fig-spectrum" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-3"></span>
<span id="cb1-4">k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.logspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span>
<span id="cb1-5">k_L, k_eta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">200.0</span>          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># integral and dissipation wavenumbers</span></span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># von Kármán-type model: -5/3 in the middle, rolled off at both ends</span></span>
<span id="cb1-8">E <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> k_L) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> k_L) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">17</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> k_eta)</span>
<span id="cb1-9"></span>
<span id="cb1-10">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.6</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.9</span>))</span>
<span id="cb1-11">ax.loglog(k, E, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>BLUE, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.2</span>)</span>
<span id="cb1-12"></span>
<span id="cb1-13">band <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> (k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>)</span>
<span id="cb1-14">ax.loglog(k[band], <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.30</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> E[band][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (k[band] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> k[band][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>),</span>
<span id="cb1-15">          color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>RED, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, ls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"--"</span>)</span>
<span id="cb1-16">ax.text(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.30</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> E[band][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> k[band][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.35</span>,</span>
<span id="cb1-17">        <span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">r"</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">$</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">k</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">^</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">{-5/3}</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">$</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>RED, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)</span>
<span id="cb1-18"></span>
<span id="cb1-19">ax.axvspan(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>PAPER, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">.04</span>)</span>
<span id="cb1-20">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wavenumber  $k$"</span>)</span>
<span id="cb1-21">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$E(k)$"</span>)</span>
<span id="cb1-22">ax.set_ylim(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-9</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb1-23">ax.set_yticks([])</span>
<span id="cb1-24">ax.text(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.35</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2e-3</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"energy-</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">containing"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb1-25">ax.text(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2e-6</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"inertial subrange"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb1-26">ax.text(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">220</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2e-6</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dissipation"</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DIM, fontsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>)</span>
<span id="cb1-27">fig.tight_layout()</span>
<span id="cb1-28">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="fig-spectrum" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-spectrum-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://eigen-kentaro.com/blog/posts/2026-07-28-photograph-as-snapshot/index_files/figure-html/fig-spectrum-output-1.png" width="776" height="398" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-spectrum-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: A schematic energy spectrum: energy-containing range, the k^(-5/3) inertial subrange, and the dissipative fall-off. Drawn from a model function, not from measurement.
</figcaption>
</figure>
</div>
</div>
</div>
<div class="jp">
<p>念のため書いておくと、これは<strong>比喩であって、主張ではありません</strong>。写真の輝度場が Kolmogorov 則に従う、と言っているのではない。輝度の空間スペクトルは自然画像でおおむねべき乗則に近いことが知られていますが、それは乱流のカスケードとは別の話です。ここで借りているのは<strong>ものの見方の構造</strong>だけです。</p>
</div>
<div class="en-t">
<p>To be explicit: this is a <strong>metaphor, not a claim</strong>. I am not saying that the luminance field of a photograph obeys Kolmogorov’s law. Natural images are known to have roughly power-law spatial spectra, but that is a separate matter from the turbulent cascade. What is being borrowed here is only the <strong>structure of a way of seeing</strong>.</p>
</div>
</section>
<section id="language" class="level2">
<h2 class="anchored" data-anchor-id="language">一枚を語る言葉 / The language for one frame</h2>
<div class="jp">
<p>そう考えると、写真について語るときに二つの言葉が要ることがはっきりします。</p>
<p><strong>一枚について語る言葉</strong>は、再現不能な実現値についての言葉です。あの日の光、あの人の歩幅、あの雲の切れ方。統計に還元した瞬間に消えるもので、だからこそ一枚を撮る意味がある。</p>
<p><strong>シリーズについて語る言葉</strong>は、統計についての言葉です。何を撮り続けているのか、どのスケールに目が向いているのか。これは一枚では見えず、100枚を並べて初めて出てきます。自分の写真の「スペクトル」は、自分では意外と見えていません。</p>
<p><span class="mincho">捨てられないから撮るのではなく、二度と戻らないから撮る。</span></p>
</div>
<div class="en-t">
<p>Seen this way, it becomes clear that talking about photographs requires two languages.</p>
<p><strong>The language for one frame</strong> is a language about an irreproducible realisation: the light of that day, that person’s stride, the way those clouds broke. It vanishes the instant you reduce it to a statistic — which is precisely why single frames are worth making.</p>
<p><strong>The language for a body of work</strong> is a language about statistics: what you keep photographing, which scales your eye goes to. It is invisible in one frame and only emerges when a hundred are laid side by side. One’s own “spectrum” turns out to be surprisingly hard to see from the inside.</p>
<p><span class="mincho">Not because it can be kept, but because it will never come back.</span></p>
</div>
<div class="jp">
<p>このブログの [藝] 側は、しばらくこの二つの言葉を行き来する場所になると思います。DSLR の作品はハブの藝セクションに、撮り方と考えたことはここに置いていきます。</p>
</div>
<div class="en-t">
<p>The turbulent side of this blog will, for a while, move back and forth between those two languages. The DSLR work itself lives in the 藝 section of the hub; how it was made, and what I thought while making it, will live here.</p>
</div>
<div class="sig">
<p>健太郎</p>
</div>


</section>

 ]]></description>
  <category>turbulent</category>
  <category>photography</category>
  <guid>https://eigen-kentaro.com/blog/posts/2026-07-28-photograph-as-snapshot/</guid>
  <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
