温度を変えても、内部はすぐには追いつかない。
物体を小さな「熱を蓄える点」と、それらをつなぐ「熱の通り道」で表してみます。外側の温度を変えると、内側の温度は時間をかけて追いつきます。この遅れが、外から見た過去の影響=記憶を生みます。
ここでは、熱容量は正、伝導率は非負で、どちらの向きにも同じ伝導率を持つ線形模型に絞ります。
入力する境界を選び、時間を動かしてみてください。他の3境界は基準温度に保ちます。
合成回路の解析解。各内部容量4 J/K、内部から隣接境界への伝導率0.5 W/K。境界の直接伝導は隣接間0.75 W/K、対向間1 W/K。温度差1 Kを1秒で立ち上げます。表示している4個は境界を除いた内部の個数です。線の交差は接続点ではありません。
カオス理論とのつながりは?
出発点は、多数の変数を少数へ置き換える「粗視化」でした。内部を消すと記憶が残るという問題は、カオスやMori–Zwanzig理論ともつながります。ただし、このページで扱うのはカオスのない線形熱伝導。ここで得た下限を、非線形カオスの予測保証へそのまま広げることはできません。背景の式と文献
4回の実験で、外からの応答を集める。
毎回、全体を同じ初期平衡へ戻します。B1、B2、B3、B4を一つずつ同じ波形で加熱し、各境界で温度を保つために注入する熱流を測ります。1つの入力に4つの出力。合わせて16本の応答が得られます。
応答には、最後まで残る定常分と、次第に弱くなる過渡分が混ざります。内部の遅れを取り出すため、立上り完了後に、同じ長さの窓を二つ並べて積分します。
この表示は計算例で、実測データではありません。正負を含む熱流を、温度上昇幅で割っています。窓は1秒の立上り+0.1秒の待機の後に置きます。
次へ:16本の応答を、1枚の行列へ →二つの窓の差を並べると、内部の情報が残る。
「出力の境界」を行に、「入力の境界」を列にして、16個の差を並べます。これが4×4行列 D です。前の図で選んだ実験に対応するマスを枠で示しています。
この合成例では、窓の取り方を変えると全体が同じ倍率 a で変わります。
既知の倍率で割れば、後で何度も登場する H₀ になります。
「非負ベクトルから作る」とは?
4つの境界への寄与を、4個の非負の数 f=(f₁,f₂,f₃,f₄) で表し、すべての組の積 fᵢfⱼ を並べます。これが外積 ffᵀ。その足し合わせが D=FᵀF、F≥0 です。Fの行が1本のベクトルに対応します。
理想ステップの後に置く二窓では、任意の内部状態数rについてcp-rank(D)≤r。一般の共通単調ランプでは、ここで必要なr≤3の主張を証明しています。数学的な因子を、実物の各部品に一意に対応づけて同定したという意味ではありません。測定からの因子分解の証明
引き算を許すと3本。非負だけなら4本。
H₀は、符号を自由に使えば3本のベクトルで作れます。でも、非負のベクトルだけを使うと4本必要です。切り替えて、各ベクトルの寄与を見比べてください。
H₀のゼロは、B1とB3、B2とB4の組にあります。非負の積は足しても打ち消せないため、1本のベクトルが向かい合う2点を同時に受け持つことはできません。結果として、四角形の4辺にそれぞれ1本が必要になります。
特定の単一緩和率を持つ熱回路では、この完全正値ランクが必要な内部熱容量の最少個数と一致します。抽象的な3状態で外部応答を計算することと、3個の熱容量・非負の伝導率で同じ応答を作ることは、異なる要求なのです。
熱回路へ結びつける正確な条件
正の対角内部容量、非負の相反熱伝導、指定した境界温度→境界熱流の応答を考えます。目標が Y(s)=K+sCB+sλH/(s+λ) のとき、Hが完全正値、かつ −Kᵢⱼ≥λHᵢⱼ(i≠j)が実現条件です。成立すると、最少内部容量数=cp-rank(H)。既知の境界容量CBは個数に数えません。
「数式の3状態」は既知の微分項sCBを除いた動的部分の次数です。負の温度差そのものが禁止なのではなく、混合座標を個別の熱容量へ戻す際の結合条件が問題になります。必要性と構成による十分性の証明
ゼロを少し埋めても、壁は残る。
H₀の全ての成分に同じρを加えた行列 Hρ=H₀+ρJ を考えます。ゼロがなくなっても、すぐには3状態へ減りません。必要数が3になる境界はρ=1/2です。この族と境界は既知の研究に基づきます。[34] [56]
異なるρでは目標応答も変わります。1つの物体が物理的な相転移を起こす図ではありません。ここでのρ∈[0,1]は、指定した回路構成が可能な範囲内です。
この3種類の値から、限界を1本の線にする。
今回の導出では、既知の幾何定理を使って、3状態以下に必ず成り立つ境界を求めました。
M(d,z) = min{ √[z(2d−z)], (d+z)/2 }d≥0、0≤z≤d、m≥0。z>dならdへ切り詰めます。
境界ぴったりの例を作って「鋭さ」を確かめる
対角上限をd=1にそろえ、zを選ぶと、境界を達成する3行以下の因子を構成できます。
個々の測定値全てに一致する3状態模型がある、と判定する式ではありません。今回の明示式の学術的な初出は未確認です。境界の証明と文献照合
次へ:測定値に誤差があっても使える? →誤差を、3状態に有利な向きへ広げてみる。
現実の測定はぴったりの値ではありません。以下は、既知の倍率aで割ったH₀の無次元尺度での説明です。その各成分に、最大ηの誤差を認めます。四辺は小さめに、対角と向かい合う組は大きめに見積もり、それでも境界を越えるかを調べます。
H₀の場合、この条件はとても短い計算になります。
したがって η ≥ 1/6
自分の集約値を入れて判定する
4×4の対称化済み測定行列から、四辺の最小値m、対向する2組の最大値z、対角の最大値dを求めます。ηは、全成分を同時に覆う誤差幅です。全て同じ単位で入力してください。
簡易判定器 — 最良集約式 c² > Ξ(d,z)
最良集約式 c² > Ξ(d,z) による十分条件。初期値は熱回路の設計例。測定値の集約と誤差幅を変更できます。
標準偏差や相対誤差率を、そのままηに入れることはできません。統計的な信頼区間を使う場合も、全成分を同時に覆う保証が必要です。
達成できない精度を、設計の前に見分ける。
少ない状態で実装したいとき、調整を続ければ目標精度へ届くとは限りません。この判定は、選んだ模型の種類と状態数で、目標精度が原理的に可能かを調べるために使えます。
1 Kを1秒で線形に立ち上げ、0.1秒待ってから、各5.025725秒の二窓を測る例です。容量の尺度1 J/K、緩和率0.25 s⁻¹。4回の入力実験・4出力・観測区間のどこかで、この大きさ以上の誤差が必要になります。
行列の誤差下限を、波形の誤差へ戻すには、積分の長さを使います。熱流応答の最大誤差をEとすると、二窓差の誤差は高々2hE。したがって、この合成例では E≥a/(12h) です。前の窓幅スライダーと同じ解析式による換算です。
全ての出力に常時7.32 mWの誤差が出る、という意味ではありません。温度予測の誤差下限でもありません。合成回路での理論値で、実物・製品データによる検証は未実施です。
熱モデル
複数境界を持つ簡略化モデルで、内部状態をどこまで減らすかの判断に。ただし、ここでの入力は温度、出力は熱流です。
抵抗・コンデンサ回路
電圧と電流で同じ数式を実験できます。総立上り1 msの区分二次波形など、指定した電気的縮尺では約7.312 µAの対応下限が得られます。
分かったことと、まだ分からないこと。
到達点は、既知の幾何定理から、状態数を判定する鋭い数式を導き、誤差のある有限時間測定へつないだことです。証明の有無と、学術的に初めてかどうかは別に評価しています。
| 内容 | 現在の位置づけ |
|---|---|
| H₀の「通常ランク3/CPランク4」、Hρの境界、基礎の幾何定理 | 既知先行研究へ帰属。 |
| 三集約値の最良境界、誤差区間への適用、有限時間の熱流下限 | 証明を記録今回導出・独立監査。同じ式の先取性は未確定。 |
| ρ=0.4で既存SDPの一つは下界3に留まり、今回の式は3状態を排除 | 厳密比較有理数の証明書を検算。既存手法全体より強いとは言わない。 |
| 最小近似誤差そのもの、実機での有効性、未読文献との重複 | 未解決・未確認次の検証対象。 |
最小の誤差は、まだこの間にある。
H₀から3行以下の非負因子で作れる行列までの、最大成分誤差の最小値をD₃とします。
上側は具体的な近似行列の構成から、下側は今回の不等式から得ています。三集約値の境界を完全に求めても、元の行列の全成分を同時に近づける問題まで解けたわけではありません。
本ノートの局所探索では約0.196676467を得ており、追加査読でも同じ値が繰り返し得られたと報告されています。下界をこの値へ近づける方向が有望という数値的な手掛かりです。ただし、よりよい近似が存在しないことの証明ではありません。
文献照合では、松本の1981年原論文などの条件を確認しました。一方、Stein(1973)、Matsumoto(1982)、Kandić–Reljin(2009)の中心本文は未取得です。今回の結果の優先権を確定したとは扱いません。照合の詳細
証明、出典、再現コード。
ここからは専門的な記録です。本文の説明に対応する詳細を開けます。探索途中の数値と判断は、当時の記録として保持しています。現在の到達点は第8章と「最新の証明」を優先してください。
数値の変遷 — 現在の下限は1/6
以下は同じH₀に対する最大成分誤差の下限の推移です。上界0.196676467…は別の具体的な近似構成から得た値で、下限の更新と混同しません。
| 記録 | 係数誤差の下限 | 指定実験での熱流下限 |
|---|---|---|
| 初期の結果 | 約0.049038 | この段階では同じ二窓実験の値を提示していない |
| 追究2 | 約0.097168 | 約4.2687 mW |
| 追究3 | 約0.101021 | 約4.4379 mW |
| 追究4・現在 | 1/6 ≈ 0.166667 | 約7.3219 mW |
熱流の3行は、容量尺度1 J/K、緩和率0.25 s⁻¹、1 Kを1秒の線形ランプで立上げ、0.1秒待機、各窓5.025725秒の同じ合成例。下限の保証が強まったのであって、模型の実際の誤差を減らした結果ではありません。数式と現在の判断は最新の証明を参照してください。
A. 最新の証明:鋭い集約式・誤差下限・既存SDPとの厳密比較
三つの集約値から得られる、最良の状態数判定
今回の文献照合から、前回は予想として残した不等式を証明できた。既知のCPランク3の幾何学的判定定理を、測定量の三つの集約値だけで使える鋭い式へ変換した結果である。係数誤差の下限は約0.101から1/6へ改善し、特定の既存SDPでは判定できない行列も、この式で排除できると厳密に確認した。
A. 何を測り、どの三つの数へまとめるか
前節からの対象は、正の熱容量と非負の相反熱伝導だけからなる線形模型である。4か所の境界温度を一つずつ同じ波形で変え、各境界の熱流を二つの等長窓で積分して差を取る。この4×4行列をXとする。所定の初期化・波形・観測条件の下で、内部状態3個以下ならX=FᵀF、F≥0、Fの行数≤3となる。実験条件の全体は追究2と追究3に記す。
z:X₁₃、X₂₄の上限(反対頂点の組)
m:X₁₂、X₂₃、X₃₄、X₄₁の下限(サイクルの四辺)
d≥0、0≤z≤d、m≥0として、これらの条件を満たすCPランク3以下の行列で、サイクル最小値をどこまで大きくできるかを考える。
この上限は全てのd,zで達成できる。したがってm>M(d,z)なら3状態以下を排除でき、m≤M(d,z)なら、この三つの不等式を満たす3行以下の非負因子が実際に存在する。後者は、元の測定行列の全成分に一致する模型があるという意味ではない。z>dの場合はCauchy–Schwarzによりzをdへ切り詰められ、d=0の場合は零行列だけである。
B. 既知の幾何定理からの完全な証明
中心となる先行結果は、Brandts–Křížek(2016)のCorollary 3.6と式(6)。対ごとに一次独立な有限個の3次元ベクトルが非負八分空間へ等長に配置できるなら、2本が同じ座標を0に持つ、すなわち一つの座標平面上にある配置も選べる。比例する組や零ベクトルがある場合は、下の摂動と極限の段落で扱う。この既知定理を使い、「その2本が隣接するか、反対頂点か」を尽くす。[34]
補題:2次元なら m²≤dz
4本のベクトルが非負の2次元平面にあるとする。零ベクトルがあればm=0で自明。そうでなければ角度が最小のviを取り、そのサイクル上の隣接2本をvj,vkとする。両方が同じ角度側にあるので、det(vi,vj)、det(vi,vk)は非負。次の式は、Lagrange恒等式の2次元版である。
=−det(vi,vj)det(vi,vk)≤0.
j,kは反対頂点の組だから、m²≤XijXik≤XiiXjk≤dz。□
強い不等式 m²≤z(2d−z) の証明
まず3次元のGramベクトルが全て非零で、どの2本も比例しない、すなわち対ごとに一次独立な場合を考える。既知定理によって2本を一つの座標平面へ置ける。z=dならm≤dから自明なので、z<dとする。
反対頂点の組を平面へ置ける場合:例えばv₁,v₃とする。全ベクトルをその座標平面へ射影しても非負性は保たれ、全てのサイクル内積は変わらない。各サイクル辺が必ずv₁かv₃に接しているためである。対角成分と反対頂点間の内積は増えない。射影で落とす座標は各ベクトルで非負なので、内積から引かれるのは非負数どうしの積(対角ならその平方)だからである。2次元の補題からm²≤dz≤z(2d−z)。
隣接組を平面へ置ける場合:例えばv₁,v₂とし、a=X₁₁、b=X₂₂、r=X₁₂、u=X₁₃、x=X₂₄、v=X₁₄、w=X₂₃と置く。残る2本の射影内積はP=N/Δ、Δ=ab−r²>0で、
射影先が非負座標平面だからP≥0。ここでm²>z(2d−z)を仮定して矛盾を出す。d≥a,b、r≥m、u,x≤z、v,w≥mから
≤dz(v+w)−m(z²+vw)
≤m[2dz−z²−m²]<0.
第2行へ進むときはu,xをzへ増やす。偏微分はdv−mx、dw−muで、ともにm(d−z)以上。最後はv,wをmへ下げる。偏微分dz−mw、dz−mvは、仮定からdz−m²<0。従って全ての不等式の向きが保証される。P≥0と矛盾する。
比例・零ベクトルや階数低下は、Fを任意に近い正の3行行列で一般位置に摂動し、その行列のd,z,mを取って極限を送ればよい。非負性を保つ近似を選べ、集約値は連続、z≤dはCauchy–Schwarzから常に成立する。実際の集約値から、与えられた上下限への拡張は単調性による。□
もう一つの上限と、両方の達成例
∥v₁−v₂+v₃−v₄∥²≥0より、四辺の和は2(d+z)以下。従ってm≤(d+z)/2。この部分は半正定値性だけで成立する。
0≤z≤d/5:a=√(z/2)、b=√(d−z/2)、c=√(d−2z)とし、Fの3行を次のように取る。
| 0 | a | b | 2a |
| 2a | b | a | 0 |
| c | 0 | 0 | c |
全対角はd、反対頂点間はz、三辺が2ab=√[z(2d−z)]、残る一辺がd−2zとなる。(d−z)(d−5z)≥0から残る辺も2ab以上。平方根の上限を達成する。
d/5≤z<d:対角d、反対頂点間z、四辺(d+z)/2の対称巡回行列を取る。これはsHρ、s=(d−z)/2、ρ=2z/(d−z)≥1/2。既知定理から得たHρの判定、または§6の明示非負因子によりCPランク≤3である。z=dではdJが達成する。両上限の交点はz=d/5であり、全領域で表示した最小値が達成できた。□
C. 測定誤差と、実用単位への換算
実測D̂の全成分誤差がη以下なら、c=max(0,mincycleD̂−η)、z₊=max(0,maxoppositeD̂+η)、d₊=max(0,maxdiagD̂+η)を使う。上包絡はd,zに対して非減少なので、
c>0、c²>Ξ(d₊,z₊) ⇒ 全ての3状態以下の候補を排除。
判定器をこの最良集約式へ更新した。測定と模型の許容誤差を合わせるなら、前と同じくη=ηmeas+2hE。区間に整合する模型の排除であって、雑音の分布や実物の材料層数を推定するものではない。
既知の四角形行列H₀(対角2、四辺1、反対頂点間0)からの最大成分誤差をε<1とすると、(1−ε)²≤ε(4+ε)、従ってε≥1/6。前回の代数的上界と合わせ、
D₃=infF∈ℝ₊3×4∥FᵀF−H₀∥max.
集約境界の達成行列は、H₀の全成分の誤差条件を満たすとは限らない。例えばε=1/6の最初の達成因子には、四辺の一つが11/6になるものがあり、許容上限7/6を超える。よってD₃=1/6を証明したわけではない。
| 同じ合成回路での設計値 | 前回の保証 | 今回の保証 |
|---|---|---|
| 係数誤差の下限 | 0.1010205144… | 1/6≈0.1666667 |
| 1秒の線形ランプ、1 K加熱 | 4.437948 mW | 7.321860 mW |
| 1秒の区分二次ランプ、1 K加熱 | 4.432179 mW | 7.312341 mW |
s=1 J/K、λ=0.25 s⁻¹、待機0.1秒、各窓5.025725秒。4回の境界入力実験・4出力・観測区間のどこかで避けられない誤差の床である。実測や製品性能の値ではない。電気的縮尺s=1 µF、λ=250 s⁻¹、1 V入力なら、総立上り1 ms、待機0.1 ms、各窓5.025725 msへ時間も縮尺した区分二次ランプの対応値は約7.312 µA。
対角成分の尺度が大きく違う場合:既知の正規化を使う
Xの対角が正ならRij=Xij/√(XiiXjj)としてよい。正の対角合同はCPランクを保存する既知の操作である。[58] Rの対角は1だから、サイクル最小値と反対頂点間の最大値にM(1,z)を使える。
個別の区間Lij≤Xij≤Uijがあり、全てのLii>0なら、安全な集約値は次のとおり。
zR=min{1,maxopposite max(0,Uij)/√(LiiLjj)}.
cR>M(1,zR)ならCP3を排除できる。対角の下限が0以下のときはこの割り算を使わない。これは既知の正規化と今回の包絡の直接系で、全区間を使う最良の判定ではない。下の三数値の判定器は元の共通単位の式を使っており、この正規化を自動では行わない。
D. 特定の既存SDPを上回る、厳密な比較例
前回は、以前の簡易式よりFawzi–ParriloのSDPが強い範囲を示した。今回の強化式では比較結果が変わる。Fawzi–ParriloのarXiv:1404.3240v1の式(51)の最適値が厳密に3へ留まるのに、強化式はCPランク3以下を排除する例を得た。[41]
τcpsos(A)=3、 m²−z(2d−z)=1/5>0.
ここでcircは最初の行を(12,7,2,7)として巡回させた4×4行列。t=3のSDP可行点を有理数で明示し、全36個の小行列式制約と16個の対角制約を検算した。半正定値制約は正の有理係数による外積和で証明し、浮動小数点ソルバーの成功表示に依存しない。通常ランク3による既知下界と合わせ、最適値が3と確定する。
有理数の可行点と半正定値性の証明
追究3の有理直交列Uを使い、g=28/5、A=U diag(g,2,2)Uᵀとする。9次元の列順座標でp=e₀₀、q₁=e₁₁、q₂=e₂₂、a=gp+2q₁+2q₂、v₁=e₀₁+e₁₀、v₂=e₀₂+e₂₀と置く。
X=(U⊗U)Y(U⊗U)ᵀ、t=3.
Y−aaᵀ/3≥0は表示から分かる。D=diag(g,2,2)⊗diag(g,2,2)に対し、D−Yは次の外積和である。下式でw₁=e₀₁−e₁₀、w₂=e₀₂−e₂₀。
+(g/3)(v₁v₁ᵀ+v₂v₂ᵀ)+g(w₁w₁ᵀ+w₂w₂ᵀ)
+4e₁₂e₁₂ᵀ+4e₂₁e₂₁ᵀ≥0.
残る対角制約の余裕Aij²−Xij,ijは1/25、148/75、8/75のいずれかで全て正。小行列式の36等式も全て厳密に一致する。下のコードで元の16×16変数へ戻して検算できる。□
この比較は既存の式(51)への単純な包含ではないことを示す。他の強いモーメント階層や既知の完全なCPランク3判定より優れる、という意味ではない。また、この集約式は通常ランク4の全行列を検出するわけでもなく、既存SDPを一般に置き換えるものではない。
| Hρでの比較 | 3状態以下を排除できる範囲・例 |
|---|---|
| 追究3の簡易式 | ρ<3−2√2≈0.171573 |
| 既存SDP・式(51) | 解析的に少なくともρ<0.309017を保証。ρ=0.4では最適値3で排除できない。 |
| Melissen(1998)の球面配置定理からの直接判定 | ρ<(√3−1)/2≈0.366025 [57] |
| 今回の強化した集約式 | ρ<1/2。既知の正確な境界まで到達する。 |
E. 古典的な回路合成論文は、どこまで照合できたか
| 文献 | 今回読めた範囲 | 具体的な比較結果 |
|---|---|---|
| Matsumoto 1981 | 大学公開原論文。定義・定理・証明・回路図を確認。[54] | 「接地」はポートの共通帰線。浮遊容量を許すため、全容量が対角という今回の条件と同一ではない。 |
| Ali 1976 | 大学公開学位論文、pp.6–7、式(2.1)–(2.5)。[55] | 正則な平方変換による境界応答の不変性。全ての物理的次数にわたる最小性は述べていない。 |
| Kandić–Reljin 2008 | 出版社PDFで欠けていた式(5.3)–(5.4)も確認。[48] | 他ポートを開放したスカラーimpedanceの合成。指定された多端子行列全体のCP最小実現とは一致しない。 |
| Stein 1973、Matsumoto 1982、Kandić–Reljin 2009 | 要旨・書誌を越える中心本文は依然未取得。[46] [33] [47] | これらの結果との重複を確定したとは言えない。特に接地容量の個数・非最小実現は重要な未照合点。 |
Matsumoto(1981)の式(6b)では、容量行列は[[A∞+LᵀL,LᵀP],[PᵀL,PᵀP]]。回路図にも節点間の浮遊コンデンサがある。本文は十分構成条件を与え、失敗時には非最小実現を使う案も述べる。したがって「古典理論は非最小実現を考えていない」とも言えない。1981年と未読の1982年を同一の定理として扱わない。[54]
古典変換と今回のCP条件の、近さを数式で確認する
以下は原論文の主張の引用ではなく、今回の独立な比較である。単一極の目標をY(s)=D+sCB−λ²H/(s+λ)、D=K+λHと書き、H=RᵀR、n=rank Hとする。最小な抽象実現は内部行列−λI、入力λRで表せる。
Howitt変換のT=[[I,0],[L,P]]はPが正則な平方行列。容量を全て対角に制限するとPᵀL=0からL=0、PᵀPを正対角にするにはP=OS(O直交、S正対角)。境界と内部の伝導の符号条件はOᵀR≥0になる。これはrank H本で非負Gram分解できるかという既知の幾何問題と同じである。
さらにr>nへの拡大を許す非負因子の問題は、
と書ける。平方の座標変換と高次元への埋め込みを区別する必要がある。今回の星形構成には境界辺の非負条件も要る。これで古典枠との数学的な接続は明確になったが、未読論文が同じ最小性を既に扱うかは、この書き換えだけでは判定できない。
新しい取得候補としてRichard Adolph Steinの1968年UBC学位論文も見つかったが、本文は取得できていない。要旨が扱うimpedance・容量木の条件を、1973年のadmittance定理の代わりには使わない。[59]
F. 新規性について、今回確定したことと残ること
Hρの作り方自体も、Shaked-Monderer(2001)Example 2.1のA+ε(A1)(A1)ᵀと一致する。H₀1=4·1なのでρ=16εで同じ族になる。さらにMelissen(1998)の球面八分域への4点配置からも、最適化不要の定量的なCP3排除条件が得られる。「正成分の例」や「計算の軽い量的判定」という一般概念も独自性には数えない。[56] [57]
Melissen(1998)の既知の定量判定との対応
非負の単位球面上の4点について、最小相互距離を最大化した値は√(2−2/√3)。従ってCP3の4本の非零Gramベクトルには、正規化した内積が1/√3以上となる組がある。Hρでの最大内積は(1+ρ)/(2+ρ)なので、ρ<(√3−1)/2なら排除できる。H₀の全成分誤差箱ではε<(3√3−5)/2≈0.0980762が十分となる。これらの代入計算は今回行ったもので、原論文に同じ式が掲載されているという主張ではない。[57]
既知結果は全6組の最大相関を制約する。今回の式は四辺の最小値と反対頂点間の最大値を区別するため、同一の極値問題ではない。
現在の成果候補は、既知の認識定理から導いた鋭い三集約値の境界、その誤差区間への適用、既存SDPと分離する厳密例である。同じ明示式・同値な極値問題の先取性は未確定。既知定理への依存を明示した、有用な系として記録する。
追加査読では400初期値の局所探索で約0.196676467を再現し、それを下回る値は得られなかったと報告された。この追加計算は査読報告に基づくもので、ここで再実行した結果ではない。下界側を詰める手掛かりとして、既存の上界因子の零成分を参考に、3×4非負因子の支持パターンごとの必要条件を調べる方法が考えられる。ただし、最適因子が同じ支持を持つとは未証明であり、全成分が正の因子も含めて検討する必要がある。
次の数学的な問いは、全成分を使ったH₀からCP3までの最適距離、対角スケーリングも選びながら非一様な誤差区間を最良に判定する方法、そしてこの最良集約式に相当する既刊の幾何学的極値問題があるか。実用側は、RCアナログで校正誤差を含めても棄却余裕が残るかである。実機検証や未取得本文の照合を済ませたことにはしない。
追加査読から、Berman–Shaked-Monderer(2003)の単行本と、Bomze–Dickinson–Still(2015)を次の照合候補に加えた。前者は書誌、後者は書誌・要旨を確認した段階で、関連定理の本文照合は残る。2015年論文の主題はCPランクとCP-plusランクの位相構造などであり、今回の4×4の三集約境界と同じ明示式があると確認したわけではない。[60] [61]
証明は別担当が独立監査。SDP比較は有理演算で全制約を確認。達成因子の両枝・端点・尺度は33ケースで実装確認し、最大相対差4.45×10⁻¹⁶。数値検査は一般証明を置き換えない。文献台帳は61件で、本文確認と要旨のみを区別している。
最良集約式の達成因子・設計値の再現
"""Reproduce sharp aggregate bounds and the physical design constants.
Python standard library only. The general theorem is proved in the HTML;
these finite checks verify explicit attaining factors and implementation.
This script does not claim a global solution of the H0 approximation problem.
"""
from pathlib import Path
import json
import math
def envelope_squared(d, z):
d = max(0.0, d)
z = min(max(0.0, z), d)
return min(z*(2*d-z), (d+z)**2/4)
def gram(f):
return [[sum(row[i]*row[j] for row in f) for j in range(4)]
for i in range(4)]
def attaining_factor(d, z):
assert d > 0 and 0 <= z <= d
if z <= d/5:
a, b, c = math.sqrt(z/2), math.sqrt(d-z/2), math.sqrt(d-2*z)
return [[0,a,b,2*a],[2*a,b,a,0],[c,0,0,c]]
if z == d:
return [[math.sqrt(d)]*4,[0]*4,[0]*4]
# Scaled H_rho with rho=2z/(d-z), using the known octant rotation.
s = (d-z)/2
h = math.sqrt((d+z)/(d-z))
q = math.sqrt(3/8)
return [[math.sqrt(s)*v for v in row] for row in
[[h/2-q,h/2+q,h/2+q,h/2-q],
[q*h-1/4,q*h-3/4,q*h+1/4,q*h+3/4],
[q*h+3/4,q*h+1/4,q*h-3/4,q*h-1/4]]]
def phi(x):
return -math.expm1(-x)/x if x else 1.0
def main():
cycles = [(0,1),(1,2),(2,3),(3,0)]
worst = 0.0
count = 0
for d in [1e-6,1.0,1e6]:
for ratio in [0,.001,.01,.05,.1,.199,.2,.201,.4,.75,1]:
z = d*ratio
f = attaining_factor(d,z)
a = gram(f)
assert min(min(row) for row in f) >= -1e-12*math.sqrt(d)
m = min(a[i][j] for i,j in cycles)
error = max(max(abs(a[i][i]-d) for i in range(4)),
abs(a[0][2]-z),abs(a[1][3]-z),
abs(m-math.sqrt(envelope_squared(d,z))))/d
assert error < 5e-13
worst = max(worst,error)
count += 1
lam,total_rise,tau = .25,1.,.1
h = 1.2564312086261697/lam
linear_a = math.exp(-lam*tau)*phi(lam*total_rise)*(-math.expm1(-lam*h))**2
quadratic_a = math.exp(-lam*tau)*phi(lam*total_rise/2)**2*(-math.expm1(-lam*h))**2
result = dict(
theorem_source='Brandts-Krizek 2016 Corollary 3.6; quantitative specialization derived here',
exact_noise_radius='1/6 (sufficient open max-entry ball; not the exact distance)',
attaining_factor_cases=count,
maximum_relative_factor_error=worst,
full_matrix_distance_lower='1/6',
full_matrix_distance_upper_strict='0.196676467057347',
design=dict(s_J_per_K=1.,lambda_per_second=lam,total_rise_seconds=total_rise,
hold_seconds=tau,window_seconds=h,
linear_coefficient=linear_a,quadratic_coefficient=quadratic_a,
linear_heat_flow_floor_W_per_K=linear_a/(12*h),
quadratic_heat_flow_floor_W_per_K=quadratic_a/(12*h)),
scope='Synthetic mathematical model; no laboratory measurement. Attainment concerns aggregate constraints, not all entries of the H0 error box.')
(Path(__file__).resolve().parent/'round4-sharp-results.json').write_text(json.dumps(result,indent=2))
print(json.dumps(result,indent=2))
if __name__ == '__main__':
main()
既存SDPとの分離:全制約の厳密検算
"""Exact rational Eq51 primal certificate: tau_cp^sos(H_(2/5)) = 3.
No numerical optimization, no floating-point assertions. PSD constraints
are verified through explicit outer-product decompositions with positive
rational coefficients. All original 36 minor constraints are checked.
"""
from pathlib import Path
from fractions import Fraction as F
import json
import numpy as np
HERE=Path(__file__).resolve().parent
U=np.array([[1,1,1],[1,1,-1],[1,-1,-1],[1,-1,1]],dtype=object)*F(1,2)
W=np.kron(U,U)
g=F(28,5);t=F(3)
A=U@np.diag([g,F(2),F(2)])@U.T
def e(i):
v=np.zeros((9,1),dtype=object);v[i,0]=1;return v
def outer(v):return v@v.T
p=e(0);q1=e(4);q2=e(8);a=g*p+2*q1+2*q2
Y=outer(a)/3+F(4,3)*outer(q1-q2)
for i,j in [(1,3),(2,6)]:Y+=F(2,3)*g*outer(e(i)+e(j))
X=W@Y@W.T
assert np.array_equal(A.reshape(16,1,order='F'),W@a)
schur=Y-outer(a)/3
schur_sum=F(4,3)*outer(q1-q2)
for i,j in [(1,3),(2,6)]:schur_sum+=F(2,3)*g*outer(e(i)+e(j))
assert all(z==0 for z in (schur-schur_sum).ravel())
# Congruence of a positive outer-product sum proves A tensor A - X PSD.
upper=np.diag(np.kron([g,F(2),F(2)],[g,F(2),F(2)]))
upper_sum=(outer(g*p-2*q1)+outer(g*p-2*q2))/3
for i,j in [(1,3),(2,6)]:
upper_sum+=g/F(3)*outer(e(i)+e(j))+g*outer(e(i)-e(j))
upper_sum+=4*outer(e(5))+4*outer(e(7))
assert all(z==0 for z in (upper-Y-upper_sum).ravel())
slacks=[]
for i in range(4):
for j in range(4):
slack=A[i,j]**2-X[i+4*j,i+4*j]
assert slack>=0
slacks.append(slack)
for i in range(4):
for k in range(i+1,4):
for j in range(4):
for l in range(j+1,4):
assert X[i+4*j,k+4*l]==X[i+4*l,k+4*j]
m=F(7,5);d=F(12,5);z=F(2,5)
assert m*m>z*(2*d-z)
assert m*m<=4*z*(d-z) # Do not claim a counterexample for the old weak test.
result=dict(
rho='2/5',t='3',A=[[str(x) for x in row] for row in A],
U=[[str(x) for x in row] for row in U],
Y=[[str(x) for x in row] for row in Y],
X=[[str(x) for x in row] for row in X],
block_psd_by_outer_product_sum=True,
upper_psd_by_outer_product_sum=True,
all_36_original_minor_equalities_exact=True,
diagonal_slack_values=sorted(set(str(x) for x in slacks)),
strong_certificate_margin=str(m*m-z*(2*d-z)),
weak_certificate_margin=str(m*m-4*z*(d-z)),
exact_tau='3: feasible t=3 plus Fawzi-Parrilo ordinary-rank lower bound',
status='Exact counterexample to inclusion for the strengthened test only; old-test general inclusion remains unresolved.')
(HERE/'round4_sdp_primal_exact.json').write_text(json.dumps(result,indent=2))
print(json.dumps({k:v for k,v in result.items() if k not in ['A','U','Y','X']},indent=2))
実行結果:round4-sharp-results.json
{
"theorem_source": "Brandts-Krizek 2016 Corollary 3.6; quantitative specialization derived here",
"exact_noise_radius": "1/6 (sufficient open max-entry ball; not the exact distance)",
"attaining_factor_cases": 33,
"maximum_relative_factor_error": 4.440892098500626e-16,
"full_matrix_distance_lower": "1/6",
"full_matrix_distance_upper_strict": "0.196676467057347",
"design": {
"s_J_per_K": 1.0,
"lambda_per_second": 0.25,
"total_rise_seconds": 1.0,
"hold_seconds": 0.1,
"window_seconds": 5.025724834504679,
"linear_coefficient": 0.44157182494271235,
"quadratic_coefficient": 0.4409977585909775,
"linear_heat_flow_floor_W_per_K": 0.007321859689953764,
"quadratic_heat_flow_floor_W_per_K": 0.007312340891328713
},
"scope": "Synthetic mathematical model; no laboratory measurement. Attainment concerns aggregate constraints, not all entries of the H0 error box."
}実行結果:round4_sdp_primal_exact.json
{
"rho": "2/5",
"t": "3",
"A": [
[
"12/5",
"7/5",
"2/5",
"7/5"
],
[
"7/5",
"12/5",
"7/5",
"2/5"
],
[
"2/5",
"7/5",
"12/5",
"7/5"
],
[
"7/5",
"2/5",
"7/5",
"12/5"
]
],
"U": [
[
"1/2",
"1/2",
"1/2"
],
[
"1/2",
"1/2",
"-1/2"
],
[
"1/2",
"-1/2",
"-1/2"
],
[
"1/2",
"-1/2",
"1/2"
]
],
"Y": [
[
"784/75",
"0",
"0",
"0",
"56/15",
"0",
"0",
"0",
"56/15"
],
[
"0",
"56/15",
"0",
"56/15",
"0",
"0",
"0",
"0",
"0"
],
[
"0",
"0",
"56/15",
"0",
"0",
"0",
"56/15",
"0",
"0"
],
[
"0",
"56/15",
"0",
"56/15",
"0",
"0",
"0",
"0",
"0"
],
[
"56/15",
"0",
"0",
"0",
"8/3",
"0",
"0",
"0",
"0"
],
[
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
],
[
"0",
"0",
"56/15",
"0",
"0",
"0",
"56/15",
"0",
"0"
],
[
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
],
[
"56/15",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"8/3"
]
],
"X": [
[
"284/75",
"154/75",
"8/25",
"154/75",
"154/75",
"48/25",
"14/75",
"8/25",
"8/25",
"14/75",
"4/75",
"14/75",
"154/75",
"8/25",
"14/75",
"48/25"
],
[
"154/75",
"48/25",
"14/75",
"8/25",
"48/25",
"154/75",
"8/25",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"8/25",
"14/75",
"4/75",
"14/75"
],
[
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25"
],
[
"154/75",
"8/25",
"14/75",
"48/25",
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25",
"48/25",
"14/75",
"8/25",
"154/75"
],
[
"154/75",
"48/25",
"14/75",
"8/25",
"48/25",
"154/75",
"8/25",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"8/25",
"14/75",
"4/75",
"14/75"
],
[
"48/25",
"154/75",
"8/25",
"14/75",
"154/75",
"284/75",
"154/75",
"8/25",
"8/25",
"154/75",
"48/25",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75"
],
[
"14/75",
"8/25",
"14/75",
"4/75",
"8/25",
"154/75",
"48/25",
"14/75",
"14/75",
"48/25",
"154/75",
"8/25",
"4/75",
"14/75",
"8/25",
"14/75"
],
[
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25"
],
[
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25"
],
[
"14/75",
"8/25",
"14/75",
"4/75",
"8/25",
"154/75",
"48/25",
"14/75",
"14/75",
"48/25",
"154/75",
"8/25",
"4/75",
"14/75",
"8/25",
"14/75"
],
[
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"48/25",
"154/75",
"8/25",
"8/25",
"154/75",
"284/75",
"154/75",
"14/75",
"8/25",
"154/75",
"48/25"
],
[
"14/75",
"4/75",
"14/75",
"8/25",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"8/25",
"154/75",
"48/25",
"8/25",
"14/75",
"48/25",
"154/75"
],
[
"154/75",
"8/25",
"14/75",
"48/25",
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25",
"48/25",
"14/75",
"8/25",
"154/75"
],
[
"8/25",
"14/75",
"4/75",
"14/75",
"14/75",
"8/25",
"14/75",
"4/75",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"4/75",
"14/75",
"8/25"
],
[
"14/75",
"4/75",
"14/75",
"8/25",
"4/75",
"14/75",
"8/25",
"14/75",
"14/75",
"8/25",
"154/75",
"48/25",
"8/25",
"14/75",
"48/25",
"154/75"
],
[
"48/25",
"14/75",
"8/25",
"154/75",
"14/75",
"4/75",
"14/75",
"8/25",
"8/25",
"14/75",
"48/25",
"154/75",
"154/75",
"8/25",
"154/75",
"284/75"
]
],
"block_psd_by_outer_product_sum": true,
"upper_psd_by_outer_product_sum": true,
"all_36_original_minor_equalities_exact": true,
"diagonal_slack_values": [
"1/25",
"148/75",
"8/75"
],
"strong_certificate_margin": "1/5",
"weak_certificate_margin": "-31/25",
"exact_tau": "3: feasible t=3 plus Fawzi-Parrilo ordinary-rank lower bound",
"status": "Exact counterexample to inclusion for the strengthened test only; old-test general inclusion remains unresolved."
}B. 模型の定義と基礎の証明:熱回路、最少実現、3と4の例
3. 対象を、実際に作れる熱ネットワークへ絞る
固定した境界Bの温度uを外から指定し、その温度を保つために注入する熱流qを測る。内部Iの温度は自由に変化する。各部品は正の熱容量を持ち、部品間は非負の熱伝導率で結ぶ。
- L:無向グラフのLaplacian。辺がなければ伝導率0。各内部連結成分は少なくとも一つの境界へつながるものとし、LIIは正定値とする。
- CI:正の対角内部熱容量。CB:既知の対角境界熱容量。
- 外への熱漏れはモデルに隠さない。温度浴を使うなら境界として数える。
- 境界ラベルと温度/熱流の意味を固定。初期条件0の応答を比較する。
- 減らす数は内部熱容量の個数。既知の境界容量はこの数に含めない。
Y(s) = LBB + sCB − LBI(LII + sCI)−1LIB
sはLaplace変数。K=Y(0)は定常応答、H=Y′(0)−CBは、境界自身の熱容量を引いた低周波の記憶係数である。内部温度を境界の定常温度で表す行列Wを使うと、
H = Wᵀ CI W
となる。ここで≥0は各成分が非負という意味。M-matrixの逆行列とKron縮約は既知理論であり、この式の部品を新規と数えない。[24] [32]
Hを「非負ベクトルfの外積 f fᵀ」の和に表すために必要な最少本数。H=Σ fafaᵀ, fa≥0。通常の行列ランクとは異なる。量子論の完全正値写像や、テンソルのCPランクとも別の概念である。
4. 候補命題:単一緩和極の、厳密な最少実現数
独立導出・証明点検済み既存回路理論との同値性未確定
Kを連結グラフのLaplacian、κij=−Kij(i≠j)、λ>0、CBを指定された非負対角行列とする。次の境界応答を考える。
このYを、上の物理クラスの熱ネットワークで厳密に実現できる必要十分条件は、
実現可能なら、最少内部熱容量数 rmin = cp-rank(H)
λは、境界温度を指定した応答に現れる隠れ内部系の緩和率である。境界まで自由に動かした全物体の減衰率が、全てλになるという意味ではない。H=0ならrmin=0。
証明:必要性と、最少数を達成する構成
必要性
内部がr個なら H=WᵀCIW はr本の非負ベクトルの外積和。よってHは完全正値で、cp-rank(H)≤r。また、高周波極限より LBB=K+λH。LBBの非対角成分は非正なので、κij≥λHijが必要。
十分性
最少の完全正値分解 H=Σa=1r fafaᵀ をとる。零因子は除き、ta=1ᵀfa、wa=fa/ta、ca=ta²、da=λcaとする。
内部点aに容量caを置き、境界iとの伝導率をdawaiとする。内部点どうしは結ばない。境界どうしの直接伝導率はκij−λHijとする。仮定によって全て非負。
直接境界部分のLaplacianは Kdir=K−λ[diag(H1)−H]。内部点aを消去した応答は、
= da[diag(wa)−wawaᵀ] + [sλ/(s+λ)] fafaᵀ
である。総和とKdir、sCBを加えると指定Yに一致する。Kの各正辺は直接辺か内部星を通る経路として残るため、Kが連結なら構成全体も連結。r=cp-rank(H)で必要数を達成する。□
通常の線形系なら、Hの符号を制限しないGram分解を使い、有限極の動的部分をrank(H)状態で表せる。ここで数えるのは、既知の微分項sCBを除いた有限極部分の次数である。非properなY全体を無条件に「通常の3状態ODE」と呼ばない。
定常+一次低周波係数だけを合わせる場合
CBを固定すると、(K,H)の実現可能性は「Hが完全正値、かつKij=0ならHij=0」で特徴づけられ、最少数は同じcp-rank(H)。必要性は、同じ内部連結成分が二つの境界へつながると、その間に正のKron辺が生じることから従う。十分性はλを小さく選んで上の命題を適用する。
ただしλを小さくすれば記憶は遅くなる。二つの低周波係数の一致から、有限周波数帯や有限時間での精度保証は出ない。境界容量を自由に変更してよい場合も別問題となる。
5. 既知の行列を使った、物理的な「3と4」の差
次の行列の固有値は4,2,2,0。通常のランクは3、完全正値ランクは4。この行列例は、置換・定数倍を除いてBrandts–Křížek(2016)§1.2に既出である。[34]
| 2 | 1 | 0 | 1 |
| 1 | 2 | 1 | 0 |
| 0 | 1 | 2 | 1 |
| 1 | 0 | 1 | 2 |
4サイクルの各辺に対応する f=(1,1,0,0)ᵀ等の4本で分解できる。非負因子が二つの異なる辺を同時に担当すると、H₁₃またはH₂₄にも正の値が出てしまう。両成分は0なので、4本が必要になる。
K=4I−J(4境界間の単位伝導率完全グラフ)、λ=1/4、CB=Iとする。内部容量を各4、各内部点から対応する2境界への伝導率を各1/2、境界の直接伝導率をサイクル辺3/4・対角辺1とすれば、
が厳密に実現される。この境界応答は数学的な3内部モードで表せるが、同じ応答を持つ非負伝導・対角容量の温度ネットワークには少なくとも4個の内部熱容量が必要。
Jは全成分1の行列。値は無次元化したモデル単位。3モードモデルを禁止する理由は「温度が負になるから」ではなく、任意の混合座標を、非負伝導率でつながる個別の温度節点へ戻せないからである。
境界B1の温度をu₁(t)=t²e−tで変化させた数値例。緑線は4内部熱容量、丸は3つの抽象状態による境界熱流。同じYなので応答は一致する。これは3個の「物理的な熱容量」で実現できたことを意味しない。
6. ゼロ成分だけに頼らない、明示的な境界
Hρ=H₀+ρJ(ρ≥0)を考える。全てのρでrank(Hρ)=3。ρ>0では全成分が正になる。この族を独立に計算・証明したところ、
cp-rank(Hρ) = 3 (ρ ≥ 1/2)
という境界を得た。追究3の照合で、Brandts–Křížek(2016)のCorollary 3.6と式(6)から直接得られると確認した。新規結果には数えない。既知定理への代入を上に、独立に得た証明を下に記す。物理系の相転移を主張しているわけでもない。K=4I−J、λ=1/4を固定した熱回路の実現には、さらにρ≤3が必要である。
この操作は証明済みの式を表示するもの。最適化ソルバーでCP-rankを推定しているのではない。
閾値1/2の証明
h=√(1+ρ)とし、Rの列を(h,1,0), (h,0,1), (h,−1,0), (h,0,−1)とするとRᵀR=Hρ。3行の非負Gram因子が存在することは、ある3×3直交行列QでQR≥0となることと同値。
Qの第j行を(aj,bj,cj)と書くと、h aj≥max(|bj|,|cj|)。aj>0なので、uj=(bj,cj)/(h aj)は正方形[−1,1]²に入る。直交性より、異なるj,kでuj·uk=−1/(1+ρ)。
正方形の補題
[−1,1]²内の3点には、内積が−2/3以上の組が必ずある。全組が−2/3未満と仮定する。微小摂動で軸上の点を除き、正方形の対称性を用いてA=(−a,b), B=(−c,−d), C=(e,f)、各成分0〜1と書ける。同じ象限の二点は非負内積なので、三点は異なる象限にある。d,eを1へ増やすと、どの内積も増えない。
仮定からb−ac>2/3、a−bf>2/3、c+f>2/3。一方a,b>2/3であり、
となって矛盾する。最後の不等式は、3a²+3b²−2ab−2a−2b≤0と同値。この凸二次式は[2/3,1]²の頂点で最大を取り、頂点値は−8/9,−1/3,−1/3,0。
従って1/(1+ρ)≤2/3、すなわちρ≥1/2が必要。達成にはq=√(3/8)としてQの行を(1/2,−q,q), (q,−1/4,−3/4), (q,3/4,1/4)と取る。Qは直交行列で、ρ=1/2のときQRの行は(0,√(3/2),√(3/2),0), (1/2,0,1,3/2), (3/2,1,0,1/2)。全て非負。ρを増やしても全成分は減らない。
4行の非負因子は全ρで存在する。H₀の辺因子を行に並べた行列をF₀とし、α=(√(1+ρ)−1)/2とすれば、Fρ=F₀+αJに対してFρᵀFρ=Hρ。以上で最少数が決まる。□
C. 研究の履歴:カオスからの出発、旧下限、測定の証明と訂正
探索過程を残すための記録です。旧下限0.049、0.097、0.101などは、最新の1/6へ改善されています。各節の新規性判断も最新の照合を優先してください。節番号は元の研究記録に対応します。
1. カオス理論とは、どこでつながるか
粗視化は、多数の変数を少数へ置き換える操作。カオスは、決定論的な運動が初期値に敏感になる性質である。両者は接点があるが同じものではない。カオスのない線形熱伝導でも、内部を消せば記憶が残る。
⇒ ẋ(t) = −Ax(t) + ∫₀ᵗ B e−D(t−s)Bᵀ x(s) ds + B e−Dtz(0) + f(t)
x は残す変数、z は消す変数。消去は厳密でも、過去の x と初期の z の影響が残る。これを短い履歴・少数の補助状態・雑音などで近似するのが記憶を扱う粗視化である。Mori–Zwanzig は、この発想を非線形・確率系へ広げる枠組みの一つ。[1] [3]
| 保証したいもの | 意味 | 別物として扱う理由 |
|---|---|---|
| 短時間の軌道 | 温度・位置・速度が同じ時刻に近い | カオスでは誤差が増幅しうる。 |
| 一時刻の分布・長時間平均 | 平均、分散、滞在頻度など | 軌道が異なっても一致する場合がある。 |
| 二時刻相関・閾値到達 | 記憶の長さ、過熱のタイミングなど | 一時刻分布が合うだけでは保証されない。 |
カオスから確率モデルへの極限や、乱流の記憶モデルには先行研究がある。今回は線形で証明を追える土台から始めた。以下の命題は、非線形カオス系の予測保証を証明したものではない。[5] [7] [8] [9]
2. 先行研究によって候補から外した一般論
| 当初の切り口 | 既にあるもの | 残すなら必要な差分 |
|---|---|---|
| 指数和で記憶を短縮 | Gaussian求積・Prony・有理近似、正値性と収束 [10–13] | 特定の物理構造を保つ最小数や最適性。 |
| 有限時間の誤差保証 | MZ近似、時間制限付きBT、非零初期値 [3] [29] [39–40] | 既存の一般上界より鋭く、観測から計算できる条件。 |
| 受動性・物理性を保存 | 受動RC、正実補題、グラフ集約 [12] [26–28] | 受動性と「対角熱容量+非負の辺」の区別。 |
| FDTを守って雑音も変更 | FDT保持の実現法と、二つの核を変える一般SVE誤差 [10] [17–22] | 摩擦核だけから雑音因子と動的誤差まで結ぶ鋭い保証。 |
| スカラーの上下界を行列へ | 作用素凸性、block求積、resolventの順序 [14–16] | 成分別順序・半正定値順序・時間域を区別した条件。 |
特に、Lang–LuはFDT整合雑音の変更を将来課題としているが、一般SVEの研究はドリフト核・雑音フィルタの同時近似を既に扱う。「ある論文が未解決と書いている」だけを、分野全体の空白と見なさなかった。[20] [22]
当初の文献台帳には主要59件を掲載した。追加査読の候補2件を加えた現在の台帳は61件である。「本文確認」は関連箇所を読んだことを指し、論文全体の全証明の独立検証を意味しない。要旨のみの文献を本文確認済みとして数えていない。
測定から、これ以上小さくできない物理模型を見分ける
追究4を追加:原論文照合から強化式を証明。誤差下限1/6、最良集約境界、既存SDPと分離する有理数例。今回の調査結果へ。
同じ外部応答を、何個の「本物の熱容量」で再現できるか。単なる数式の状態数と、正の熱容量・非負の熱伝導率だけで作る物理模型の状態数は一致しないことがある。この差を、特定の熱ネットワーク群について厳密に特徴づける命題を導いた。
「新しい粗視化手法」だけでなく、どの簡略化が原理的に不可能かを明示する方向である。熱モデル・受動回路・物理シミュレーションの設計時に、達成できない次数を目標にして探索を続ける無駄を避ける用途が考えられる。
既存理論との差を調べ、実測に使う不等式を磨く
今回の重点は、関連する論文の定理・仮定を照合し、既存の判定法と同じ行列で比較することだった。結論は、広い原理や正確な状態数の境界は既知理論に含まれる。残る候補は、計算の軽い誤差区間の判定式と具体的な測定手順である。同じ式の既刊での使用までは確定できず、「新発見」とは認定しない。
A. 新規性の判定を更新する
| 主張 | 照合した先行研究 | 現時点の判定 |
|---|---|---|
| 正の素子だけで作ると状態数が増える | 正値実現の古典理論・survey [35] [43] | 既知。一般現象を新規性に数えない。 |
| 誤差があっても低次数模型を排除する | Fawzi–Parriloの近似非負ランク下界、Theorem 3 [44] | 定量的な頑健性の原理も既知。 |
| HρのCPランクがρ=1/2で変わる | Brandts–Křížek、Corollary 3.6と式(6) [34] | 既知定理の直接系と確認。下記に代入を記す。 |
| 二窓の非負Gram分解 | 正Hankel核を同じ非負フィルタで両側から積分 [35] [43] | 既存の構造からの直接的な導出。新しい基本原理とは呼ばない。 |
| 単一極の最少内部容量数 | 接地容量を使う多端子RC合成:Stein 1973、Matsumoto 1982、Kandić–Reljin 2009 [46] [33] [47] | 自足的証明はあるが、重要な原論文本文が未読。独立の新定理とは認定できない。 |
| 下記の簡単な不等式・誤差区間への適用 | 既存のCPランクSDPと直接比較 [41] [45] | 独立に導出・監査済み。式そのものの先取性、既存SDPから一般に導けるかは未確定。 |
特にStein(1973)の要旨は、全容量の一端を接地した多端子回路と容量個数の最小化を明示している。「抽象状態数より容量個数が多いから古典理論の対象外」という切り分けはできない。本文未読のため、その最小性の範囲や今回の単一極条件との同値性は未判断である。[46]
ρ=1/2を既知の判定定理に代入して得る
h²=1+ρとし、v₁=(h,1,0)、v₂=(h,0,1)、v₃=(h,−1,0)、v₄=(h,0,−1)と置く。Gram行列はHρ。Brandts–KřížekのCorollary 3.6は、この4ベクトルを非負の八分空間へ回転できるなら、その中の2本が一つの座標平面上にある配置を選べるとする。式(6)により、その平面の法線gは、成分ごとにVᵀV≥VᵀggᵀV≥0を満たす必要十分条件で判定できる。[34]
隣接する組v₁,v₂に対しg=(1,−h,−h)/√(1+2h²)。残りの組の射影内積は
これが非負なのはρ≥1/2。他の隣接組も対称性により同じで、反対頂点の組を座標平面へ置く場合には残り二本のg方向成分の符号が逆になり、式(6)が失敗する。全6組を尽くすので、既知定理から正確な閾値が出る。§6の独立な正方形の証明も正しいが、この閾値を新規発見には数えない。
B. 改善した、最適化を解かない判定式
X=FᵀF、F≥0、Fの行数≤3とする。d=max対角成分、z=max(X₁₃,X₂₄)、m=min(X₁₂,X₂₃,X₃₄,X₄₁)と置く。次が必要である。
z≤d/2ならm²≤4z(d−z)。前回の4zdより強い。z≥d/2ならΨ=d²となり、通常のCauchy–Schwarzの評価に接続する。これは3行非負因子の条件であり、一般の半正定値行列だけでは保証されない。
支持の選び方と対角成分の予算を使う証明
Fの各行を(a,b,c,d₀)と書く。{a,c}の大きい方と{b,d₀}の大きい方を選ぶとサイクルの一辺が定まる。3行以下なので選ばれない辺があり、添字を変えて12とする。全行でa≤cまたはb≤d₀。I={a≤c}、J=その補集合とすると、Jではb≤d₀である。
x=ΣIa²≤X₁₃≤z、y=ΣJb²≤X₂₄≤z。残りの対角予算とCauchy–Schwarzから
右辺はx+y≤dの範囲で各変数について非減少。実際、微分の符号は(d−x)(d−y)−xy=d(d−x−y)で決まり、境界は連続性で処理できる。z≤d/2ならx,yをzに上げて、X₁₂≤2√[z(d−z)]。m≤X₁₂で主張を得る。z≥d/2では全ての辺がd以下なのでm²≤d²。□
測定値D̂の全成分の誤差幅がηなら、c=max(0,mincycleD̂ij−η)、z₊=max(0,maxoppositeD̂ij+η)、d₊=max(0,maxdiagD̂ii+η)とする。Ψはd,zの双方について非減少なので、
許容したい応答誤差Eも含めるには、η=ηmeas+2hEを使う。誤差込み判定器はこの改善式へ更新した。不成立は判定保留であり、3状態で十分とは言えない。
C. 近似できない距離を、上下から厳密に挟む
5−2√6 ≈ 0.1010205144 ≤ D₃ ≤ e < 0.196676467057347.
下界は、誤差ε<1ならm≥1−ε、z≤ε、d≤2+εを上の式へ入れ、(1−ε)²≤8εを解けば得られる。ε≥1は自明。上界は単なる局所最適化の出力から進み、明示した非負因子を有理数の区間演算で認証した。最適距離の決定や、上界の大域最適性は未達成である。
代数的な上界:明示因子と全成分の検算
eをP(s)=2−11s+3s²−2s³+42s⁴−4s⁶の根で、0.196676467057346<e<0.196676467057347にあるものとする。両端での符号は整数演算で反転を確認し、0≤s≤1/5でP′(s)≤−1057/125<0だから根は一意。p=1−e、q=1+e、L=2−e、U=2+eとする。
| √(L−x) | 0 | 0 | √(L−y) |
| √x | p/√x | e/√x | 0 |
| 0 | e/√y | q/√y | √y |
この3×4行列をFとする。x,y,L−x,L−yは厳密区間で正。恒等式ep/x+eq/y=p、p²/x+e²/y=U、および(L−x)(L−y)−q²=P(e)/[(1+e+e²)(1−4e)]=0から、
d₃=e²/x+q²/y ∈ (1.812198069900,1.812198069901).
L<d₃<Uも有理区間で確認できる。従って全成分の誤差はe以下で、最初の対角などはちょうどe。距離の上界が証明できた。下のコードは標準Pythonのみで符号・多項式恒等式・全区間を検算する。
この因子から§4の星形回路を構成できる。λ=1/4、Kの境界間辺重みを1にした例では、直接辺の必要条件も満たす。ただし、この係数近似の上界をそのまま全ての入出力ノルムの上界と呼ぶことはしない。
D. 既存の半正定値計画法と、同じ行列で比較する
Fawzi–ParriloのCPランク下界τcpsos(式51)を実装し、Hρ=H₀+ρJで比較した。ソルバーの浮動小数点出力だけに依存せず、その既存制約から今回、次の下界を導出した。[41]
| 方法 | 3状態以下を確実に排除できるρの範囲 | この比較から分かること |
|---|---|---|
| 前回の簡易式 m²>4zd | 0≤ρ<0.154700538… | 最適化不要。今回改善。 |
| 今回の簡易式 m²>Ψ(d,z) | 0≤ρ<3−2√2≈0.171572875 | 誤差区間へ直接適用できる。 |
| 既存SDPからの厳密下界 | 少なくとも0≤ρ<(√5−1)/4≈0.309016994 | この族では簡易式より強い。 |
| 既知のCPランク3判定定理 | 0≤ρ<1/2 | この行列族の正確な境界。 |
例えばρ=1/4では既存SDPの下界は41/13>3であり、今回の簡易式では排除できない。従って「新しい判定式のほうが強い」という一般主張はしない。用途の候補は、少数の集約値と誤差幅から、最適化を実行せずに結果を説明できる場面である。
既存SDPからの下界の証明と厳密な双対検算
A=Hρとし、vecは列順に並べる。既存SDPは、[[t,vec(A)ᵀ],[vec(A),X]]≥0、Xij,ij≤Aij²、X≤A⊗A、Xij,kl=Xil,kj(小行列式の線形化)を課す。ここで行列間の≥は半正定値順序。これは既存式であり、以下の行列族への評価が今回の導出である。
Uの列を(1,1,1,1)/2、(1,1,−1,−1)/2、(1,−1,−1,1)/2と置く。g=4+4ρならA=U diag(g,2,2)Uᵀ。0≤X≤A⊗AからX=(U⊗U)Y(U⊗U)ᵀ、Y≥0と書ける。
3×3の座標空間でp=e₀₀、q=e₁₁+e₂₂、sab=eba−eab(ab=01,02,12)と置く。Cauchy–Binetにより、小行列式の線形化は圧縮後のYにも成立する。これらを使うと次の恒等式を得る。
= pᵀYp + qᵀYq + ΣabsabᵀYsab.
「directed」は12と21を両方数える意味で、cycleは8項、oppositeは4項。Y≥0と対角制約からpᵀYp+qᵀYq≤S≤8[(1+ρ)²+ρ²]=C。ブロック半正定値制約からg²≤t pᵀYp、16≤t qᵀYq。従ってg²+16≤tCとなり、表示した分数を得る。さらにXをA⊗Aへ増やしたブロックのSchur補完によりt≥vec(A)ᵀ(A⊗A)†vec(A)=rank A=3。□
一般ρについて、この下界とSDP最適値との等号は未証明。数値計算したρ=0,0.10,0.16,0.20,0.25,0.30,0.31,0.49などでは一致したが、証明には数えない。ρ=1/4では双対行列を外積和で表し、全定常条件と目的値41/13をFractionで厳密に検算した。コードを下に収録する。
誤差区間に対する公平な比較と、残る課題
一点でのSDP下界は、誤差区間内の全行列の下界ではない。別途、|A−H₀|≤εの箱全体を保守的に緩和し、Xij,ij≤(H₀ij+ε)Aij、X≤H₀⊗A+A⊗H₀−H₀⊗H₀+16ε²Iへ置き換えた。後者はE=A−H₀についてE⊗E≤∥E∥op²I≤16ε²Iから従う。
この緩い拡張の数値下界はε=0.075で約3.0273、ε=0.10で約2.9269だった。改善簡易式はε<0.1010205を厳密に排除する。ただし、この一つの緩和より良いことは、既存SDPの最善の頑健化より良いことを意味しない。高次モーメント階層も既存研究があり、同じ誤差集合と計算費用で比較する余地が残る。[45]
Fawzi–Parriloの別の非負核ノルム下界は、無重みではH₀に対して(tr H₀)²/∥H₀∥F²=8/3に留まる。これはその特定の基準の限界であり、重み付き変種や他のSDP全体についての結論ではない。近似非負ランクへの拡張自体は同論文Theorem 3に既にある。[44]
E. 有限立上りを、全状態数へ拡張できる入力波形
前回は任意の共通単調波形について「3状態以下」を扱った。今回は入力波形を設計する。非負の確率測度νを[0,T]に取り、入力の微分をdg=ν∗νとする。立上りは時刻2Tまでに完了する。終了後τ>0から二窓を測ると、
F=e−Qτ/2Φ(Q)AhB ≥0,
D=FᵀF、従って cp-rank(D)≤r は任意の内部状態数rで成立。
自己畳み込みを使う理由と、実装できる具体的波形
二窓差はBᵀe−Qτ[∫e−Q(2T−v)dg(v)]Ah²B。dg=ν∗νなら角括弧はΦ(Q)²になる。Qの関数は対称で可換なのでD=FᵀF。指数行列・Φ・Ah・Bは成分非負で、積Fも成分非負。□
νを[0,T]の一様分布とすれば、dgは三角形の密度になり、gは次の区分二次関数となる。
g(t)=1−(2T−t)²/(2T²) (T≤t≤2T),
g(t)=1 (t≥2T).
gは連続微分可能で、開始時と終了時の傾きは0。Φ=AT/T。単一極の目標H=sH₀なら、
これは同じ非負フィルタでHankel核を両側から積分する既存構造の直接系である。この特定の温度波形・測定手順の既刊一致は未確認だが、新しい因子分解理論とは位置づけない。
合成回路の設計例(s=1 J/K、λ=0.25 s⁻¹、総立上り1秒、待機0.1秒、各窓5.025725秒)に改善定数を入れると、熱流誤差の床は線形ランプで4.437948 mW、上の区分二次ランプで4.432179 mWとなる。いずれも1 K加熱、4入力実験・4出力・観測区間のどこかで必要になる誤差である。区分二次化によるこの下界の低下は約0.13%。任意状態数の証明を維持できる点が設計上の意味を持つ。
既知のK₂,₃行列(CPランク6)にもこの入力設計を適用できるので、理想データで5状態以下を排除する議論へ進める。その6対5の雑音耐性を数値定数付きで示したわけではない。最初の実験候補は引き続き電圧指定・電流測定のRC回路。§追究2の電気的縮尺では、上の区分二次波形に対する床は約4.432 µAとなる。
熱入力→温度出力へ移すときの、状態数の数え方
Cθ̇=−Lθ+Ep、y=Eᵀθを考える。Cは正対角、Lは正定値Stieltjes、E≥0で入力と出力の重みを一致させる。Q=C−1/2LC−1/2、B=C−1/2Eなら、ステップ応答はR(t)=K−BᵀQ−1e−QtB。従って二窓を後の窓−前の窓に反転すると同じCP因子分解が成立する。
ただし、ここでのrは測定点を含む全ての動的状態数。Eが4つの異なる点を選ぶならr≥4は最初から必要で、「3状態を排除」するだけでは新しい情報にならない。また、この点入力ではBᵀBが対角であり、H₀/(s+λ)をそのまま物理的な温度応答とすることもできない。通常の半導体熱インピーダンス同定の隠れ状態数問題は、これでは解決していない。
重なりを持つ分布加熱と同じ重みの温度測定、少数ポートの時間ブロックHankel行列、ポート数を超える大きな下界が次の対象になる。Fukunaga–Funakiの実際の熱過渡同定は別の入出力・信号処理であり、今回の方法との実用性能の優劣は未評価。[50]
F. 何が、次の有意義な発見になりうるか
第一候補は「誤差を含む測定から、使える模型の最少状態数を保証する、短く説明可能な証明」である。目的は、不可能な精度・状態数の組を模型探索の前に外すこと。今の結果は、そのための小さな4境界例と検証可能な判定式まで到達している。
| 残る問い | 具体的な判定目標 |
|---|---|
| 簡易式は既存SDPのどこまでの系か | 一般の誤差箱での包含関係、保証の強さ、計算費用を比較する。単なる弱い書き換えなら、その位置づけを明記する。 |
| 3状態までの距離の正確な値 | 0.1010205…と0.1966765…の間を詰める。支持を仮定した局所最適化を全体の証明にしない。 |
| 実測でも余裕が残るか | 4回の入力試験で初期化・波形一致・積分・校正の誤差を上限化し、c²−Ψが正か確認する。合成データでの成功だけでは足りない。 |
| 古典回路合成との厳密な同一性 | Stein 1973、Matsumoto 1982、Kandić–Reljin 2009の本文で、境界ラベル・接地容量・非最小実現・重複極・素子数の最小性を照合する。 |
追究3時点の予想:追究4で下界1/6を証明
CPランク≤3の4×4行列でm²≤z(2d−z)が成立するのではないか、という予想が残る。成立すればH₀との距離下界は1/6に改善する。追究3時点では一般証明がなかったが、追究4で既知幾何定理から証明した。以下は当時の部分結果を保存した記録。
z≥d/5の範囲は、∥v₁−v₂+v₃−v₄∥²≥0からm≤(d+z)/2、さらに(d−z)(d−5z)≤0により証明できる。z=0も支持の議論で成立。未解決は0<z<d/5。この範囲ではa=√(z/2)、b=√(d−z/2)、c=√(d−2z)を用いた行[0,a,b,2a]、[2a,b,a,0]、[c,0,0,c]が等号を達成する。これは達成例であって全行列の不等式の証明ではない。
この因子はH₀への距離1/6の上界も示さない。一辺の値が目標から大きく外れるためである。数値で反例が見つからなかったことも、証明には数えない。
G. 再現できる証拠と、今回の到達範囲
新しい上下界、SDP評価、全状態数の立上り設計は、導出担当とは別の担当が証明を監査した。代数的上界とρ=1/4のSDP双対は有理数演算で検算。任意状態数の波形については内部状態1〜12の48個の合成物理グラフで、直接積分とGram式を比較し、最大差2.92×10⁻¹⁶だった。これは実装確認であり、定理の証明や実機検証を置き換えるものではない。
文献台帳は53件。全件の全文を読んだわけではなく、確認範囲を各行に記録した。新しい探索では定量的な近似非負ランク、CPランクSDP・モーメント階層、有限入力での実現、熱過渡同定、1970年代以降の接地容量回路合成を重点的に追った。2026年の非負ランク下界の計算研究も確認した。[53] 新規性はこの調査範囲に対しても未確定である。
代数的上界の厳密検算 — 標準Pythonのみ
"""Exact rational certificate for a CP-rank <= 3 approximation of C4.
Python standard library only. No numerical optimizer or floating-point decision
is used. The decimal display is obtained by outward rational rounding.
"""
from dataclasses import dataclass
from fractions import Fraction as Q
import json
from pathlib import Path
@dataclass(frozen=True)
class Interval:
lo: Q
hi: Q
def __init__(self, lo, hi=None):
object.__setattr__(self, 'lo', Q(lo))
object.__setattr__(self, 'hi', Q(lo if hi is None else hi))
assert self.lo <= self.hi
@staticmethod
def cast(x):
return x if isinstance(x, Interval) else Interval(x)
def __add__(self, other):
other = self.cast(other)
return Interval(self.lo + other.lo, self.hi + other.hi)
__radd__ = __add__
def __neg__(self):
return Interval(-self.hi, -self.lo)
def __sub__(self, other):
return self + -self.cast(other)
def __rsub__(self, other):
return self.cast(other) + -self
def __mul__(self, other):
other = self.cast(other)
ends = [self.lo * other.lo, self.lo * other.hi,
self.hi * other.lo, self.hi * other.hi]
return Interval(min(ends), max(ends))
__rmul__ = __mul__
def reciprocal(self):
assert self.lo > 0 or self.hi < 0, 'Division interval contains zero'
return Interval(1 / self.hi, 1 / self.lo)
def __truediv__(self, other):
return self * self.cast(other).reciprocal()
def __rtruediv__(self, other):
return self.cast(other) / self
def __pow__(self, n):
assert isinstance(n, int) and n >= 0
out = Interval(1)
for _ in range(n):
out = out * self
return out
def decimal_enclosure(self, digits=12):
# Floor lower endpoint; ceil upper endpoint, using integer arithmetic.
scale = 10 ** digits
lower = (self.lo.numerator * scale) // self.lo.denominator
upper = -((-self.hi.numerator * scale) // self.hi.denominator)
def render(n):
sign = '-' if n < 0 else ''
whole, frac = divmod(abs(n), scale)
return f'{sign}{whole}.{frac:0{digits}d}'
return [render(lower), render(upper)]
def poly(x):
return 2 - 11*x + 3*x*x - 2*x**3 + 42*x**4 - 4*x**6
def polynomial_product(a, b):
out = [Q(0)] * (len(a) + len(b) - 1)
for i, x in enumerate(a):
for j, y in enumerate(b):
out[i+j] += x*y
return out
def polynomial_subtract(a, b):
size = max(len(a), len(b))
return [(a[i] if i < len(a) else 0) -
(b[i] if i < len(b) else 0) for i in range(size)]
def main():
# Root isolation: decimal endpoints have denominator 10^15.
lo = Q(196676467057346, 10**15)
hi = Q(196676467057347, 10**15)
assert poly(lo) > 0 and poly(hi) < 0
assert 0 < lo < hi < Q(1, 5)
# P'(s) <= -11 + 6/5 + 168/125 = -1057/125 < 0
# for 0 <= s <= 1/5, since the other derivative terms are nonpositive.
derivative_upper = -11 + Q(6, 5) + Q(168, 125)
assert derivative_upper == -Q(1057, 125)
e = Interval(lo, hi)
p, q, L, U = 1-e, 1+e, 2-e, 2+e
x = p * (1-2*e**2) / (2*(1+e+e**2))
y = e * (1-2*e**2) / (1-4*e)
d = e**2/x + q**2/y
quantities = {'e': e, 'p': p, 'q': q, 'L': L, 'U': U,
'x': x, 'y': y, 'L-x': L-x, 'L-y': L-y,
'd': d, 'd-L': d-L, 'U-d': U-d}
for name in ['p', 'q', 'L', 'U', 'x', 'y', 'L-x', 'L-y', 'd-L', 'U-d']:
assert quantities[name].lo > 0, name
# Exact coefficient check of (L-x)(L-y)-q^2 = P(e)/denominator.
# Numerator is 2P; denominator is 2(1+e+e^2)(1-4e).
numerator = polynomial_subtract(
polynomial_product([3, 3, 4, -4], [2, -10, 4, 2]),
polynomial_product(polynomial_product([2, 2, 2], [1, -4]), [1, 2, 1]))
assert numerator == [4, -22, 6, -4, 84, 0, -8]
# Exact coefficient checks of off-diagonal and diagonal identities.
# ep/x+eq/y = p follows after multiplying by (1-2e^2).
# Check the simpler displayed identity:
# 2e(1+e+e^2) + (1+e)(1-4e) = (1-e)(1-2e^2).
assert polynomial_subtract(
polynomial_subtract([0, 2, 2, 2],
[-v for v in polynomial_product([1, 1], [1, -4])]),
polynomial_product([1, -1], [1, 0, -2])) == [0, 0, 0, 0]
# p^2/x+e^2/y = U:
# 2(1-e)(1+e+e^2)+e(1-4e) = (2+e)(1-2e^2).
assert polynomial_subtract(
polynomial_subtract(polynomial_product([2, -2], [1, 1, 1]), [0, -1, 4]),
polynomial_product([2, 1], [1, 0, -2])) == [0, 0, 0, 0]
result = {
'status': 'All assertions passed using exact rational arithmetic.',
'polynomial_ascending_coefficients': [2, -11, 3, -2, 42, 0, -4],
'root_interval': [str(lo), str(hi)],
'P_root_lower_sign': 1,
'P_root_upper_sign': -1,
'derivative_upper_on_zero_to_one_fifth': str(derivative_upper),
'outward_decimal_enclosures': {k: v.decimal_enclosure() for k, v in quantities.items()},
}
output = Path(__file__).with_name('cp3-algebraic-certificate.json')
output.write_text(json.dumps(result, indent=2) + '\n')
print(json.dumps(result, indent=2))
if __name__ == '__main__':
main()
既存SDPとの厳密比較 — FractionとNumPy
"""Exact rational checks for the Fawzi--Parrilo H_rho lower bound.
No SDP solver and no floating-point arithmetic in the assertions below.
The accompanying notes give the proof for all rho >= 0; this file checks
the coefficient identity, a rational dual certificate at rho=1/4, and a
separate explicit feasible CP3 upper comparator for distance to H0.
Requires only Python and numpy (arrays are dtype=object, Fraction entries).
"""
from fractions import Fraction as F
from pathlib import Path
import json
import numpy as np
HERE=Path(__file__).resolve().parent
U=np.array([[1,1,1],[1,1,-1],[1,-1,-1],[1,-1,1]],dtype=object)*F(1,2)
W=np.kron(U,U)
assert np.array_equal(U.T@U,np.eye(3,dtype=object))
def unit(i,n=9):
e=np.zeros((n,1),dtype=object);e[i,0]=1;return e
def minor_matrix(n,i,k,j,l):
"""trace(E X) = X_(ij,kl) - X_(il,kj), column-major pairs."""
E=np.zeros((n*n,n*n),dtype=object)
for a,b,c in [(i+n*j,k+n*l,F(1,2)),(i+n*l,k+n*j,F(-1,2))]:
E[a,b]+=c;E[b,a]+=c
return E
# D0 weights directed cycle entries by 1 and directed opposite entries by 2.
D0=np.zeros((16,16),dtype=object)
for i in range(4):
for j in range(4):
D0[i+4*j,i+4*j]=0 if i==j else 2 if (i-j)%4==2 else 1
p=unit(0);q=unit(4)+unit(8)
skew=[unit(i)-unit(j) for i,j in [(1,3),(2,6),(5,7)]]
M0=p@p.T+q@q.T+sum((u@u.T for u in skew),np.zeros((9,9),dtype=object))
# The discrepancy consists of three compressed principal-minor equations.
identity=W.T@D0@W-M0+minor_matrix(3,0,1,0,1)+minor_matrix(3,0,2,0,2)+2*minor_matrix(3,1,2,1,2)
assert all(x==0 for x in identity.ravel())
# Explicit rational dual at rho=1/4. The upper-PSD multiplier is zero;
# that constraint is used first to justify exact facial reduction.
rho=F(1,4);g=4+4*rho;C=8*((1+rho)**2+rho**2)
v=(g*p+4*q)/C
k=(g*g+16)/(C*C)
M=k*M0
w=4*p-g*q
# Block dual [[1,-v^T],[-v,M]] is PSD from this explicit outer-product sum.
res=M-v@v.T-(w@w.T)/(C*C)-k*sum((u@u.T for u in skew),np.zeros((9,9),dtype=object))
assert all(x==0 for x in res.ravel())
# Multipliers for Eq51 minor equations, in exactly the loop order below.
mult=[3,1,-2,2,-1,1,1,2,1,1,0,-1,-2,1,3,-1,1,-2,
2,1,-1,3,1,2,-1,0,1,1,2,1,1,-1,-2,2,1,3]
stationarity=W.T@(k*D0)@W-M
z=0
for i in range(4):
for kk in range(i+1,4):
for j in range(4):
for l in range(j+1,4):
stationarity+=(k*F(mult[z],4))*(W.T@minor_matrix(4,i,kk,j,l)@W)
z+=1
assert all(x==0 for x in stationarity.ravel())
a=g*p+2*q
dual_value=2*(v.T@a)[0,0]-k*C
assert dual_value==F(41,13)>3
results=dict(
coefficient_identity_exact=True,
dual_stationarity_exact=True,
dual_psd_by_explicit_outer_product_sum=True,
rho=str(rho),
proved_lower_bound=str(dual_value),
general_proved_lower_bound='max(3,(4+4*rho+2*rho**2)/(1+2*rho+2*rho**2)) for rho>=0',
general_equality_to_SDP_optimum_proven=False,
original_minor_multipliers_in_units_k_over_4=mult)
# Existing local fit, rounded to an exact decimal nonnegative factor.
G=[['1.22610739','0','0','0.97599645'],
['0.54770813','1.46670004','0.35908992','0'],
['0','0.21323097','1.29740221','0.92236352']]
Gr=np.array([[F(x) for x in row] for row in G],dtype=object)
H0=np.array([[2,1,0,1],[1,2,1,0],[0,1,2,1],[1,0,1,2]],dtype=object)
error=max(abs(x) for x in (Gr.T@Gr-H0).ravel())
assert error==F(196676472519291,10**15)<F('0.19667648')
results['explicit_cp3_upper_factor_decimal']=G
results['explicit_cp3_upper_error_exact']=str(error)
results['explicit_cp3_upper_is_global_optimum']=False
(HERE/'round3_sdp_exact_certificate.json').write_text(json.dumps(results,indent=2))
print(json.dumps(results,indent=2))
全状態数の有限立上り — NumPyとSciPyによる実装確認
"""Verify self-convolution heating and the improved CP3 certificate.
No external datasets. NumPy + SciPy; fixed random seed. Numerical checks
support implementation only; exact proofs are in the accompanying HTML.
"""
from pathlib import Path
import json
import numpy as np
from numpy.polynomial.legendre import leggauss
from scipy.linalg import expm
from scipy.optimize import brentq
HERE=Path(__file__).resolve().parent
rng=np.random.default_rng(202609203)
gx,gw=leggauss(28)
def quad(a,b):return (a+b)/2+(b-a)*gx/2,(b-a)*gw/2
def mf(V,values):return (V*values)@V.T
def triangular_rate(t,T):return np.where(t<T,t,2*T-t)/T**2
err_ramp=err_power=err_gram=err_heatrows=0.; min_factor=1.
for r in range(1,13):
for rep in range(4):
n=5
w=rng.uniform(0,.5,(r,r));w=(w+w.T)/2;np.fill_diagonal(w,0)
B=rng.uniform(.05,.7,(r,n))
Q=np.diag(w.sum(1)+B.sum(1))-w
direct=rng.uniform(0,.5,(n,n));direct=(direct+direct.T)/2;np.fill_diagonal(direct,0)
direct=np.diag(direct.sum(1))-direct
Lbb=direct+np.diag(B.sum(0));K=Lbb-B.T@np.linalg.solve(Q,B)
err_heatrows=max(err_heatrows,float(np.max(abs(K.sum(1)))))
ev,V=np.linalg.eigh(Q)
T=float(rng.uniform(.1,.7));h=float(rng.uniform(.1,.9));tau=float(rng.uniform(.05,.8))
tm1,wm1=quad(0,T);tm2,wm2=quad(T,2*T)
ts=np.r_[tm1,tm2];mu=np.r_[wm1,wm2]*triangular_rate(ts,T)
win1,ww=quad(2*T+tau,2*T+tau+h)
win2,_=quad(2*T+tau+h,2*T+tau+2*h)
def residual(t):
spectral=np.sum(mu[:,None]*np.exp(-(t-ts[:,None])*ev[None,:]),axis=0)/ev
return B.T@mf(V,spectral)@B
D=sum(weight*((K+residual(a))-(K+residual(b))) for weight,a,b in zip(ww,win1,win2))
Ah=mf(V,-np.expm1(-ev*h)/ev);AT=mf(V,-np.expm1(-ev*T)/(ev*T))
F=expm(-Q*tau/2)@AT@Ah@B
target=B.T@mf(V,np.exp(-ev*tau)*(-np.expm1(-ev*T)/(ev*T))**2*(-np.expm1(-ev*h)/ev)**2)@B
err_ramp=max(err_ramp,float(np.max(abs(D-target))))
err_gram=max(err_gram,float(np.max(abs(F.T@F-target))))
min_factor=min(min_factor,float(F.min()))
# The same Q is a grounded conductance matrix for a power-driven system.
# B is now an overlapping nonnegative spatial input, with matched B.T readout.
Kp=B.T@np.linalg.solve(Q,B)
Dp=sum(weight*((Kp-residual(b))-(Kp-residual(a))) for weight,a,b in zip(ww,win1,win2))
err_power=max(err_power,float(np.max(abs(Dp-target))))
def bound(d,z):
zz=min(z,d/2)
return 4*zz*(d-zz)
violations=0;worst=-float('inf')
for _ in range(3000):
F=rng.exponential(1,(3,4));F[rng.random((3,4))<.3]=0
H=F.T@F;m=min(H[0,1],H[1,2],H[2,3],H[3,0]);z=max(H[0,2],H[1,3]);d=max(H.diagonal())
margin=m*m-bound(d,z)
worst=max(worst,float(margin))
violations+=margin>1e-10
assert not violations
delta=5-2*np.sqrt(6)
lam=.25;total_rise=1.;T=total_rise/2;tau=.1
x=brentq(lambda x:np.exp(x)-2*x-1,.1,3);h=x/lam
linear_a=np.exp(-lam*tau)*(-np.expm1(-lam*total_rise)/(lam*total_rise))*(-np.expm1(-lam*h))**2
smooth_a=np.exp(-lam*tau)*(-np.expm1(-lam*T)/(lam*T))**2*(-np.expm1(-lam*h))**2
result=dict(seed=202609203,physical_graphs=48,hidden_counts=list(range(1,13)),
max_triangular_ramp_window_error=err_ramp,max_gram_error=err_gram,
min_factor_entry=min_factor,max_power_input_window_error=err_power,
max_kron_rowsum_error=err_heatrows,cp3_factor_checks=3000,
cp3_inequality_violations=int(violations),max_cp3_inequality_margin=worst,
improved_delta=delta,uniform_rho_threshold=3-2*np.sqrt(2),
design=dict(lam=lam,total_rise=total_rise,tau=tau,h=h,
linear_ramp_coefficient=linear_a,linear_ramp_error_floor=delta*linear_a/(2*h),
quadratic_ramp_coefficient=smooth_a,quadratic_ramp_error_floor=delta*smooth_a/(2*h)),
scope='Synthetic numerical checks; no experimental measurement or optimality claim.')
assert max(err_ramp,err_gram,err_power,err_heatrows)<1e-10
(HERE/'round3-protocol-results.json').write_text(json.dumps(result,indent=2))
print(json.dumps(result,indent=2))
既存SDPの数値比較 — CVXPY、Clarabel、SCS
"""Numerical cp-rank lower-bound comparisons; no floating-point output is a proof.
Fawzi--Parrilo (2014), arXiv:1404.3240v1, section 4, equation (51).
Optional conservative robust entry-box relaxation is derived in accompanying notes.
Requires Python, numpy, cvxpy and Clarabel/SCS. Tested cvxpy 1.9.3.
"""
from pathlib import Path
import sys, json, math, time
HERE=Path(__file__).resolve().parent
try:
import cvxpy as cp
except ModuleNotFoundError:
sys.path.insert(0,str(HERE/'sdp_dependencies'))
import cvxpy as cp
import numpy as np
F0=np.array([[1,1,0,0],[0,1,1,0],[0,0,1,1],[1,0,0,1]],float)
H0=F0.T@F0
n=4; nn=n*n
def minor_constraints(X):
# Only i<k and j<l, exactly as in equation (51); no extra X>=0 constraint.
return [X[i+n*j,k+n*l]==X[i+n*l,k+n*j]
for i in range(n) for k in range(i+1,n)
for j in range(n) for l in range(j+1,n)]
def solve_problem(problem, solver):
started=time.time()
if solver=='CLARABEL':
value=problem.solve(solver=solver,tol_gap_abs=1e-9,tol_gap_rel=1e-9,
tol_feas=1e-9,max_iter=300)
else:
value=problem.solve(solver=solver,eps=2e-7,max_iters=200000)
info=dict(value=float(value),status=problem.status,solver=solver,
elapsed_seconds=time.time()-started,
num_iters=problem.solver_stats.num_iters)
extra=problem.solver_stats.extra_stats
if isinstance(extra,dict) and 'info' in extra:
info['solver_info']={k:float(extra['info'][k]) for k in
['pobj','dobj','res_pri','res_dual','gap'] if k in extra['info']}
return info
def tau_exact(A,solver='CLARABEL'):
ev,U=np.linalg.eigh(A)
assert ev.min()>-1e-9
keep=ev>1e-9
W=np.kron(U[:,keep],U[:,keep])
# Facial reduction removes only the exact nullspace of A tensor A.
Y=cp.Variable((W.shape[1],W.shape[1]),symmetric=True)
X=W@Y@W.T
t=cp.Variable()
a=A.reshape(nn,1,order='F')
ar=W.T@a
upper=np.diag(np.kron(ev[keep],ev[keep]))
block=cp.bmat([[cp.reshape(t,(1,1),order='F'),ar.T],[ar,Y]])
equalities=minor_constraints(X)
constraints=[block>>0,cp.diag(X)<=a.ravel()**2,upper-Y>>0]+equalities
prob=cp.Problem(cp.Minimize(t),constraints)
result=solve_problem(prob,solver)
xv=np.asarray(X.value)
result.update(rank=int(keep.sum()),matrix=A.tolist(),
primal_min_eigenvalue=float(np.linalg.eigvalsh(block.value).min()),
upper_slack_min_eigenvalue=float(np.linalg.eigvalsh(upper-Y.value).min()),
maximum_diagonal_violation=float(max(0,np.max(np.diag(xv)-a.ravel()**2))),
maximum_equality_residual=float(max(abs(eq.expr.value) for eq in equalities)),
X=xv.tolist())
return result
def tau_robust_box(center,eps,solver='CLARABEL'):
"""Lower bound for inf{tau_sos(A): A CP, |A-center|<=eps}.
Relaxations, all conservative for any PSD A in the box:
diag(X)<= (center_ij+eps)*A_ij (instead of A_ij**2);
X <= center tensor A + A tensor center - center tensor center
+ n*n*eps*eps*I (instead of A tensor A).
The second follows since E tensor E <= ||E||op**2 I <= n*n*eps*eps I.
Thus this is NOT an exact minimization of the pointwise Fawzi-Parrilo bound.
"""
A=cp.Variable((n,n),symmetric=True)
X=cp.Variable((nn,nn),symmetric=True)
t=cp.Variable()
a=cp.reshape(A,(nn,1),order='F')
upper_entries=(center+eps).ravel(order='F')
kron_upper=cp.kron(center,A)+cp.kron(A,center)-np.kron(center,center)+(n*eps)**2*np.eye(nn)
block=cp.bmat([[cp.reshape(t,(1,1),order='F'),a.T],[a,X]])
equalities=minor_constraints(X)
constraints=[A>>0,A>=0,A>=center-eps,A<=center+eps,
block>>0,cp.diag(X)<=cp.multiply(upper_entries,cp.reshape(a,(nn,),order='F')),
kron_upper-X>>0]+equalities
prob=cp.Problem(cp.Minimize(t),constraints)
result=solve_problem(prob,solver)
result.update(epsilon=eps,relaxation='conservative_affine_entry_box_envelope',
matrix_at_relaxed_optimum=A.value.tolist(),X=X.value.tolist(),
primal_min_eigenvalue=float(np.linalg.eigvalsh(block.value).min()),
upper_slack_min_eigenvalue=float(np.linalg.eigvalsh(kron_upper.value-X.value).min()),
maximum_equality_residual=float(max(abs(eq.expr.value) for eq in equalities)))
return result
results=dict(source='https://arxiv.org/html/1404.3240v1#S4',equation='51',
cvxpy_version=cp.__version__,solvers=cp.installed_solvers(),
pointwise=[],robust_boxes=[],cross_checks=[],
caveats=['All solver values are numerical, not certified proofs.',
'A pointwise bound does not certify an entire entrywise noise box.',
'Robust-box results use our conservative affine envelope of Eq.51, not exact FP box optimization.',
'For epsilon>0 the circulant epsilon family has ordinary rank four, so its cp-rank lower bound is already four.',
'No claim of optimality is made for saved nonconvex factor fits.'])
def save():
(HERE/'round3_sdp_results.json').write_text(json.dumps(results,indent=2))
rho_grid=[0,.02,.05,.10,.15,.16,.20,.25,.30,.31,.35,.45,.49,.50,.75,1.]
for rho in rho_grid:
res=tau_exact(H0+rho*np.ones((4,4)))
res.update(family='H0+rho*J',rho=rho,
cheap_m2_minus_4zd=(1+rho)**2-4*rho*(2+rho),
improved_m2_minus_4z_dminusz=(1+rho)**2-8*rho)
results['pointwise'].append(res);save()
print(json.dumps({k:res[k] for k in ['family','rho','value','status','cheap_m2_minus_4zd']}),flush=True)
for eps in [.01,.05,.10,.19]:
A=H0.copy()
for i in range(4):
for j in range(4): A[i,j]+= eps if i==j or (i-j)%4==2 else -eps
res=tau_exact(A)
res.update(family='circulant_epsilon',epsilon=eps,
cheap_m2_minus_4zd=(1-eps)**2-4*eps*(2+eps),
improved_m2_minus_4z_dminusz=(1-eps)**2-8*eps)
results['pointwise'].append(res);save()
print(json.dumps({k:res[k] for k in ['family','epsilon','rank','value','status']}),flush=True)
for eps in [.01,.025,.049038105676658,.075,.097167540709727,.10,.125,.15,.19]:
res=tau_robust_box(H0,eps)
res['cheap_m2_minus_4zd']=(1-eps)**2-4*eps*(2+eps)
res['improved_m2_minus_4z_dminusz']=(1-eps)**2-8*eps
results['robust_boxes'].append(res);save()
print(json.dumps({k:res[k] for k in ['epsilon','value','status','cheap_m2_minus_4zd']}),flush=True)
# Cross solver checks resolve numerical doubts only, not strict certificates.
for rho in [0,.20,.49]:
res=tau_exact(H0+rho*np.ones((4,4)),solver='SCS')
res.update(family='H0+rho*J',rho=rho)
results['cross_checks'].append(res);save()
print(json.dumps({k:res[k] for k in ['family','rho','solver','value','status']}),flush=True)
finite_results=HERE/'finite-window-results.json'
if finite_results.exists():
saved=json.loads(finite_results.read_text())['target']
G=np.array(saved['local_search_best_factor'])
# Round downward/upward neither matters: direct reconstruction gives a feasible CP3 matrix.
# Use eight decimals and report its directly evaluated entrywise error as a numerical upper bound.
Gr=np.round(G,8)
results['explicit_cp3_upper_comparator']=dict(
factor=Gr.tolist(),matrix=(Gr.T@Gr).tolist(),
entrywise_error=float(np.max(abs(Gr.T@Gr-H0))),
provenance='Existing 40-start local fit; no new nonconvex search.',
is_global_optimum=False)
# These finite decimals give an exact rational factor, hence a certified
# feasible upper comparator independent of the nonconvex optimizer.
from fractions import Fraction
Gf=[[Fraction(str(round(x,8))) for x in row] for row in Gr.tolist()]
GG=[[sum(Gf[k][i]*Gf[k][j] for k in range(3)) for j in range(4)] for i in range(4)]
err=max(abs(GG[i][j]-int(H0[i,j])) for i in range(4) for j in range(4))
results['explicit_cp3_upper_comparator'].update(
entrywise_error_exact_rational=str(err),
entrywise_error_exact_decimal=float(err),
strict_upper_bound='0.19667648')
assert err < Fraction('0.19667648')
results['analytic_thresholds']={
'old_pointwise_rho':-1+2/math.sqrt(3),
'improved_pointwise_rho':3-2*math.sqrt(2),
'improved_uniform_box_epsilon':5-2*math.sqrt(6),
'proved_SDP_lower_bound_crossing_rho':(math.sqrt(5)-1)/4,
'proved_SDP_lower_bound_formula':'max(3,(4+4*rho+2*rho**2)/(1+2*rho+2*rho**2))',
'equality_to_SDP_optimum_proven':False}
save()
実行結果:cp3-algebraic-certificate.json
{
"status": "All assertions passed using exact rational arithmetic.",
"polynomial_ascending_coefficients": [
2,
-11,
3,
-2,
42,
0,
-4
],
"root_interval": [
"98338233528673/500000000000000",
"196676467057347/1000000000000000"
],
"P_root_lower_sign": 1,
"P_root_upper_sign": -1,
"derivative_upper_on_zero_to_one_fifth": "-1057/125",
"outward_decimal_enclosures": {
"e": [
"0.196676467057",
"0.196676467058"
],
"p": [
"0.803323532942",
"0.803323532943"
],
"q": [
"1.196676467057",
"1.196676467058"
],
"L": [
"1.803323532942",
"1.803323532943"
],
"U": [
"2.196676467057",
"2.196676467058"
],
"x": [
"0.299984191393",
"0.299984191394"
],
"y": [
"0.850754457398",
"0.850754457399"
],
"L-x": [
"1.503339341549",
"1.503339341550"
],
"L-y": [
"0.952569075544",
"0.952569075545"
],
"d": [
"1.812198069900",
"1.812198069901"
],
"d-L": [
"0.008874536957",
"0.008874536958"
],
"U-d": [
"0.384478397157",
"0.384478397158"
]
}
}
実行結果:round3_sdp_exact_certificate.json
{
"coefficient_identity_exact": true,
"dual_stationarity_exact": true,
"dual_psd_by_explicit_outer_product_sum": true,
"rho": "1/4",
"proved_lower_bound": "41/13",
"general_proved_lower_bound": "max(3,(4+4*rho+2*rho**2)/(1+2*rho+2*rho**2)) for rho>=0",
"general_equality_to_SDP_optimum_proven": false,
"original_minor_multipliers_in_units_k_over_4": [
3,
1,
-2,
2,
-1,
1,
1,
2,
1,
1,
0,
-1,
-2,
1,
3,
-1,
1,
-2,
2,
1,
-1,
3,
1,
2,
-1,
0,
1,
1,
2,
1,
1,
-1,
-2,
2,
1,
3
],
"explicit_cp3_upper_factor_decimal": [
[
"1.22610739",
"0",
"0",
"0.97599645"
],
[
"0.54770813",
"1.46670004",
"0.35908992",
"0"
],
[
"0",
"0.21323097",
"1.29740221",
"0.92236352"
]
],
"explicit_cp3_upper_error_exact": "196676472519291/1000000000000000",
"explicit_cp3_upper_is_global_optimum": false
}実行結果:round3-protocol-results.json
{
"seed": 202609203,
"physical_graphs": 48,
"hidden_counts": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12
],
"max_triangular_ramp_window_error": 1.6653345369377348e-16,
"max_gram_error": 2.914335439641036e-16,
"min_factor_entry": 0.00964830007618927,
"max_power_input_window_error": 1.1102230246251565e-16,
"max_kron_rowsum_error": 2.220446049250313e-15,
"cp3_factor_checks": 3000,
"cp3_inequality_violations": 0,
"max_cp3_inequality_margin": 0.0,
"improved_delta": 0.10102051443364424,
"uniform_rho_threshold": 0.1715728752538097,
"design": {
"lam": 0.25,
"total_rise": 1.0,
"tau": 0.1,
"h": 5.025724834504678,
"linear_ramp_coefficient": 0.44157182494271213,
"linear_ramp_error_floor": 0.004437948194940551,
"quadratic_ramp_coefficient": 0.44099775859097734,
"quadratic_ramp_error_floor": 0.0044321786313371945
},
"scope": "Synthetic numerical checks; no experimental measurement or optimality claim."
}SDP数値実行記録:残差・比較結果・ソルバー情報
浮動小数点による探索の完全な記録。厳密保証の根拠は上の証明と有理数検算。個々の実行時間はこの実行環境での参考値。
全32回の結果を収録。行列・残差・ソルバー状態を含む元のJSONは、圧縮してこのHTML内に保持しています。
| 記録の種類 | 回数 | ソルバー | 等式残差の最大値 |
|---|---|---|---|
| Hρの点ごとの比較 | 20 | CLARABEL | 1.96e-12 |
| 成分誤差の区間緩和 | 9 | CLARABEL | 2.4e-14 |
| 別ソルバーとの照合 | 3 | SCS | 3.08e-13 |
残差は浮動小数点計算の診断値で、厳密な可行性や最適性の証明ではありません。元ログの optimal_inaccurate を含む状態情報も保持しています。
JSONは必要なときだけ展開します。
元JSONのSHA-256:c926e5e575dcd8a1c47dc225c99080b7677f94b597f7a6ad53147f446f05c01a
二つの時間窓から、「3状態では足りない」を証明する
前回の低周波係数の下限を、測定できる熱流の誤差下限へ進めた。温度を変えた後の熱流を、隣り合う同じ長さの区間で積分し、差を取る。この量には内部状態数の制約が残り、未知の定常応答は消える。
今回は、①定常応答を合わせなくてもよい有限時間の証明、②有限の立上り時間への拡張、③測定誤差を含めた簡単な棄却式まで到達した。誤差定数も、前回の約0.049から約0.097へ改善した。最良定数という主張ではない。
A. 実験で何を測るか
4か所の境界を選び、1か所ずつ同じ温度上昇を与える。残りの境界温度は基準値へ固定する。毎回、内部を同じ初期平衡から始め、4か所の符号付き熱流を測る。温度上昇幅で割った応答を Rij(t) とする。第j回実験の第i境界熱流が行列の(i,j)成分になる。以下は温度差1単位あたりの式である。
Rの単位はW/K、Dの単位はJ/K。二窓の差なので、定常応答Kと時間に依存しないセンサーオフセットが相殺する。時間変化するドリフト、校正誤差、積分誤差は別途、後述の誤差幅へ含める。
B. 理想ステップの定理:全ての内部状態数に成立
§3の相反熱ネットワークを用いる。Q=CI−1/2LIICI−1/2、B=CI−1/2(−LIB)と置く。Qは正定値・非対角成分が非正、Bは成分ごとに非負。内部状態数をrとする。
Ah=∫₀he−Qvdv, F=e−Qt/2AhB
Dh(t)=FᵀF, F≥0, cp-rank(Dh(t))≤r.
二窓の因子分解の証明
−Qは非対角が非負なのでe−Qu≥0。例えば十分大きいaに対してaI−Q≥0とし、指数の冪級数で示せる。従ってAh≥0、F≥0。
二窓のKは消え、積分を実行するとD=BᵀQ−2e−Qt(I−e−Qh)²B。Qの関数同士は可換かつ対称で、Ah=Q−1(I−e−Qh)。従ってD=FᵀF。Fの行数はrなのでCPランクはr以下。□
同じ式はD=∫₀h∫₀hBᵀe−Q(t+u+v)B du dvとも書ける。対称なHankel核を両側から同じ窓で積分したGram行列であり、既存の正値実現理論との連続性は明確である。
境界容量CBはステップ瞬間のインパルスだけに寄与するため、窓はt>0に置く。候補模型のK、CB、極配置を目標と一致させる必要はない。CPランクは一般には必要状態数の下界であり、これだけで回路実現の十分条件は得られない。
C. 有限立上りでも「3状態以下」の棄却が成立
温度入力をg(t)とし、gは0から1へ単調増加して時刻Tで立上りを完了、その後は1を保つ。各境界で同じ波形を使用する。μ=dgは[0,T]上の非負測度で総量1。観測開始はt>Tとする。
M=∫₀T e−Q(t−v)Ah² μ(dv).
r≤3 ⇒ cp-rank(Dg,h(t))≤3.
任意の共通単調ランプへの拡張の証明
線形性よりRg(t)=K+∫₀TBᵀQ−1e−Q(t−v)B μ(dv)。二窓差を取ると表示式になる。Mの各積分項は、非負行列の積なので成分非負。また同じ正定値Qの関数なので固有値は非負。従ってMは対称半正定値かつ成分非負(DNN)。
r≤3ではDNN行列はr行以下の非負因子を持つ。自足的には、3×3を対角で正規化して相関a,b,c∈[0,1]とし、残った相関cが最大になるようピボットを選べばc≥ab。Choleskyの非対角成分はa,b,(c−ab)/√(1−a²)で全て非負、最後の平方根は半正定値性が保証する。退化例は極限で処理できる。M=PᵀP、P≥0とすればD=(PB)ᵀ(PB)。□
この議論から一般rでCPランク≤rとは言わない。CP行列の平均で因子の最少本数が保たれるとは限らないためである。
この拡張により、理想的な瞬間加熱を前提とせずに3状態模型を検証できる。立上り途中の窓、境界ごとに違う波形、未知の初期状態には同じ証明を適用できない。後述の計算では前二者について実際に破綻例も確認した。
D. 改善した下限:0.049から0.097へ
§5の既知行列H₀に対し、3行以下の非負因子を持つ任意のH̃は次を満たす。
改善定数の証明と、データから直接使える形
非負因子の各行を(a,b,c,d)とする。{a,c}の大きい方と{b,d}の大きい方を一つずつ選ぶと、サイクル12・23・34・41のいずれか一辺が選ばれる。同値の場合も一つに決める。3行以下なら、少なくとも一辺は一度も選ばれない。
その辺を添字の付け替えで12とする。全ての行でa≤cまたはb≤dが成り立つ。I={a≤c}、J=その残り、と分割すると、Cauchy–Schwarzから
≤ √(H̃₁₃H̃₂₂) + √(H̃₂₄H̃₁₁).
mを四つのサイクル成分の最小値、zを二つの反対頂点成分13・24の最大値、dを対角成分の最大値とすると、従ってm²≤4zdが必要。H₀からの成分誤差ε<1ならm≥1−ε、z≤ε、d≤2+εなので(1−ε)²≤4ε(2+ε)。3ε²+10ε−1≥0を解いてδを得る。ε≥1なら自明。□
これは因子の支持を使った初等的な下界。一般的なCPランクの計算可能な下界には既存の半正定値計画・SOS法があり、比較が必要である。[41]
E. 有限時間の熱流誤差へ変換する
目標の記憶係数をH=sH₀とする。s>0は容量の単位を持つ尺度。緩和率λの単一極応答へ、長さTの線形ランプを与える。立上り終了後τ>0だけ待ち、幅hの窓を二つ測ると、
a=e−λτ · (1−e−λT)/(λT) · (1−e−λh)².
同じ実験を、内部熱容量3個以下の任意の候補模型で行う。4×4応答の最大成分誤差の観測区間内上限をEとすれば、積分の三角不等式から∥D̃−D*∥max≤2hE。上のCP下界と合わせて、
候補の極をどこへ置いても成立する。4回の入力実験・4出力・指定時間区間のどこかで必要になる誤差の床である。全出力が常にこの誤差を持つ、温度予測に同じ下限が出る、あるいはH∞下界が得られた、という意味ではない。
別の測定方法:二時刻の差
r≤3ならRg(t)−Rg(t+h)も、内部DNN行列の合同変換なのでCPランク≤3。線形ランプ後の係数はsλe−λτ(1−e−λT)/(λT)(1−e−λh)。二時刻の最大誤差はそのδ/2倍以上となる。時間積分を使わない分、同一の誤差ノルムではより強い下界になりうるが、瞬間値の測定誤差を直接受ける。二窓法は時間積分データから証明を作る選択肢であり、あらゆる測定法の最適解とは言わない。
F. 単位を付けた設計例
これは合成した回路モデル上の設計計算であり、実測結果ではない。s=1 J/K、λ=0.25 s⁻¹、境界間の定常辺重み1 W/Kの§5回路を用いる。内部熱容量は各4 J/Kの4個。1 Kを1秒で線形に立ち上げ、0.1秒待つ。
| 量 | 値 | 意味 |
|---|---|---|
| 各窓の幅h | 5.025725秒 | この二窓下界を最大化する幅。λh≈1.256431。 |
| 観測時間 | 約10.05145秒 | 入力開始後1.1秒から11.15145秒まで。 |
| 二窓係数a | 0.441571825 | D*=0.441571825 H₀ J/K。 |
| 3状態とのDの距離下限 | 0.042906448 J/K | 最大成分ノルム。最良距離とは限らない。 |
| 熱流誤差の床 | 4.268683 mW | 温度上昇1 Kの場合。どこかの入力・出力・時刻でこの値以上。 |
最適な窓幅はeˣ=2x+1の正根x≈1.256431から求まる。これは今回の下界を最も大きくする選択であり、雑音分布や測定費用まで考えた実験計画の最適性ではない。
G. ノイズを含むデータの棄却式
測定した対称化済み行列D̂の成分誤差が全てη以下と保証されているとする。c=max(0, mincycleD̂ij−η)、z=max(0, D̂₁₃+η, D̂₂₄+η)、d=max(0, maxiD̂ii+η)を計算する。
許容したい模型の熱流誤差をE、測定したDの誤差をηmeasとするなら、判定に使う幅をη=ηmeas+2hEへ広げればよい。それでも不等式が成立すれば、その精度Eを満たす3状態以下の模型も存在しない。
この条件に届かなければ判定保留であり、3状態で十分という結論ではない。真のモデルが想定した物理クラスに属するなら、棄却は内部状態が少なくとも4個必要だという意味になる。モデルクラス自体の不適合をこの式だけで診断するものではない。
各窓の積分値にそれぞれ成分誤差εWがあれば、差の誤差はη≤2εW。各時刻の熱流誤差σと数値積分誤差εquadを使う保守的な換算はη≤2hσ+εquad。統計的な信頼区間を使うなら、16成分・全実験を同時に覆う保証が必要。ここでは未指定の雑音を独立・正規分布と仮定しない。
H. 現実につなぐ際の入口
最初の検証には、同じ数式を持つ抵抗・コンデンサの4端子回路が扱いやすい。電圧を指定して電流を測れるため、温度を4か所で制御する実験より本命題の入力条件を作りやすいと考える。熱モデルとRC回路の対応はメーカー資料にも明示されている。[42]
具体的な電気的縮尺の一例は、各内部容量4 µF、内部から隣接する二境界への抵抗をそれぞれ2 kΩ、境界のサイクル辺を4/3 kΩ、反対頂点間を1 kΩとする。これはs=1 µF、λ=250 s⁻¹、定常辺重み1 mSの模型。1 Vを1 msで立ち上げ、0.1 ms待ち、各5.025725 msの二窓を測る。対応する電流誤差下限は約4.269 µA。公称値の計算であり、部品誤差や測定器性能を実証したものではない。
熱の用途は、多境界の簡略化モデルの状態数選びや、これ以上減らせない精度の判定。モデルの内部状態数は、実物の材料層の数とは限らない。一般的な半導体の熱インピーダンス測定は熱流入力→温度出力であり、本ノートの温度入力→熱流出力の保証をそのまま移せない。[42]
I. 新規性の監査で撤回・限定したこと
| 確認した点 | 現在の扱い |
|---|---|
| H₀はCPランク4だけでなく通常の非負ランクも4 | この例の次数差を相反性だけが生む独自現象とは呼ばない。 |
| Hankelの非負因子分解と実現次数 | 古典的な正値実現理論の系譜。2004解説と2022surveyに帰属。[35] [43] |
| CPランクが小さい行列集合の閉性と正の距離 | 既知の半連続性。誤差が正という存在だけを新規主張にしない。[41] |
| δ≈0.09717、c²>4zd、二窓+単調立上り | 本調査で独立導出・監査済みの量的な候補。同一の既存命題との一致・非一致は未確定。 |
| 実用性能 | 合成回路とランダム回路で検証。実機・実材料・製品データでの実証は未実施。 |
H₀の非負ランクも4であることの確認
列を二つ循環移動すると零成分が対角だけに並ぶ。非負ランク3以下なら、この非対角支持を三つの積集合で覆えて、対角を踏まない必要がある。各行の因子支持集合をSi⊆{1,2,3}とすると、全ての異なるi,jについてSi⊄Sjが必要。3要素集合の部分集合から相互非包含な集合は最大3個しか選べず、4行と矛盾する。従って非負ランクは4。今回の具体例の厳密な3状態排除には、一般正値実現の障壁も含まれる。
相反性の追加制約を分離する、次の既知例
完全二部グラフK₂,₃の符号なしラプラシアンH₂,₃=[[3I₂,J₂,₃],[J₃,₂,2I₃]]は通常ランク4、CPランク6。各辺に対応する非負因子が上界6を与え、同じ部の零成分のため各因子が高々一辺しか覆えず下界6。行列とそのCPランクは既知である。[41, §4.5]
一方、通常の非負分解は5×5行列なので5因子以下。単一極の正の緩和核は一般の正値状態空間表現なら5状態で実現できるが、§4の条件を満たす熱境界応答には6内部熱容量が必要になる。これで一般正値性と相反な熱回路の制約を区別できる。任意単調ランプのr≤3証明をr=5へそのまま拡張することはできないが、追究3の自己畳み込みの入力波形なら全rで因子分解が成立する。
J. 反例と独立数値検証
新たに内部点数1〜8の160個の物理グラフを生成し、応答の直接数値積分と因子分解を比較した。合成回路のため実測データではない。計算は証明の代わりではなく、式の実装と適用条件を確認する役割を持つ。
| 確認 | 最大誤差・結果 |
|---|---|
| ステップ二窓の直接積分と解析式 | 6.67×10⁻¹⁶ |
| 非負Gram因子との一致 | 3.89×10⁻¹⁶ |
| 共通単調ランプの二窓積分 | 3.47×10⁻¹⁶ |
| r≤3の内部DNN行列の非負因子 | 1.39×10⁻¹⁷ |
| 立上り途中に窓を置く反例 | 1状態でもD≈−0.0311234。CP性が壊れる。 |
| 境界ごとに違う立上りを使う反例 | 保持後でもDが非対称。共通波形の仮定を外せない。 |
参考として、H₀に近い3行非負因子を40初期値から局所探索した最良値は約0.1966765だった。これは近似行列を構成して得た距離の数値的な上界であり、大域最小値や新たな下界ではない。これは追究2の時点の結果。追究3では下界を0.1010205へ改善し、この近似を代数化して有理演算で厳密な上界を得た。最適距離は引き続き未確定。
有限窓の再現用Pythonコード
"""Independent finite-window thermal response checks.
Numerical checks are not proofs of cp-rank lower bounds or global optimality.
Python 3 + NumPy + SciPy. Run from any working directory.
"""
from pathlib import Path
from itertools import permutations
import json
import math
import numpy as np
from scipy.special import beta as beta_function
from scipy.linalg import expm
from scipy.optimize import minimize
from numpy.polynomial.legendre import leggauss
SEED = 20260920 + 713
rng = np.random.default_rng(SEED)
gx, gw = leggauss(40)
def quad_nodes(a, b):
return (a + b)/2 + (b-a)*gx/2, (b-a)*gw/2
def fun_matrix(evals, evecs, values):
return (evecs * values) @ evecs.T
def step_response(time, ev, U, B, K):
return K + B.T @ fun_matrix(ev,U,np.exp(-time*ev)/ev) @ B
def physical_graph(r, n=4):
weights = rng.uniform(.05,1.2,(r,r))
weights = (weights+weights.T)/2
weights[rng.random((r,r)) < .25] = 0
weights = np.minimum(weights,weights.T)
np.fill_diagonal(weights,0)
# Include positive boundary connections and grounding; this makes Q SPD.
B = rng.uniform(0,1.2,(r,n))
B[rng.random((r,n))<.25] = 0
internal_ground = rng.uniform(.05,.6,r)
Q = np.diag(weights.sum(axis=1)+B.sum(axis=1)+internal_ground)-weights
Lbb = np.diag(B.sum(axis=0)+rng.uniform(.05,.6,n))
K = Lbb-B.T @ np.linalg.solve(Q,B)
full = np.block([[Lbb,-B.T],[-B,Q]])
assert np.linalg.eigvalsh(full)[0]>0
return Q,B,K
def cp_factor_small_dnn(M):
"""Construct a nonnegative <=3-row factor via permuted Cholesky.
Existence for 3x3 DNN also follows from a normalized correlation argument.
This function checks a numerical factor rather than inferring cp-rank from rank.
"""
r=M.shape[0]
for perm in permutations(range(r)):
p=np.array(perm)
L=np.linalg.cholesky(M[np.ix_(p,p)])
if L.min()>=-2e-12:
F=np.zeros_like(L)
F[:,p]=L.T
return F
raise AssertionError('No nonnegative permuted Cholesky factor found')
step_error=gram_error=ramp_error=cp_small_error=0.
min_step_factor=1.
min_ramp_internal=1.
min_ramp_eigenvalue=1.
max_constant_cancellation=0.
cases=[]
for r in range(1,9):
for trial in range(20):
Q,B,K=physical_graph(r)
ev,U=np.linalg.eigh(Q)
t=float(rng.uniform(.2,2)); h=float(rng.uniform(.1,1.4))
times1,ww=quad_nodes(t,t+h)
times2,_=quad_nodes(t+h,t+2*h)
# Independently integrate the complete response, including unknown K.
numerical=sum(w*(step_response(x,ev,U,B,K)-step_response(y,ev,U,B,K))
for w,x,y in zip(ww,times1,times2))
target=B.T@fun_matrix(ev,U,np.exp(-ev*t)*(-np.expm1(-ev*h))**2/ev**2)@B
Ah=fun_matrix(ev,U,-np.expm1(-ev*h)/ev)
F=expm(-Q*t/2)@Ah@B
step_error=max(step_error,float(np.max(abs(numerical-target))))
gram_error=max(gram_error,float(np.max(abs(F.T@F-target))))
min_step_factor=min(min_step_factor,float(F.min()))
altered_K=K+rng.normal(size=K.shape)
altered=sum(w*(step_response(x,ev,U,B,altered_K)-step_response(y,ev,U,B,altered_K))
for w,x,y in zip(ww,times1,times2))
max_constant_cancellation=max(max_constant_cancellation,float(np.max(abs(altered-numerical))))
# Common monotone ramp: derivative is a positive mixture of beta densities.
duration=float(rng.uniform(.1,1.3))
s,ws=quad_nodes(0,duration)
x=s/duration
aa=rng.integers(1,6,3); bb=rng.integers(1,6,3)
mix=rng.uniform(.1,1,3); mix/=mix.sum()
density=sum(weight*x**(a-1)*(1-x)**(b-1)/beta_function(a,b)/duration
for weight,a,b in zip(mix,aa,bb))
ws=ws*density
assert abs(ws.sum()-1)<1e-12
start=duration+t
ts1,wt=quad_nodes(start,start+h)
ts2,_=quad_nodes(start+h,start+2*h)
# This integral is independent of the compact spectral formula below.
ramp_numerical=np.zeros((4,4))
for timeweight,time1,time2 in zip(wt,ts1,ts2):
v1=sum(w*step_response(time1-shift,ev,U,B,K) for w,shift in zip(ws,s))
v2=sum(w*step_response(time2-shift,ev,U,B,K) for w,shift in zip(ws,s))
ramp_numerical+=timeweight*(v1-v2)
ramp_scalar=sum(w*np.exp(-ev*(start-shift)) for w,shift in zip(ws,s))
M=fun_matrix(ev,U,ramp_scalar*(-np.expm1(-ev*h))**2/ev**2)
ramp_target=B.T@M@B
ramp_error=max(ramp_error,float(np.max(abs(ramp_target-ramp_numerical))))
min_ramp_internal=min(min_ramp_internal,float(M.min()))
min_ramp_eigenvalue=min(min_ramp_eigenvalue,float(np.linalg.eigvalsh(M)[0]))
if r<=3:
R=cp_factor_small_dnn(M)
Framp=R@B
assert Framp.min()>=-1e-11
cp_small_error=max(cp_small_error,float(np.max(abs(Framp.T@Framp-ramp_target))))
cases.append(dict(r=r,trial=trial,post_hold_start=start,ramp_duration=duration,h=h))
# Four-cycle target and a local (not globally certified) three-row approximation search.
F0=np.array([[1,1,0,0],[0,1,1,0],[0,0,1,1],[1,0,0,1]],float)
H0=F0.T@F0
delta=(2*math.sqrt(7)-5)/3 # Improved four-cycle support/Cauchy certificate.
lam=.25; t=1.; h=2.
coefficient=math.exp(-lam*t)*(-math.expm1(-lam*h))**2
Dstar=coefficient*H0
assert np.linalg.matrix_rank(H0)==3
K=4*np.eye(4)-np.ones((4,4))
B=lam*F0; Q=lam*np.eye(4)
ev,U=np.linalg.eigh(Q)
tt1,ww=quad_nodes(t,t+h); tt2,_=quad_nodes(t+h,t+2*h)
window1=sum(w*step_response(time,ev,U,B,K) for time,w in zip(tt1,ww))
window2=sum(w*step_response(time,ev,U,B,K) for time,w in zip(tt2,ww))
assert np.max(abs(window1-window2-Dstar))<1e-12
def constraints(z):
G=z[:12].reshape(3,4)
E=(G.T@G-H0).ravel()
return np.r_[z[12]-E,z[12]+E]
def jac(z):
G=z[:12].reshape(3,4)
J=np.zeros((16,12))
for i in range(4):
for j in range(4):
for k in range(3):
J[4*i+j,4*k+i]+=G[k,j]
J[4*i+j,4*k+j]+=G[k,i]
return np.vstack((np.column_stack((-J,np.ones(16))),np.column_stack((J,np.ones(16)))))
best=None; trials=[]
for restart in range(40):
G=rng.uniform(.01,1.2,(3,4))
e=float(np.max(abs(G.T@G-H0)))
z0=np.r_[G.ravel(),e+.1]
opt=minimize(lambda z:z[12],z0,jac=lambda z:np.r_[np.zeros(12),1.],
method='SLSQP',bounds=[(0,None)]*13,
constraints=[dict(type='ineq',fun=constraints,jac=jac)],
options=dict(maxiter=1500,ftol=1e-12))
actual=float(np.max(abs(opt.x[:12].reshape(3,4).T@opt.x[:12].reshape(3,4)-H0)))
trials.append(dict(success=bool(opt.success),objective=float(opt.fun),actual=actual))
if best is None or actual<best[0]: best=(actual,opt.x[:12].reshape(3,4))
assert best[0]>=delta-1e-9
# Same finite linear ramp for the target. After hold, its only change is a positive scale.
ramp_duration=.8; ramp_start=1.2
ramp_gain=math.expm1(lam*ramp_duration)/(lam*ramp_duration)
ramp_coefficient=math.exp(-lam*ramp_start)*(-math.expm1(-lam*h))**2*ramp_gain
# Controls: removing the post-hold or common-waveform assumptions can break the claim.
# Scalar physical graph Q=2, B=1, K=.5; unit-duration linear ramp.
# During the ramp the output is .5*t + .25*(1-exp(-2*t)).
bad_t=.1; bad_h=.2
bt1,bw=quad_nodes(bad_t,bad_t+bad_h); bt2,_=quad_nodes(bad_t+bad_h,bad_t+2*bad_h)
pre_hold_D=sum(w*(.5*x+.25*(-math.expm1(-2*x))-.5*y-.25*(-math.expm1(-2*y)))
for w,x,y in zip(bw,bt1,bt2))
assert pre_hold_D<0
# Two distinct positive linear ramps, both completed before measurement.
# A one-hidden-node, two-boundary-node physical graph with Q=1, B=(.3,.3).
durations=np.array([.2,1.]); different_gains=np.expm1(durations)/durations
unequal_D=np.outer(np.array([.3,.3]),np.array([.3,.3]))
unequal_D*=math.exp(-1.2)*(-math.expm1(-.5))**2*different_gains[None,:]
assert np.max(abs(unequal_D-unequal_D.T))>1e-4
results=dict(seed=SEED,random_cases=len(cases),hidden_node_counts=list(range(1,9)),
max_step_window_integral_error=step_error,
max_step_nonnegative_gram_error=gram_error,
minimum_step_factor_entry=min_step_factor,
max_unknown_constant_cancellation_error=max_constant_cancellation,
max_common_monotone_ramp_integral_error=ramp_error,
minimum_ramp_internal_matrix_entry=min_ramp_internal,
minimum_ramp_internal_eigenvalue=min_ramp_eigenvalue,
max_ramp_cp_factor_error_for_r_le_3=cp_small_error,
target=dict(lam=lam,t=t,h=h,coefficient=coefficient,H0=H0.tolist(),
window1=window1.tolist(),window2=window2.tolist(),Dstar=Dstar.tolist(),
analytical_cp3_entrywise_lower_bound=delta,
finite_window_entrywise_lower_bound=coefficient*delta,
lower_bound_if_each_window_has_entrywise_error_eta=coefficient*delta/2,
local_search_restarts=len(trials),local_search_best_error=best[0],
local_search_best_factor=best[1].tolist(),
local_search_is_global_certificate=False),
linear_ramp_target=dict(duration=ramp_duration,start=ramp_start,h=h,
coefficient=ramp_coefficient,
cp3_entrywise_lower_bound=ramp_coefficient*delta),
assumption_counterexamples=dict(
during_linear_ramp_scalar_D=pre_hold_D,
unequal_port_ramps_D=unequal_D.tolist(),
unequal_port_ramps_asymmetry=float(np.max(abs(unequal_D-unequal_D.T)))),
scope='Numerical identity checks and local searches only; cp-rank theorem not numerically proved.')
assert max(step_error,gram_error,ramp_error,cp_small_error)<1e-10
here=Path(__file__).resolve().parent
(here/'finite-window-results.json').write_text(json.dumps(results,indent=2))
print(json.dumps(results,indent=2))
検証結果のJSON
{
"seed": 20261633,
"random_cases": 160,
"hidden_node_counts": [
1,
2,
3,
4,
5,
6,
7,
8
],
"max_step_window_integral_error": 6.661338147750939e-16,
"max_step_nonnegative_gram_error": 3.885780586188048e-16,
"minimum_step_factor_entry": 0.0,
"max_unknown_constant_cancellation_error": 1.942890293094024e-16,
"max_common_monotone_ramp_integral_error": 3.469446951953614e-16,
"minimum_ramp_internal_matrix_entry": -6.541715128823755e-18,
"minimum_ramp_internal_eigenvalue": 1.13009856536003e-11,
"max_ramp_cp_factor_error_for_r_le_3": 1.3877787807814457e-17,
"target": {
"lam": 0.25,
"t": 1.0,
"h": 2.0,
"coefficient": 0.12057247444956556,
"H0": [
[
2.0,
1.0,
0.0,
1.0
],
[
1.0,
2.0,
1.0,
0.0
],
[
0.0,
1.0,
2.0,
1.0
],
[
1.0,
0.0,
1.0,
2.0
]
],
"window1": [
[
6.612868460660778,
-1.69356576966961,
-2.0,
-1.69356576966961
],
[
-1.69356576966961,
6.612868460660778,
-1.69356576966961,
-2.0
],
[
-2.0,
-1.69356576966961,
6.612868460660778,
-1.69356576966961
],
[
-1.69356576966961,
-2.0,
-1.69356576966961,
6.612868460660778
]
],
"window2": [
[
6.3717235117616475,
-1.8141382441191751,
-2.0,
-1.8141382441191751
],
[
-1.8141382441191751,
6.3717235117616475,
-1.8141382441191751,
-2.0
],
[
-2.0,
-1.8141382441191751,
6.3717235117616475,
-1.8141382441191751
],
[
-1.8141382441191751,
-2.0,
-1.8141382441191751,
6.3717235117616475
]
],
"Dstar": [
[
0.24114494889913113,
0.12057247444956556,
0.0,
0.12057247444956556
],
[
0.12057247444956556,
0.24114494889913113,
0.12057247444956556,
0.0
],
[
0.0,
0.12057247444956556,
0.24114494889913113,
0.12057247444956556
],
[
0.12057247444956556,
0.0,
0.12057247444956556,
0.24114494889913113
]
],
"analytical_cp3_entrywise_lower_bound": 0.09716754070972715,
"finite_window_entrywise_lower_bound": 0.011715730819550699,
"lower_bound_if_each_window_has_entrywise_error_eta": 0.005857865409775349,
"local_search_restarts": 40,
"local_search_best_error": 0.19667646705734654,
"local_search_best_factor": [
[
1.2261073939704767,
1.5461229265087625e-16,
2.775557561607473e-16,
0.975996452628978
],
[
0.5477081260978146,
1.4667000445401257,
0.35908991976909604,
4.1633363424112096e-17
],
[
0.0,
0.21323096961590574,
1.297402211891335,
0.9223635169488787
]
],
"local_search_is_global_certificate": false
},
"linear_ramp_target": {
"duration": 0.8,
"start": 1.2,
"h": 2.0,
"coefficient": 0.1269657203234949,
"cp3_entrywise_lower_bound": 0.012336946798273022
},
"assumption_counterexamples": {
"during_linear_ramp_scalar_D": -0.03112336525767142,
"unequal_port_ramps_D": [
[
0.004645836873957905,
0.007211163171446843
],
[
0.004645836873957905,
0.007211163171446843
]
],
"unequal_port_ramps_asymmetry": 0.0025653262974889386
},
"scope": "Numerical identity checks and local searches only; cp-rank theorem not numerically proved."
}設計計算・図の再現用Pythonコード
"""Deterministic illustrative design calculation; no experimental data."""
import json
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from scipy.optimize import brentq
HERE=Path(__file__).resolve().parent
lam,T,tau=.25,1.,.1
delta=(2*np.sqrt(7)-5)/3
x=brentq(lambda x:np.exp(x)-2*x-1,.1,3)
h=x/lam
phi=-np.expm1(-lam*T)/(lam*T)
A=np.exp(-lam*tau)*phi*(-np.expm1(-lam*h))**2
numbers=dict(lam=lam,ramp_duration=T,post_hold_delay=tau,window_width=h,
coefficient=A,delta=delta,integrated_certificate_radius=delta*A,
uniform_gain_error_lower_bound=delta*A/(2*h),optimal_lambda_h=x,
total_end_time=T+tau+2*h)
(HERE/'finite-window-design.json').write_text(json.dumps(numbers,indent=2))
plt.rcParams.update({'font.family':'DejaVu Sans','font.size':10,'axes.spines.top':False,
'axes.spines.right':False,'svg.fonttype':'none'})
fig,ax=plt.subplots(1,2,figsize=(10.8,3.8),layout='constrained')
t=np.linspace(0,14,500)
response=3+2*lam*phi*np.exp(-lam*t)
ax[0].plot(t,response,color='#087f8c',lw=2)
ax[0].axhline(3,color='#718184',ls='--',lw=1,label='Unknown steady term K11')
ax[0].axvspan(tau,tau+h,color='#148b83',alpha=.15,label='First integral (+)')
ax[0].axvspan(tau+h,tau+2*h,color='#d79542',alpha=.18,label='Second integral (-)')
ax[0].set(xlabel='Time after ramp ends (s)',ylabel='Boundary gain R11 (W/K)',
title='Two windows cancel the steady term',xlim=(0,14),ylim=(2.98,3.47))
ax[0].legend(fontsize=8,loc='upper right',frameon=False)
hs=np.linspace(.03,14,500)
bound=1e3*delta*np.exp(-lam*tau)*phi*(-np.expm1(-lam*hs))**2/(2*hs)
ax[1].plot(hs,bound,color='#087f8c',lw=2)
ax[1].scatter([h],[numbers['uniform_gain_error_lower_bound']*1e3],color='#bd7b29',zorder=5)
ax[1].annotate(f'h = {h:.3f} s\n{numbers["uniform_gain_error_lower_bound"]*1e3:.3f} mW/K',
(h,numbers['uniform_gain_error_lower_bound']*1e3),xytext=(7.5,3.1),
arrowprops={'arrowstyle':'->','color':'#596c6e'},fontsize=9)
ax[1].set(xlabel='Width of each window h (s)',ylabel='Certified error floor (mW/K)',
title='A guaranteed floor, not the optimum error',ylim=(0,5),xlim=(0,14))
for a in ax:a.grid(alpha=.15)
fig.savefig(HERE/'finite-window.svg')
fig.savefig(HERE/'finite-window.png',dpi=140)
print(json.dumps(numbers,indent=2))
Python 3、NumPy、SciPy、図にはMatplotlibを使用。コードを同じフォルダへ保存して実行すると結果ファイルを作る。HTML内の判定器は十分条件のみを計算し、非凸CPランク問題を解くものではない。
7. 近似を許しても、3個以下には係数誤差の下限がある
境界容量CBを固定する。内部熱容量が3個以下の任意の模型から得た係数をH̃とすると、
を示せる。これは無次元化した低周波記憶係数の最大成分誤差であり、温度の百分率誤差ではない。定数の最適性も主張しない。
鳩の巣原理による誤差下限の証明
最大成分誤差をε<1と仮定し、H̃を3本の非負因子の外積和に書く(不足分は零因子)。4つのサイクル成分は全て1−ε以上。各辺を、少なくとも(1−ε)/3を寄与する因子へ割り当てると、ある因子は二辺を担当する。
二辺が隣接する場合、例えば12と23では、その因子内で(f₁f₂)(f₂f₃)=(f₁f₃)f₂²≤H̃₁₃H̃₂₂≤ε(2+ε)。二辺が向かい合う場合も(f₁f₂)(f₃f₄)=(f₁f₃)(f₂f₄)≤ε²≤ε(2+ε)。従って((1−ε)/3)²≤ε(2+ε)。これを解けば8ε²+20ε−1≥0となり、表示の下限を得る。ε≥1なら自明。□
8. 何が既知で、どこが候補か
| 対象 | 数学的状態 | 新規性の状態 |
|---|---|---|
| Kron式・M-matrix・CP分解 | 既存理論を使用 | 既知。新規部分に含めない。 |
| H₀のrank3 / cp-rank4 | 既存論文と一致 | 既知例への帰属を確定。[34] |
| 正値制約による次数増大 | 一般理論が存在 | 既知。[35] |
| 単一極の熱実現条件・最少数 | 必要性・構成・最小性の証明草案 | 1973・1982・2009年の近い回路合成論文との本文比較が未了。新規とは認定しない。 |
| Hρの閾値ρ=1/2 | 独立証明と既知定理への代入 | Brandts–KřížekのCorollary 3.6・式(6)の直接系と確認。 |
| 最大成分誤差≥1/6 | 追究4で強化式・集約境界の最良性を証明 | 既知幾何定理の量的な系。明示式の先取性は未確定。全成分の最適距離は未決定。 |
| 二窓・有限立上りでの熱流誤差下限 | 追究3で特定波形について全rへ拡張 | 因子分解は既知Hankel構造の直接系。具体的な量的結合の新規性は未確定。 |
| 一般の温度予測・帯域誤差 | 未到達 | 入出力を変えた保証は別の研究問題。 |
本ノートはAIによる導出、別担当による独立監査、数値・有理数計算を含む。人間の専門家による査読と証明支援系による形式検証は未実施。証明の状態と学術的な新規性の状態を分ける。
重要な未読資料
Matsumoto(1982)は、最小実現からの線形変換、M-matrix、特殊な直交行列を使うtransformerless grounded RC合成を扱う。今回の制約と極めて近いので、定理5の全文比較が必要。要旨だけから同一とも非同一とも判断しない。相互容量の可否、接地、非最小実現、重複極、対角容量の制限を比較する。さらにStein(1973)は接地容量の多端子回路と容量個数の最小化を要旨に明示し、Kandić–Reljin(2009)も非最小の共通接地RC実現を扱う。これらの本文が未読である点は重要な限界。RC-in RC-out(2001)の全文も確認先である。[46] [47][33] [37]
調査の範囲と弱点
検索語はMori–Zwanzig、GLE、memory kernel、positive realization、RC synthesis、transformerless、grounded capacitors、single-pole admittance、completely positive rank、moment matching、finite-time reduction、chaotic homogenizationなどを横断した。関連論文の参照文献も追った。ただし技術語の検索に無関係な結果が多く、古い論文の索引・本文取得にも限界がある。検索件数や「見つからなかったこと」を新規性の証明として扱わない。
9. 次に突き詰める問い
| 優先 | 具体的な問い | 意味と打ち切り条件 |
|---|---|---|
| 1 | 測定誤差から状態数を棄却する証明を実機で検証 二窓のc²>Ξ(d,z)をRCアナログで試し、初期化・立上り・積分誤差を校正する。 | 有限時間への橋渡しは達成。次は実測で棄却余裕が残るか。強化式は既存SDPより強い厳密例を持つと確認。高次階層との比較、非一様な誤差区間、実測での校正が残る。 |
| 2 | 複数の記憶時間を共有する熱容量の最少数 Y=K+sCB+Σ sλℓ/(s+λℓ) Hℓを同時に実現する際の最少数を特徴づける。 | 各残差を独立に分解すれば十分な場合があるが、一般内部結合は符号付き残差も生む。単純にcp-rankの和と仮定しない。 |
| 3 | FDT整合の近似で、動的相関を保証 摩擦核の誤差から雑音因子と相関・経路の誤差まで、モード数に依存しない定数で抑える。 | 平衡一時刻分布は同じでも動きは違う。一般SVEの直接系に尽きるなら新規候補から外す。 |
| 4 | カオス系で、何を残せばよいか 残留記憶と閾値到達誤差を、保持変数の選択に結びつける。 | 軌道、分布、経路量を分ける。線形の最少実現理論との差分が出る小モデルから。 |
第一候補は1。数学側ではH₀からCPランク3以下までの距離をさらに挟む。現状は解析下界1/6、代数的に認証した上界約0.1966765。三つの集約制約の最良境界は決定できたが、全成分の距離は未決定。実用側では、4回の電圧固定・電流測定で二窓の棄却余裕を確認する。熱流入力→温度出力の因子分解も追究3で確認したが、数えるのはポートを含む全状態数。通常の点ポート模型の隠れ状態数を非自明に認証する課題は未解決。
今回得た命題が古い回路理論の系と判明しても、この方向の価値は失われない。既知の最小性を出発点にして、測定誤差や実時間予測へ使える量的な差分を探せる。
D. 基礎計算の再現コードと検証記録
最新の鋭い境界・SDP・有限窓のコードは、それぞれAとCの該当節に収録しています。コードは各節のボタンから取り出せます。
10. 再現計算と、その役割
seed=20260920。ランダムな非負因子から120個の熱ネットワークを構成し、各42点、合計5,040点の実・虚Laplace変数で境界応答を比較した。これは構成式の実装確認であり、最小性や新規性の証拠は上の証明・文献照合が担う。
| 確認 | 結果 |
|---|---|
| 指定したYとの相対誤差の最大 | 6.996e-16 |
| H=WᵀCIWの相対誤差の最大 | 4.073e-16 |
| 基礎行列の通常ランク | 有理数の掃き出し法で3 |
| 3抽象状態/4熱容量の応答差 | 周波数点で最大 8.882e-16 |
| 滑らかな温度パルスの熱流差 | 401時刻で最大 2.254e-10 |
| 因子数閾値・最少数 | 数値最適化の成功失敗ではなく、収録した証明による。 |
文書検査(再編版・追加査読反映後):61件の文献ID、内部リンク、重複ID、埋め込みコードを確認。幅320・390・768・1100 pxのブラウザ表示と主要操作を検査した。圧縮ログのJSON復元は元ファイルとバイト単位で一致し、外部通信は発生しない。これらの文書・実装検査は数学的証明の代わりではない。
再現用Python(NumPy・SciPy、コード全文)
下のボタンでこのページに埋め込まれたコードを保存できる。実行すると同じフォルダーに検証JSONと応答データを出力する。
"""Reproduce finite numerical checks in thermal-memory research note.
Python 3 + NumPy + SciPy. Numerical checks do not establish minimality.
"""
import json
import math
from pathlib import Path
from fractions import Fraction
import numpy as np
from scipy.linalg import expm
SEED = 20260920
rng = np.random.default_rng(SEED)
def laplacian(weights):
return np.diag(weights.sum(axis=1)) - weights
def build(F, lam, K, cb):
# F has one nonnegative row per hidden heat-capacity node.
H = F.T @ F
z = F.sum(axis=1)
assert np.all(z > 0)
caps = z*z
W = F / z[:, None]
links = lam * caps[:, None] * W
direct = K - lam*(np.diag(H.sum(axis=1))-H)
Lbb = direct + np.diag(links.sum(axis=0))
Lbi = -links.T
Lii = np.diag(lam*caps)
return Lbb, Lbi, Lii, caps, direct
def response(s, parts, cb):
Lbb,Lbi,Lii,caps,_ = parts
return Lbb+s*np.diag(cb)-Lbi@np.linalg.solve(Lii+s*np.diag(caps),Lbi.T)
def exact_rank(mat):
a = [[Fraction(int(v)) for v in row] for row in mat]
row = 0
for col in range(len(a[0])):
pivot = next((i for i in range(row,len(a)) if a[i][col]),None)
if pivot is None: continue
a[row],a[pivot]=a[pivot],a[row]
v=a[row][col]; a[row]=[x/v for x in a[row]]
for i in range(len(a)):
if i != row:
v=a[i][col]; a[i]=[x-v*y for x,y in zip(a[i],a[row])]
row+=1
return row
worst_response=worst_moment=worst_rowsum=0.
checks=0
ss = np.r_[np.logspace(-4,3,21), 1j*np.logspace(-4,3,21)]
for case in range(120):
n=int(rng.integers(2,9)); r=int(rng.integers(1,9))
F=rng.uniform(.1,2,(r,n))
F[rng.random((r,n))<.3]=0
for row in F:
if row.sum()==0: row[int(rng.integers(n))]=1.
H=F.T@F; lam=float(rng.uniform(.1,2))
a=rng.uniform(.1,1,(n,n)); a=(a+a.T)/2
weights=lam*H+a; np.fill_diagonal(weights,0)
K=laplacian(weights); cb=rng.uniform(.1,2,n)
parts=build(F,lam,K,cb)
Lbb,Lbi,Lii,caps,direct=parts
W=-np.linalg.solve(Lii,Lbi.T)
moment=W.T@np.diag(caps)@W
worst_moment=max(worst_moment,np.linalg.norm(moment-H)/max(1,np.linalg.norm(H)))
L=np.block([[Lbb,Lbi],[Lbi.T,Lii]])
worst_rowsum=max(worst_rowsum,np.max(np.abs(L.sum(axis=1))))
off=L.copy(); np.fill_diagonal(off,0)
assert off.max()<1e-10
assert np.linalg.eigvalsh(L)[0]>-1e-10
for s in ss:
target=K+s*np.diag(cb)+s*lam/(s+lam)*H
error=np.linalg.norm(response(s,parts,cb)-target)/max(1,np.linalg.norm(target))
worst_response=max(worst_response,float(error)); checks+=1
F0=np.array([[1,1,0,0],[0,1,1,0],[0,0,1,1],[1,0,0,1]],float)
H0=F0.T@F0
K=laplacian(np.ones((4,4))-np.eye(4)); cb=np.ones(4); lam=.25
parts=build(F0,lam,K,cb)
# Exact algebraic rank and positive 4-factor identity.
assert exact_rank(H0.astype(int))==3
Q=np.array([[.5,-math.sqrt(3/8),math.sqrt(3/8)],
[math.sqrt(3/8),-.25,-.75],
[math.sqrt(3/8),.75,.25]])
worst_factor=0.
for rho in [0,.01,.05,.25,.49,.5,.75,1,2,10]:
H=H0+rho*np.ones((4,4))
alpha=(math.sqrt(1+rho)-1)/2
F4=F0+alpha*np.ones((4,4))
worst_factor=max(worst_factor,float(np.max(np.abs(F4.T@F4-H))))
V=np.array([[math.sqrt(1+rho)]*4,[1,0,-1,0],[0,1,0,-1]],float)
assert np.max(np.abs(V.T@V-H))<1e-12
if rho>=.5:
F3=Q@V
assert F3.min()>-1e-12
worst_factor=max(worst_factor,float(np.max(np.abs(F3.T@F3-H))))
# A signed 3-mode realization has precisely the same full transfer.
vals,vecs=np.linalg.eigh(H0); keep=vals>1e-10
G=np.sqrt(vals[keep])[:,None]*vecs[:,keep].T
assert G.shape==(3,4)
algebraic_error=0.
for s in ss:
reduced=K+lam*H0+s*np.diag(cb)-lam**2/(s+lam)*(G.T@G)
algebraic_error=max(algebraic_error,float(np.max(np.abs(reduced-response(s,parts,cb)))))
# Dynamic numerical check with a smooth boundary temperature pulse.
from scipy.integrate import solve_ivp
def u(t): return np.array([t*t*np.exp(-t),0.,0.,0.])
def du(t): return np.array([(2*t-t*t)*np.exp(-t),0.,0.,0.])
Lbb,Lbi,Lii,caps,_=parts
times=np.linspace(0,20,401)
physical=solve_ivp(lambda t,z:(-Lii@z-Lbi.T@u(t))/caps,[0,20],np.zeros(4),t_eval=times,rtol=1e-10,atol=1e-12)
abstract=solve_ivp(lambda t,z:-lam*z+lam*G@u(t),[0,20],np.zeros(3),t_eval=times,rtol=1e-10,atol=1e-12)
q4=np.array([Lbb@u(t)+Lbi@z+du(t) for t,z in zip(times,physical.y.T)])
q3=np.array([(K+lam*H0)@u(t)-lam*G.T@z+du(t) for t,z in zip(times,abstract.y.T)])
results=dict(seed=SEED,random_networks=120,frequency_checks=checks,
max_relative_transfer_error=worst_response,max_relative_moment_error=worst_moment,
max_laplacian_rowsum_residual=worst_rowsum,
base_eigenvalues=np.linalg.eigvalsh(H0).tolist(),base_exact_rank=3,
factor_identity_max_absolute_error=worst_factor,
algebraic3_physical4_max_transfer_difference=algebraic_error,
pulse_max_absolute_difference=float(np.max(np.abs(q3-q4))),
approximate_moment_lower_bound=(3*math.sqrt(3)-5)/4)
assert worst_response<1e-10 and worst_moment<1e-10
assert np.max(np.abs(q3-q4))<1e-8
here=Path(__file__).resolve().parent
(here/'verification-results.json').write_text(json.dumps(results,indent=2))
np.savez(here/'pulse-data.npz',times=times,q3=q3,q4=q4)
print(json.dumps(results,indent=2))
E. 文献61件:確認した範囲と未取得資料
本文を確認した資料と、要旨・書誌のみの資料を区別しています。61件全てを全文精読したという意味ではありません。追加した2件は、上記の確認範囲を明記した照合候補です。
11. 主要文献61件と確認範囲
本文確認済み=関連する定理・設定・導出を点検。要旨のみ=その範囲を超えた同値性判断には使用しない。プレプリント年と刊行年が異なる場合は併記。解説論文はその旨を記載。