温度を変えても、内部はすぐには追いつかない。
物体を小さな「熱を蓄える点」と、それらをつなぐ「熱の通り道」で表してみます。外側の温度を変えると、内側の温度は時間をかけて追いつきます。この遅れが、外から見た過去の影響=記憶を生みます。
ここでは、熱容量は正、伝導率は非負で、どちらの向きにも同じ伝導率を持つ線形模型に絞ります。
入力する境界を選び、時間を動かしてみてください。他の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個に減らすと、結合をゼロにする必要がある?
同じ行列でも、因子の成分にゼロを許すか、すべて正を要求するかで必要な本数が変わります。後者の最少本数をCP-plusランクと呼びます。公開著者稿の概念・定理と既知の境界を組み合わせると、この族では次の違いが分かります。[61]
上のρスライダーと連動します。表示は非負Gram因子Fの丸め値で、FᵀF=Hρ。各行が一つの内部点に対応し、ゼロはその境界との結合がないことを表します。数値の大きさは伝導率そのものではありません。
ρ=1/2では「ゼロを許せば3個、全結合を正にすると4個」。ただしρを少し増やすと正の3行因子で任意に近づけられます。これは厳密実現の差であり、正の近似誤差下限ではありません。分類・証明・回路条件
誤差を、3状態に有利な向きへ広げてみる。
現実の測定はぴったりの値ではありません。以下は、既知の倍率aで割ったH₀の無次元尺度での説明です。その各成分に、最大ηの誤差を認めます。四辺は小さめに、対角と向かい合う組は大きめに見積もり、それでも境界を越えるかを調べます。
上段は三集約の判定。下段は、H₀の全成分が指定された誤差内にある場合の追加保証です。
H₀の場合、この条件はとても短い計算になります。
したがって η ≥ 1/6
自分の集約値を入れて判定する
4×4の対称化済み測定行列から、四辺の最小値m、対向する2組の最大値z、対角の最大値dを求めます。ηは、全成分を同時に覆う誤差幅です。全て同じ単位で入力してください。
簡易判定器 — 最良集約式 c² > Ξ(d,z)
最良集約式 c² > Ξ(d,z) による十分条件。初期値は熱回路の設計例。測定値の集約と誤差幅を変更できます。
標準偏差や相対誤差率を、そのままηに入れることはできません。統計的な信頼区間を使う場合も、全成分を同時に覆う保証が必要です。
情報を二つ追加すると、保証が強まります。たとえば誤差0.17では三集約式は保留ですが、全成分の上下限を使えば3状態以下を排除できます。導出と有理数の証明書
五つの上下限で、もう一段詳しく判定する
各成分の誤差をすでに含めた上下限を入力します。Lは対角の下限の最小、Dは対角の上限の最大、mは四辺の下限の最小、Mは四辺の上限の最大、zは対向する2組の上限の最大です。同じ単位でそろえてください。
まず既存の三集約式を試し、保留なら五値条件を試します。五値条件は0<z<m≤M<L≤Dなどの前提を満たす場合だけ適用します。条件を満たさない場合も「3状態で十分」とは判定しません。画面の小数計算には保守的な丸め余裕を設け、11/62の定理自体は別の有理数コードで厳密検算しています。条件と証明
達成できない精度を、設計の前に見分ける。
少ない状態で実装したいとき、調整を続ければ目標精度へ届くとは限りません。この判定は、選んだ模型の種類と状態数で、目標精度が原理的に可能かを調べるために使えます。
1 Kを1秒で線形に立ち上げ、0.1秒待ってから、各5.025725秒の二窓を測る例です。容量の尺度1 J/K、緩和率0.25 s⁻¹。4回の入力実験・4出力・観測区間のどこかで、この大きさ以上の誤差が必要になります。
行列の誤差下限を、波形の誤差へ戻すには、積分の長さを使います。熱流応答の最大誤差をEとすると、二窓差の誤差は高々2hE。新しい係数下限11/62を使うと、この合成例では E≥11a/(124h) です。前の窓幅スライダーと同じ解析式による換算です。
全ての出力に常時7.79 mWの誤差が出る、という意味ではありません。温度予測の誤差下限でもありません。合成回路での理論値で、実物・製品データによる検証は未実施です。
熱モデル
複数境界を持つ簡略化モデルで、内部状態をどこまで減らすかの判断に。ただし、ここでの入力は温度、出力は熱流です。
抵抗・コンデンサ回路
電圧と電流で同じ数式を実験できます。総立上り1 msの区分二次波形など、指定した電気的縮尺では約7.784 µAの対応下限が得られます。
実験へ移すときにそろえる条件
- 各入力実験を同じ初期平衡から始める。
- 境界ごとに同じ単調な立上り波形を使い、立上り後に二窓を置く。
- 正の熱容量・非負の相反伝導という模型クラスを用いる。
- 測定誤差、数値積分誤差、許容する模型誤差を合わせた幅で判定する。
測定器の動特性を除いた真の熱流、または妥当に補正した熱流を使うことも必要です。模型の内部状態数は、実物の材料の層数や部品の個数そのものとは限りません。有限時間の検証では、候補模型の緩和率を目標に一致させる必要はありません。測定条件と適用範囲 / 最新の単位換算
測定器にも「記憶」があると、どうなる?
内部熱容量が0個の合成回路でも、既知の境界容量とセンサーの一次遅れが組み合わさると、観測された二窓差はH₀に比例します。そのまま判定すると、測定器の動きを物体の内部と取り違えます。
内部0個、境界容量CB=4I、境界伝導K=2I−A(C₄)。単位ステップ、センサー時定数1秒、最初の窓は0.1秒後、各窓1秒。単位入力で割った二窓差を表示。理想化した解析的反例で、実測データではありません。
時定数θが既知なら、観測yの二窓差Dyと3時刻の端点値から補正できます。微分の数値計算は不要です。
補正は雑音も増幅します。観測誤差を全時刻でσ以下と保証できる場合、二窓差の誤差は高々(2h+4θ)σ。積分誤差・時定数の校正誤差も別途加えます。未校正の測定器へこの式をそのまま適用することはできません。反例・補正式・誤差予算の証明
補正後、未知の一定の正ゲインは相反する2測定の幾何平均と対角正規化で消せます。状態数の判定には使えますが、mWへ換算するには絶対校正が必要です。倍率の相殺と個別誤差の伝播
次へ:どこまで証明でき、新規性はどこに残る? →分かったことと、まだ分からないこと。
到達点は、既知の幾何定理から、状態数を判定する鋭い数式を導き、誤差のある有限時間測定へつないだことです。証明の有無と、学術的に初めてかどうかは別に評価しています。
| 内容 | 現在の位置づけ |
|---|---|
| H₀の「通常ランク3/CPランク4」、Hρの境界、基礎の幾何定理 | 既知先行研究へ帰属。 |
| 三集約値の最良境界、五値による11/62下界、有限時間の熱流下限 | 証明を記録今回導出・独立監査。同じ式の先取性は未確定。 |
| ρ=0.4で既存SDPの一つは下界3に留まり、今回の式は3状態を排除 | 厳密比較有理数の証明書を検算。既存手法全体より強いとは言わない。 |
| ゼロ結合を許すかで異なる最少数:境界では3と4 | 既知結果の具体化CP-plusランクで説明。近似誤差下限とは区別。 |
| 一次遅れの補正、一定ゲインの相殺、測定誤差の区間伝播 | 証明を記録モデル条件を明示した代数的な拡張。実機検証は未実施。 |
| 定常結合を厳密に保つ集団測定での最少内部容量数(例:n=10、ε/c₀=0.05で85個)、任意の非負測定核での上限 Ck、総容量による観測上界 (B/4)Gw | 証明を記録下限と構成が一致。2026 10 03に数値を独立検算。85の節 / 一般定理 / 総容量 |
| 最小近似誤差そのもの、実機での有効性、未読文献との重複 | 未解決・未確認次の検証対象。 |
最小の誤差は、まだこの間にある。
H₀から3行以下の非負因子で作れる行列までの、最大成分誤差の最小値をD₃とします。
上側は具体的な近似行列の構成から、下側は各成分の上下限を使った新しい評価から得ています。以前の1/6から約6.45%強まりましたが、元の行列へ最も近い3状態模型まで決定したわけではありません。
本ノートの局所探索では約0.196676467を得ており、追加査読でも同じ値が繰り返し得られたと報告されています。この値へ下界を近づけることは残る数学的課題という数値的な手掛かりです。ただし、よりよい近似が存在しないことの証明ではありません。
新たにBomze–Dickinson–Stillの公開著者稿を本文照合し、正距離の存在や正因子化の一般論を既知結果へ帰属しました。追加リストの古典回路論文・2026年公開の角度条件論文・書籍の中心本文は未取得です。具体的な式と手順の先取性は未確定です。照合の詳細
何を保存するかが、減らせる限界を変える。
最初の目的は、現実の複雑な物体を、どこまで小さな模型に置き換えられるかを知ることでした。ここからは、4境界の数値を改善する段階を進め、境界の数・許容誤差・保存する物理条件の関係を調べます。
今回の中心命題は、定常応答を厳密に保存する場合には、誤差を許した過渡応答にも二乗規模の内部状態が必要になる例があることです。定常応答にも誤差を許すと、既知の疎化定理によって大幅に減らせます。これは一般の物体すべてに二乗の下限があるという主張ではありません。
| 同じ対象に課す条件 | この族での結論 |
|---|---|
| 符号を自由に使い、全応答を厳密再現 | 通常の最小次数は 2n−1 |
| 熱回路として全応答を厳密再現 | 最少内部容量数は n² |
| 定常応答を厳密保存し、集団加熱の過渡応答には一定の誤差を許す | 必要数はなお 少なくとも定数×n² |
| 定常・過渡の両方に相対尺度 δ の誤差を許す | 既知の構成で O(n/δ²) 個にできる |
nは左右それぞれの境界数で、合計2n境界。第3行は今回の下界、第4行はBSS疎化定理の応用です。第3行の集団測定の誤差と、第4行の全周波数の作用素誤差は異なる定義です。以下で両方を固定します。命題と証明
2026 09 29の追記:下の図は従来の一般下界です。定常応答を厳密に保つ場合には、次節で下界と構成が一致し、最少個数まで決まりました。
左右それぞれnか所。右側をすべて同じ温度だけ上げ、左側の熱流の平均を測ります。必要な定常結合の情報は、設計仕様などで別に与えられているものとします。各境界の温度振幅は固定ですが、全体の加熱資源まで固定した比較ではありません。
β=0は定常結合の元の上限。β>0では交差結合の上限をλc₀(1/n+β)へ緩めます。同じ側の定常結合のゼロは保つ比較です。そこにも誤差を許す場合は、後述の漏れを含む評価が必要です。
この緑の線は従来の一般下界です。定常応答を厳密に保つ場合の最少個数は、次節のラボで計算できます(n=10、0.05では28ではなく85)。
合成例。容量尺度c₀、緩和率λ。温度の時間微分が三角形になる立上りを0.2/λ秒かけて行い、0.1/λ秒待機、各窓1/λ秒。α=e−0.1[(1−e−0.1)/0.1]²(1−e−1)²。表示は必要数の下限で、最適近似模型の個数ではありません。誤差には測定・積分・補正・許容近似を含めます。
新理論へ進むための、次の中心問題。
候補となる研究の軸は、「指定した物理条件と実験精度の下での最少状態数」です。誤差εだけでなく、入力の組み合わせ、観測時間、定常結合の許容幅も引数に持たせます。名前を付けたこと自体を新規性とは数えません。
今回、一般グラフでの下界と、ゼロ結合に漏れがある場合の補正まで証明を記録しました。この時点での課題だった下界に近い模型の構成と有限精度への補正は、次節で進展しました。熱伝導データで既存の削減法と比較する実証は残っています。小信号の範囲では非線形熱回路にも橋を架けられますが、カオスの予測限界を得たわけではありません。
数学的状態:証明を記録し、独立に監査。学術的新規性:未確定。既知のCPランク・Kron縮約・BSS疎化を使い、今回の差分候補を「定常結合の上限+有限時間の集団測定による近似次数下界」に絞っています。先行研究との対応
中心命題の正確な条件と証明を読む
1. 対象と、数えるもの
正の対角内部容量C、非負の相反伝導、r個の内部状態、境界から到達できる安定な内部部分を持つ熱回路を考える。Q=C⁻¹ᐟ²LIIC⁻¹ᐟ²は正定値Stieltjes行列、B=C⁻¹ᐟ²(−LIB)≥0。定常応答をK=LBB−BᵀQ⁻¹Bとする。境界容量は数えず、立上り完了後の窓でその直接微分項を除く。
c₀>0、λ>0、n≥2とし、Jはn×n全1行列、
L = [ I −J/n ; −J/n I ]
K = λc₀L, Y(s) = K + sλc₀H̄/(s+λ).
各交差辺に1個、容量4c₀/n、両端への伝導率2λc₀/nの星を置けば、この応答を実現する。総容量は4nc₀、各境界の伝導率の合計は2λc₀で、境界当たりの資源をnとともに増やしてはいない。ただし個々の部品値は1/nで小さくなり、製造できる最小部品値は仮定していない。H̄は通常ランク2n−1。非負因子の各行は左右各1点までしか同時に支えられず、n²交差辺があるのでCPランクn²。このCPランクは既知の例でもある。[70] 従来の単一緩和率の実現命題から、厳密な物理最小数もn²である。
2. 任意の緩和率を持つ候補に対する下界
候補模型の緩和率や内部接続は、目標と一致させなくてよい。理想ステップの過渡行列をM(t)=BᵀQ⁻¹e−QtBと置くと、成分ごとに
0≤Mᵢⱼ(t)≤Mᵢⱼ(0)≤−Kᵢⱼ (i≠j).
最後の不等式はM(0)=LBB−KとLBB,ij≤0による。Kを保存すると、同じ側の非対角成分は0、交差成分はλc₀/n以下である。
理想ステップ後t>0の二窓差DはFᵀFで、F=e−Qt/2[∫₀ʰe−Qsds]B≥0。従ってcp-rank(D)≤r。また0≤Dᵢⱼ≤h(−Kᵢⱼ)。自己畳み込みによる有限立上りにも、既述の非負因子分解と、M(0)以下の正の平均であることから同じ結論が成立する。
同じ側の非対角が0なので、Fの各行は交差辺を高々1つしか担当できない。正の交差成分の数をmとするとm≤cp-rank(D)≤r。集団応答d=(1/n)Σi∈左,j∈右Dᵢⱼについて、
これは右側すべてに単位温度を入力し、左側の熱流を平均して二窓差を取った値である。n²成分の平均ではなく、交差成分の総和をnで割っている。定常Kの情報が別に必要であり、これだけの実験で全定常結合まで分かるとは主張しない。
目標ではD*=c₀αH̄、d*=c₀α。|d−d*|≤εを要求するすべての候補は、
ここでx₊=max(x,0)。理想ステップならα=e−λt(1−e−λh)²。長さTの一様分布と自身の畳み込みを温度微分に使い、2Tで立上りを完了、τ待機する場合はα=e−λτ[(1−e−λT)/(λT)]²(1−e−λh)²。αとλhを固定しε/c₀<αなら、下界はn²に比例する。□
3. 定常結合の許容幅を変える
同じ側のゼロを保ち、交差成分について−K̃ᵢⱼ≤λc₀(1/n+β)だけを要求する場合は、同じ証明で
固定したβ>0では、この下界は大きなnに対して一次の規模へ弱まる。これは下界の変化であり、同じ個数で構成できるという十分条件ではない。
4. 定常応答も近似してよければ、小さい構成がある
S=diag(I,−I)と置くとH̄=SLS。既知のBSS定理から、0<δ<1に対し、元の交差辺を重み付きで選んだL̃が存在し、(1−δ)L≼L̃≼(1+δ)L、辺数≤⌈4(2n−1)/δ²⌉となる。H̃=SL̃S、K̃=λc₀L̃を同じ星構成へ戻す。
‖K̃−K‖₂ ≤ 2λc₀δ,
supω∈ℝ ‖Ỹ(iω)−Y(iω)‖₂ ≤ 4λc₀δ.
‖L‖₂=‖H̄‖₂=2と|iωλ/(iω+λ)|≤λから最後の式が従う。選ばれた辺の重みは元より大きくなり得るため、K厳密保存の場合の下界とは矛盾しない。固定δに対してO(n/δ²)個だが、有限nでは表示した上界がn²を下回るとは限らない。BSSを新しい結果とは扱わず、この物理族への応用として帰属する。[68]
一般の結合グラフと、小さな漏れまで拡張する
一般の定常結合グラフ
κᵢⱼ=−Kᵢⱼ>0の辺からなるグラフGを考える。二窓行列Dの非負因子1行の支持はGのクリーク(全頂点対が辺で結ばれた集合)である。よってr状態の動的応答が使える辺は、高々r個のクリークの和集合に含まれる。
辺ごとの非負重みwₑを指定し、Γᵣを「高々r個のクリークの和集合に入る辺のΣwₑκₑの最大値」と定めると、
各辺のDₑ≤hκₑを、因子が使う辺の和集合で足せばよい。三角形のないグラフでは、Γᵣはwₑκₑの大きい順r辺の和になる。一般グラフでのΓᵣの計算が効率的とは主張しない。クリーク制約の基礎は既知の非負因子・Kron縮約の構造である。[69]
同じ側のゼロにも漏れがある場合
DがCPで、二群U,Vに分かれるとする。SUV=Σ交差成分、TU,TV=各群の対角総和、WU,WV=各群の非対角総和とする。Wは順序付きの和で、対称な一つの辺を2回数える。b>0が交差成分の共通上限なら、
+ √(TVWU) + √(WUWV).
証明:因子1行のU部分をu≥0、m=max uᵢ、a=Σuᵢ−mとすると、wᵤ=(Σuᵢ)²−‖u‖²≥(Σuᵢ)a≥a²。V側も同様。行ごとの交差総和を、最大座標同士の積と残り3項へ展開する。最大同士の積はb以下、残りを行方向にCauchy–Schwarzで合計すれば上式を得る。□
従って左辺の下限から平方根3項の上限を引き、bの上限で割れば状態数下界になる。b=0なら交差総和も0であり、交差信号からは下界を出せない。正の信号とb=0が同時に保証されるなら、模型クラスとの不整合である。実測で使うには対角総和の上限など追加情報が必要で、集団加熱1回だけでは全てそろわない。
非線形模型への限定的な橋
正の対角容量と、瞬時・相反・受動的な辺の熱流則を持つ滑らかな非線形回路を、一様平衡の周りで線形化すると同じ構造を得る。そのため、r状態で上の一次応答を再現できない場合、非線形化だけで誤差をo(a)へ消すことはできない(aは入力振幅)。有限振幅の保証aγ−Ma²には二階変動の上界Mが必要で、全模型へ共通に言うなら共通のMを仮定する。これは標準的な線形化の系で、一般受動モデルや非線形カオス全体への下界ではない。
何が既知で、どこが今回の差分候補か
既知:非負実現で通常次数より多い状態が必要になること、二部グラフのCPランク、時間Hankel因子からの次数下界、Kron縮約後のクリーク構造、BSSによる疎化。Kordaらの§4.2 Lemma 13・式(51)はCP支持の被覆による下界を既に扱い、Example 14は完全二部グラフのn²を示す。重み付き被覆という整理も既存の因子数下界の自然な具体化であり、独立した新理論とは数えない。[70]
今回の差分候補:固定した定常結合の成分別上限から、有限立上り・有限二窓の集団測定に対し、候補の緩和率を固定せずに得る近似次数の下界。一般グラフの重み付き評価と、同群成分への漏れを含む不等式も、今回導出した命題として記録する。数学的証明と学術的な初出の判定は別である。
公開本文ではBSSのTheorem 1.1・3.1、Dörfler–BulloのarXiv v1 Theorem 6を照合した。既存の正値実現理論には、Hankel非負因子だけでは同じ次数の時間発展を実現できない例もある。時間データを増やすだけで実現の必要十分条件が得られる、という拡張は採用しなかった。
残る重要な検証:古典的な接地容量RC合成・最小性の未取得本文、制約付き近似次数に関する別表現の結果、現実の熱回路データとの比較。全ての近似ノルムや物理模型に対する一般理論が完成したとは主張しない。形式証明、外部の専門家による査読、実機実験は未実施。
独立数値検証と再現コード
250個の物理ネットワークで、理想ステップと有限立上りの計500条件を確認。さらに一般CP因子750例と境界例5例で漏れの不等式を確認した。解析的証明が主であり、有限検査は証明や新規性の判定を代用しない。
Python 3、NumPy、SciPyを使用。コードを実行すると全例のJSONを生成する。
#!/usr/bin/env python3
"""Independent finite-dimensional checks for the Round 7 fixed-K certificate.
These reproducible numerical checks are not proofs. The physical generator
builds conductances and diagonal capacities before forming Q and B. No target
CP factor is used to construct the physical cases.
Definitions: U,V each contain n boundary ports; S = sum(D[U,V]); d = S/n is
the average left output when all right inputs have amplitude one. It is not
the average over n**2 matrix entries. W_U and W_V are ORDERED off-diagonal
sums in their respective principal blocks.
"""
from __future__ import annotations
import json
import math
from pathlib import Path
import numpy as np
from scipy.linalg import block_diag, eigh, expm, solve
SEED = 20260922
RNG = np.random.default_rng(SEED)
TOL = 2e-8
def laplacian_from_edges(size, edges):
out = np.zeros((size, size))
for i, j, g in edges:
out[i, i] += g
out[j, j] += g
out[i, j] -= g
out[j, i] -= g
return out
def physical_case(index, approximate=False):
n = int(RNG.integers(1, 7))
lam = float(10 ** RNG.uniform(-1, 1))
kappa = lam / n
delta = float(kappa * RNG.uniform(0.001, 0.3)) if approximate else 0.0
kcross = (kappa + RNG.uniform(-delta, delta, (n, n))
if approximate else np.full((n, n), kappa))
num_components = 0 if index == 0 else int(RNG.integers(1, 13))
comps = []
for _ in range(num_components):
i, j = map(int, RNG.integers(0, n, 2))
size = int(RNG.integers(1, 5))
caps = 10 ** RNG.uniform(-1, 1, size)
internal = laplacian_from_edges(size, [
(a, a + 1, float(10 ** RNG.uniform(-1, 1)))
for a in range(size - 1)
])
spokes = np.zeros((size, 2))
if RNG.random() < 0.5:
spokes[0, 0] = 10 ** RNG.uniform(-1, 1)
spokes[-1, 1] = 10 ** RNG.uniform(-1, 1)
else:
spokes = 10 ** RNG.uniform(-1, 1, (size, 2))
lint = internal + np.diag(spokes.sum(axis=1))
cross0 = float((spokes.T @ solve(lint, spokes, assume_a="pos"))[0, 1])
comps.append(dict(i=i, j=j, size=size, caps=caps, lint=lint,
spokes=spokes, cross0=cross0))
for i in range(n):
for j in range(n):
chosen = [c for c in comps if c["i"] == i and c["j"] == j]
if not chosen:
continue
weights = RNG.dirichlet(np.ones(len(chosen)))
occupancy = 1.0 if index % 13 == 0 else float(RNG.uniform(0.02, 0.98))
for c, weight in zip(chosen, weights):
alpha = occupancy * kcross[i, j] * weight / c["cross0"]
c["lint"] *= alpha
c["spokes"] *= alpha
r = sum(c["size"] for c in comps)
if r:
lint = block_diag(*(c["lint"] for c in comps))
caps = np.concatenate([c["caps"] for c in comps])
spokes = np.zeros((r, 2 * n))
offset = 0
for c in comps:
sl = slice(offset, offset + c["size"])
spokes[sl, c["i"]] = c["spokes"][:, 0]
spokes[sl, n + c["j"]] = c["spokes"][:, 1]
offset += c["size"]
cinvhalf = 1 / np.sqrt(caps)
Q = cinvhalf[:, None] * lint * cinvhalf[None, :]
B = cinvhalf[:, None] * spokes
M0 = B.T @ solve(Q, B, assume_a="pos")
poles, eigenvectors = eigh(Q)
assert poles[0] > 0
else:
Q, B = np.empty((0, 0)), np.empty((0, 2 * n))
M0 = np.zeros((2 * n, 2 * n))
spokes = np.zeros((0, 2 * n))
poles, eigenvectors = np.array([]), np.empty((0, 0))
direct_cross = kcross - M0[:n, n:]
assert direct_cross.min() >= -TOL * max(1., kappa)
direct = laplacian_from_edges(2 * n, [
(i, n + j, max(0., direct_cross[i, j]))
for i in range(n) for j in range(n)
])
Lbb = direct + np.diag(spokes.sum(axis=0))
K = Lbb - M0
expected_K = laplacian_from_edges(2 * n, [
(i, n + j, kcross[i, j]) for i in range(n) for j in range(n)
])
assert np.max(np.abs(K - expected_K)) <= TOL * max(1., np.max(np.abs(K)))
h = float(10 ** RNG.uniform(-1, 1) / lam)
wait = 0.0 if index % 11 == 0 else float(RNG.uniform(0.01, 1) / lam)
duration = 0.1 / lam # each uniform factor; total ramp duration = 2*duration
results = []
for protocol in ("ideal_step", "triangular_derivative_ramp"):
if r:
ah = -np.expm1(-poles * h) / poles
ph = np.ones(r) if protocol == "ideal_step" else (
-np.expm1(-poles * duration) / (poles * duration))
f = np.exp(-poles * wait) * ph**2 * ah**2
VtB = eigenvectors.T @ B
D = VtB.T @ (f[:, None] * VtB)
# Independent matrix-exponential factor computation, without the
# eigenvectors used for D. A_h(Q)=Q^-1(I-exp(-Q*h)).
ah_matrix = solve(Q, np.eye(r) - expm(-Q * h), assume_a="pos")
ramp_matrix = (np.eye(r) if protocol == "ideal_step" else
solve(Q, np.eye(r) - expm(-Q * duration),
assume_a="pos") / duration)
F = expm(-Q * wait / 2) @ ramp_matrix @ ah_matrix @ B
factor_error = float(np.max(np.abs(D - F.T @ F)))
factor_min = float(F.min())
assert factor_error <= TOL * max(1., float(np.max(np.abs(D))))
assert factor_min >= -TOL * max(1., float(np.max(np.abs(F))))
else:
D = np.zeros((2 * n, 2 * n))
factor_error, factor_min = 0.0, 0.0
within_u = D[:n, :n] - np.diag(np.diag(D[:n, :n]))
within_v = D[n:, n:] - np.diag(np.diag(D[n:, n:]))
within_max = float(max(np.max(np.abs(within_u)), np.max(np.abs(within_v))))
S = float(D[:n, n:].sum())
d = S / n
b = float(D[:n, n:].max())
cap = h * (kappa + delta)
psd_kernel_min = float(np.linalg.eigvalsh(h * M0 - D).min())
entrywise_kernel_min = float((h * M0 - D).min())
assert within_max <= TOL * max(1., float(np.max(np.abs(D))))
assert entrywise_kernel_min >= -TOL * max(1., float(np.max(np.abs(h * M0))))
assert psd_kernel_min >= -TOL * max(1., float(np.max(np.abs(h * M0))))
assert S <= r * b + TOL * max(1., S)
assert b <= cap + TOL * max(1., cap)
assert d <= r * cap / n + TOL * max(1., d)
# An observation a with known error epsilon can be above the true d;
# the conservative lower endpoint remains d in this constructed case.
epsilon = float(RNG.uniform(0, 0.1) * max(1., d))
a = d + epsilon
inferred_lower = n * max(0., a - epsilon) / cap
assert inferred_lower <= r + TOL * max(1., r)
results.append(dict(
index=index, protocol=protocol, n=n, hidden_states=r,
components=num_components, approximate_K=approximate,
lambda_reference=lam, kappa=kappa, delta=delta, h=h, wait=wait,
ramp_factor_duration=(0.0 if protocol == "ideal_step" else duration),
S=S, d_average_cross_row_sum=d, mean_cross_entry=S/(n*n),
b=b, cross_entry_cap=cap, row_mean_bound=r*cap/n,
inferred_state_lower=inferred_lower,
bound_ratio=(d/(r*cap/n) if r else 0.0),
within_offdiag_max_abs=within_max,
entrywise_hM0_minus_D_min=entrywise_kernel_min,
psd_hM0_minus_D_min=psd_kernel_min,
nonnegative_factor_min=factor_min,
independent_factor_error=factor_error,
min_pole=(float(poles[0]) if r else None),
max_pole=(float(poles[-1]) if r else None)))
return results
def check_root_leak(F, n, label):
D = F.T @ F
r = len(F)
du, dv, cross = D[:n, :n], D[n:, n:], D[:n, n:]
TU, TV = float(np.trace(du)), float(np.trace(dv))
# Explicit off-diagonal extraction avoids cancellation at tiny leakage.
WU = float(du[~np.eye(n, dtype=bool)].sum())
nv = len(dv)
WV = float(dv[~np.eye(nv, dtype=bool)].sum())
S, b = float(cross.sum()), float(cross.max())
penalty = math.sqrt(TU * WV) + math.sqrt(TV * WU) + math.sqrt(WU * WV)
bound = r * b + penalty
assert S <= bound + TOL * max(1., S, bound)
lower = max(0., S - penalty) / b if b else 0.0
assert lower <= r + TOL * max(1., r)
return dict(label=label, rows=r, nU=n, nV=nv, S=S, b=b,
TU=TU, TV=TV, WU=WU, WV=WV, penalty=penalty,
upper_bound=bound, bound_ratio=(S/bound if bound else 0.0),
inferred_factor_rows_lower=lower)
def random_cp_case(index):
n = int(RNG.integers(1, 10))
nv = int(RNG.integers(1, 10))
r = int(RNG.integers(1, 25))
if index % 3 == 0:
F = 10 ** RNG.uniform(-7, -2, (r, n + nv))
for row in F:
row[int(RNG.integers(n))] = 10 ** RNG.uniform(-2, 2)
row[n + int(RNG.integers(nv))] = 10 ** RNG.uniform(-2, 2)
else:
F = 10 ** RNG.uniform(-3, 3, (r, n + nv))
F[RNG.random(F.shape) < RNG.uniform(0, 0.95)] = 0
return check_root_leak(F, n, f"random_{index}")
def main():
physical = []
for i in range(250):
physical.extend(physical_case(i, approximate=(i >= 200)))
cp = [random_cp_case(i) for i in range(750)]
cp.extend([
check_root_leak(np.zeros((3, 4)), 2, "zero"),
check_root_leak(np.array([[1., 0, 0, 0], [0, 2., 0, 0]]), 2, "only_U"),
check_root_leak(np.ones((1, 7)), 3, "rank_one_dense"),
check_root_leak(np.array([[1., 0, 1, 0], [0, 1., 0, 1.]]), 2,
"zero_leak_equality"),
check_root_leak(np.array([[1., 0, 1, 0], [1., 0, 1, 0.]]), 2,
"repeated_pair_strict"),
])
report = dict(
seed=SEED,
status="all_assertions_passed",
caveat="Numerical validation only; not a proof or novelty claim.",
conventions=dict(
n="boundary ports per partition in physical cases",
S="sum over U x V block, each cross entry counted once",
d="S/n, average output on U under equal unit inputs on V",
within_leak="ordered off-diagonal sums, not unordered edge sums",
K_budget="-K_ij <= kappa + delta on cross entries",
exact_bound="d <= r*h*lambda/n^2 when kappa=lambda/n and delta=0",
approximate_bound="r >= n*max(a-epsilon,0)/(h*(kappa+delta))",
ramp="derivative is convolution of two uniform probability densities"),
summary=dict(
physical_networks=250,
physical_protocol_checks=len(physical),
exact_K_networks=200,
approximate_K_networks=50,
random_CP_cases=750,
deterministic_CP_edge_cases=5,
max_physical_bound_ratio=max(x["bound_ratio"] for x in physical),
max_CP_leak_bound_ratio=max(x["bound_ratio"] for x in cp),
max_within_zero_error=max(x["within_offdiag_max_abs"] for x in physical),
max_independent_factor_error=max(x["independent_factor_error"] for x in physical),
min_nonnegative_factor_entry=min(x["nonnegative_factor_min"] for x in physical),
min_entrywise_hM0_minus_D=min(x["entrywise_hM0_minus_D_min"] for x in physical),
min_psd_hM0_minus_D=min(x["psd_hM0_minus_D_min"] for x in physical)),
physical_cases=physical,
CP_leak_cases=cp)
output = Path(__file__).with_suffix(".json")
output.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n")
print(json.dumps(report["summary"], indent=2))
print(f"Saved {output}")
if __name__ == "__main__":
main()
{
"seed": 20260922,
"status": "all_assertions_passed",
"caveat": "Numerical validation only; not a proof or novelty claim.",
"conventions": {
"n": "boundary ports per partition in physical cases",
"S": "sum over U x V block, each cross entry counted once",
"d": "S/n, average output on U under equal unit inputs on V",
"within_leak": "ordered off-diagonal sums, not unordered edge sums",
"K_budget": "-K_ij <= kappa + delta on cross entries",
"exact_bound": "d <= r*h*lambda/n^2 when kappa=lambda/n and delta=0",
"approximate_bound": "r >= n*max(a-epsilon,0)/(h*(kappa+delta))",
"ramp": "derivative is convolution of two uniform probability densities"
},
"summary": {
"physical_networks": 250,
"physical_protocol_checks": 500,
"exact_K_networks": 200,
"approximate_K_networks": 50,
"random_CP_cases": 750,
"deterministic_CP_edge_cases": 5,
"max_physical_bound_ratio": 0.24741946707742124,
"max_CP_leak_bound_ratio": 1.0,
"max_within_zero_error": 0.0,
"max_independent_factor_error": 9.28812582401406e-13,
"min_nonnegative_factor_entry": 0.0,
"min_entrywise_hM0_minus_D": 0.0,
"min_psd_hM0_minus_D": -6.243044435269559e-15
}
}「少なくとも何個」から、
「ちょうど何個あれば足りる」へ。
前節の下限を、実際に作れる模型と突き合わせました。すると、この実験条件では必要な内部容量の最少個数を、式で決められます。個数の下限と、その個数で作る方法が一致しました。
左右10か所ずつ、定常応答を厳密に保存。集団応答の許容誤差を ε/c₀=0.05 とした合成例です。84個以下では不可能で、85個なら条件を満たす模型を構成できます。
ここで合わせるのは、右側をまとめて加熱し、左側の熱流を平均して得る二つの時間窓の差、一つの数値です。全時刻・全境界の応答を合わせる問題とは、区別して読んでください。目標全体を厳密に再現する最少個数100は、そのままです。
1. 一つの容量には、受け持てる信号の上限がある。
定常結合を保つと、各左右ペアに使える伝導率の予算が決まります。さらに、二窓の差が最も大きくなる緩和の速さを選んでも、一つの容量が作れる信号には上限があります。遅すぎると二窓の差が小さく、速すぎると測定前に変化が終わるからです。
⌈ ⌉ は端数の切上げ。αは目標の信号、γは一つの容量を最適化した効率です。
対象は前節の均一な完全二部グラフ。基準緩和率を λ₀、窓幅を h=1/λ₀ とし、温度微分が三角形になる立上りを2T=0.2h、待機をτ=0.1hと固定します。定常応答Kを厳密に保存し、正の内部容量・非負の相反伝導を許します。候補模型の緩和率や内部接続は自由です。
1マス=左右の境界1ペア。緑の各マスに1容量を置き、必要なら最後の1個の容量と伝導率を調整します。
定常応答はすべて同じに保ちます。
表示は式の浮動小数点近似です。整数が切り替わる境界付近の厳密な判定には、係数の区間評価が必要です。緑の到達範囲は、この個数の星型構成で実際に作れる信号です。
2. 複雑な内部構造で、抜け道を作れないのか?
定常応答に三角形がないと、一つにつながった内部部分は、三つ以上の境界にまたがれません。この接続の制約は既知のKron縮約の性質です。[69]
残る核心は、内部に2個、3個……と容量をつなげても、容量1個当たりの信号が上限を超えないこと。2状態は指数分布の和を使って評価し、3状態以上は測定窓の高さだけで一括評価できます。この二つをつなぐことで、任意の内部構造に対する下限になります。
3. 下限と同じ個数で、実際に作る。
選んだ各左右ペアの間に、容量を一つ置き、両側へ同じ伝導率でつなぎます。最適な緩和率は λ*h≈0.9609333。容量のないペアは、伝導だけでつなぎます。最後の1ペアを部分的に使えば、許容範囲の下端へ正確に合わせられます。
現実での使い道は、熱模型の設計仕様を点検することです。「容量数をここまで削る」と「この定常結合と測定値を保つ」が両立するか、模型を最適化する前に判断できます。現物への適用には、定常結合・測定誤差・センサー補正を別に確かめる必要があります。ここで示した数値は合成例です。
この結果の範囲:均一な定常予算、厳密なゼロ結合、指定した立上りと窓、集約された一つの観測値。部品値を任意に小さくできる理想化も含みます。不均一な辺の予算と一般の非負観測窓は、次の一般定理で拡張しました。定常ゼロへの漏れ、全応答の近似は、この最少個数の式の対象外です。
この節の証明のうち、3状態以上の連結成分を抑える部分(下の証明C)は、3q* ≥ w*という不等式に頼っています。立上りTと待機τを変えて 3q*/w* を計算すると(窓幅h=1)、次のようになります。
| T \ τ | 0 | 0.1 | 0.3 | 0.5 |
|---|---|---|---|---|
| 0(理想ステップ) | 1.22 | 1.09 | 0.90 | 0.77 |
| 0.1 | 1.13 | 1.017(本文) | 0.86 | 0.74 |
| 0.3 | 1.00 | 0.92 | 0.80 | 0.70 |
本文の条件はぎりぎり成立する側で、待機を0.2h程度に延ばすと、この節の議論だけでは崩れます。この依存は、次節の一般定理(D ≤ aCkq、Ck ≤ k)で取り除かれました。次節を経由すれば、窓の条件 3q* ≥ w* は不要です。
独立の数値確認:乱数で作った連結RC成分(各4,000個)で D/(a q*) の最大値を測ると、2状態1.34、3状態1.43、4状態1.46、6状態1.33。それぞれ C2≈1.47、C3≈1.83、C4≈2.12、C6≈2.62 を下回り、一般定理と矛盾しません。表の値は数値計算です。
数学的主張と学術的新規性は別です。以下は下限と構成が一致する解析的な命題です。今回の文献照合の範囲と判定は、この節の後半に記録しました。「新理論が確立した」とはまだ扱いません。
最少個数が決まる理由を、式で順に検証する
A. 温度応答を、非負の分布と測定窓に分ける
正の対角容量と非負の相反伝導を持つ、安定で境界から到達できる模型を考える。一つの内部連結成分の状態数をk、容量で正規化した行列をQ、左右への非負結合ベクトルをu,vとする。Qは対称正定値Stieltjes行列。
f(t)=uᵀe−Qtv/a ≥ 0, ∫₀∞f(t)dt=1.
a=0の成分は交差信号に寄与しないので除く。fは確率密度として扱え、M(t)/aはその生存関数になる。U₁,U₂を[0,T]の独立一様分布、V=U₁+U₂と置く。温度微分をVの密度とし、立上り完了2Tからτ待った二つの幅hの窓を使うと、
w(t)=E[ψh(t+V−2T−τ)],
D=a∫₀∞w(t)f(t)dt.
指数密度f(t)=μe−μtに対する信号をq(μ)と置く。
q*=maxμ>0q(μ), w*=supt≥0w(t).
以下の十分条件は3q*≥w*。これが満たされれば、どの状態数kでもD≤kaq*が成り立つ。
B. 2状態だけを、少し丁寧に扱う
k=1なら定義からD≤aq*。k=2で固有値が等しい場合はQがスカラー行列なので同じ評価になる。異なる固有値0<a₁<a₂の場合、生存関数は
長時間の非負性からc₁≥0、t=0での密度の非負性からc₁≤a₂/(a₂−a₁)。従ってこれは、Exp(a₂)と、独立なExp(a₁)+Exp(a₂)の生存関数との凸結合になる。二つ目の指数係数が負でもよく、Mの完全単調性は仮定していない。
0<a≤bとし、二つの指数分布の和の密度をpa,b、率cの指数密度をgcと書く。全t≥0で
a<bではp=2b/a−1>1、z=at/2と置くと、左辺と右辺の比の最大値は
= [(p+1)/p] p−1/(p−1) ≤ 1.
最後は log p≥(p−1)/p≥(p−1)log(1+1/p)による。a=bでは比が2ze−z≤2/e。非負のwを掛けて積分すれば、指数分布の和の信号は2q*以下。凸結合も2q*以下だから、k=2ではD≤2aq*。
C. 3状態以上と、十分条件の厳密な確認
k≥3なら、fが確率密度なのでD/a≤w*≤3q*≤kq*。今回のT=τ=h/10では、wは二つの対称単峰な三角形の畳み込みを平行移動したものなので、中心t=h+T+τで最大になる。T≤hを使うと
一方、μ=1/hを一度代入するだけで、数値最適化に頼らず条件を証明できる。e−0.1>0.9、e−0.1<0.905、e−1<0.37より、
=12895281/40000000,
3q*/h−29/30 > 57529/120000000 > 0.
指数の有理数評価も、e−x>1−x、e0.1>1+0.1+0.1²/2=221/200>200/181、e>1+1+1/2+1/6+1/24=65/24>100/37から従う。
D. 各成分の上限を、模型全体に足す
定常Kのグラフが三角形を持たないとする。内部連結成分の逆Stieltjes行列は成分ごとに正なので、その成分が接続する境界はK上のクリークになる。従って各成分の接続先は高々2境界である。[69]
各辺の定常伝導率が共通のκで、辺eに接続する成分の予算をacとするとΣc→eac≤κ。特にac≤κなので、全辺の二窓差の総和Sについて
内部成分の極は共通でなくてよい。この証明は、指定した自己畳み込み立上りのCP分解に依存せず、定常Kのゼロと応答の非負性から進んでいる。
E. 同じ値を達成する構成
定常伝導率σ∈(0,κ]を担当する1状態の星を作る。両側の伝導率を2σ、内部容量を4σ/μ*に取れば、定常伝導率はσ、緩和率はqの最大化点μ*、二窓差はσq*。その辺に直結伝導κ−σを加えてKを保つ。
m辺のうちr≤m辺でσ=κを使うとS=rκq*。最後の辺だけσを調整すれば、0≤S≤mκq*の任意の目標に対し、必要最少数は⌈S/(κq*)⌉。0を作る場合は容量を置かない。
前節の族ではm=n²、κ=λ₀c₀/n、h=1/λ₀、d=S/n。dの許容誤差をεとすると、許される下端S=n(c₀α−ε)₊に合わせられる。よって
α<γなので常にrmin≤n²。非均一な予算では、強い辺へ複数状態を使う選択が弱い辺の1状態に勝つ可能性があり、この単純な最少個数の式は主張しない。
F. 最適な緩和率の求め方
x=μh、A=T/h、B=τ/h、F(x)=x/(eˣ−1)と置くと、
Fはx>0で厳密に減少する。右辺は1から負の値へ厳密に減少するため零点は一つで、qの最大点も一つ。二分法でμ*h≈0.9609333068、γ≈0.32764158599を得る。係数の小数表示と、Cで示した十分条件の証明は分けて扱う。
現実の測定へ近づける:小さな漏れを、まとめて評価する。
85という最小数は、定常結合を厳密に保存する条件で得られました。実機では「結合が完全にゼロ」を測定だけで保証するのは難しいため、漏れを許したまま使える、別の下限も導きました。こちらは必要数の認証で、最適模型との一致までは主張しません。
すべて同じ二窓測定を使います。交差成分それぞれの上限が b と分かっているとき、r状態の模型には次が必要です。
目標のように左右が釣り合っていれば I=0で、漏れの補正はWそのものになります。従来の補正は小さな漏れの平方根を含んでいました。新しい式は釣り合いのよい領域で有利ですが、すべてのデータで旧式より強いわけではありません。
信号の下限 Slo、漏れ・不均衡の上限 Wup, Iup、各交差成分の共通上限 bup>0 があれば、
r ≥ ⌈[Slo−Wup−√(IupWup)]₊ / bup⌉。
交差上限は独立の校正や設計情報から与えます。一度の実験で全ての結合が判明するという意味ではありません。整数境界では区間演算が必要です。
漏れの命題、その証明と反例を確認する
D=FᵀF、F≥0、Fの行数r。群をU,Vとし、S=Σi∈U,j∈VDᵢⱼ、W=WU+WV、WU=Σi≠j∈UDᵢⱼ(順序付きの和)、I=(1U−1V)ᵀD(1U−1V)≥0と定める。非一様な上限Dᵢⱼ≤bᵢⱼがあれば、rbを、交差上限の大きい順min(r,|U||V|)個の和Brへ置き換えられる。
Fの一行をu,vに分け、成分和をa,b、最大成分をm,ℓ、wu=a²−‖u‖²、wv=b²−‖v‖²とする。ab=0は自明。ab>0ならm≥a−wu/a、ℓ≥b−wv/bなので、
≤ wu+wv+(a−b)₊√wv+(b−a)₊√wu.
最後の不等式はa≥bとa<bを分け、wv≤b²などを使う。各行の最大成分対を一つ選ぶと、選ばれた異なる対は高々r個。同じ対へ割り当てたmℓの合計は、そのD成分以下なので、全行の合計はBr以下。残りをCauchy–Schwarzで足せば√(IW)が得られる。□
u=(1,0,…), v=(1/k,…,1/k)の一行ではI=0、S=1、B₁=1/k、W=1−1/kとなり等号。Wの係数1は一律に小さくできない。正の群倍率θを使えば、WをθWU+θ⁻¹WVへ、Iを(√θ1U−θ⁻¹ᐟ²1V)ᵀD(√θ1U−θ⁻¹ᐟ²1V)へ変えても成立する。
「一対では小さい漏れ」に注意する理由
n個の内部節点を置き、節点iを左iへ伝導率2λc₀で、全ての右境界へ各2λc₀/nで接続し、容量を各4c₀とする。この模型は、元のn²状態の例と交差ブロックの全周波数応答が一致する。一方、右同士には各λc₀/nの定常結合が生まれる。
K=λc₀[ I −J/n ; −J/n 2I−J/n ].
D=αHではS=nc₀α、W=(n−1)c₀α、I=0、Bn=c₀αとなり、新不等式は等号になる。一対の漏れは1/nでも、合計はnに比例して増える。この模型は定常Kを厳密保存せず、右側の対角応答も変わるため、85の定理への反例ではない。対角定常誤差λc₀(1−1/n)は小さくならず、全体の作用素誤差が消えるという主張でもない。
正負の入力は動作温度のまわりの微小な上下変化を意味する。対象の初期化・センサー補正・誤差上限の妥当性は従来と同じく必要。今回の確認は証明と合成データに限り、実機実験は未実施。
先行研究と比べて、何が成果として残るか。
新規性の中心候補を、「指定した有限時間の測定値と、厳密な定常応答を両立させる最少状態数を、物理的な構成と一致させたこと」へ絞りました。正値性による次数増大や、定常応答を保つ削減法そのものは以前からあります。
| 照合した分野・資料 | 既知として扱う部分 | 今回の命題との差 |
|---|---|---|
| Kron縮約・CPランク [69] [70] | 内部成分が境界にクリークを作る性質。完全二部支持のCPランクn²。 | 有限時間の信号上限q*と達成構成を合わせ、近似する単一観測値の最小数を決める。 |
| 正値実現 [35] [36] | 正値制約による次数増大。正値構造を保つ低次元化。 | 相反伝導・正の対角容量・厳密K・二窓の集団観測という組合せを固定する。 |
| SparseRC [71] | DCの最初の二モーメントを保つ削減と受動性。 | 本文§III-C2では合成後の負容量を許す。今回の正素子だけの模型とは許容クラスが異なる。 |
| 有限時間balanced truncation [29] | 指定した方法による有限時間L²誤差の上界。 | 今回の指標は一つの集団観測。全許容模型の必要数と達成数を一致させる問題であり、誤差指標も異なる。 |
| Phase-type分布 [72] [73] | 固定相数でのErlangの最小変動性。三モーメントからの必要相数・近最小構成。 | 今回の三角形状の測定核は全域凸でも単調でもない。その既知の極値原理をそのまま使わず、二状態の密度と核の高さを評価する。 |
| 近似非負ランク下界 [41] [44] | 誤差があっても因子の必要数を下から評価する一般的手法。 | 漏れW・不均衡I・交差上限Brだけの明示式と、平衡時の一次補正を今回の差分候補とする。 |
文献の取得範囲と、残っている照合を読む
2026 09 29時点で、RC/熱回路の最少実現、DC保存、有限時間削減、正値実現、phase-typeの相数、CP/近似非負ランクを検索し、該当する一次資料の設定・定理を照合した。検索結果の不在だけでは新規性を結論しない。
今回追加した公開資料は、SparseRCの本文(DCモーメント・受動性・素子の符号)、Aldous–Sheppの公開スキャン冒頭p.467(主張を画像で確認、証明全体は未精読)、Osogami–Harchol-Balterの著者稿§§1–3(三モーメント一致の定義と必要相数)。関連する公開資料は引き続き文献表で確認できる。
未取得の本文として、SheehanのRealizable Reduction of RC Networks(2007)、O’CinneideのPhase-Type Distributions and Majorization(1991)、Duffin–KnowlesのOptimal thermal phase shift filters(1983)が残る。Heらの2019年論文は、その後の一般化で本文を取得し、密度の増加率・モーメント境界を確認した。[78] 他の未取得資料は要旨から同じ定理の有無を断定していない。古い多端子RC合成論も含め、引用をたどる照合が必要。
数学的確認:解析的証明・独立監査・有理数での整数閾値確認まで実施。形式証明・人間の専門家による査読・実機検証は未実施。「独立監査」は別のAIによる確認を指す。
全応答の誤差を保証する、別の構成もある
元のn²辺からk個の完全マッチングを残し、そのnk辺に元の容量と緩和率λ₀を保つ。残りは同じ定常伝導率の直結伝導へ置き換える。Kを厳密保存し、内部状態数r=nkで、
消した辺は(n−k)正則な二部グラフ。その符号なしLaplacianの最大固有値が2(n−k)であることから従う。これは全伝達関数について使える構成上界で、全模型の最小数と一致するという定理ではない。初等的な既知の道具による構成として扱う。
有理数での85の確認・数値検査・再現資料を開く
独立の有理数演算で最大点を区間に挟み、「84状態では不足、85状態で足りる」を小数丸めに依存せず確認した。3,200個の物理的な連結RC成分、63個の全応答構成、最適85状態の構成、5,000個の非負因子を検査。全て通過した。有限の検査は解析的証明や新規性の証明の代わりにはしない。
必要な信号/c₀ > 0.277418
85状態で作れる最大信号/c₀ > 0.278495
Python 3、NumPy、SciPyを使用。各スクリプトを実行すると、同じ場所へJSONの検証結果を書き出す。上の数値は表示用に外向きに丸め、判定自体は整数比で計算している。
有理数による閾値の証明と、連結RC成分の独立検査
"""Independent exact-rational scalar threshold and randomized RC-component checks.
Requires Python 3, numpy, scipy. Example: python -m pip install numpy scipy
Writes a JSON result beside this script; no project-directory layout is needed.
"""
from fractions import Fraction as F
from pathlib import Path
import json
import numpy as np
from scipy.optimize import brentq
# Alternating series, exact rationals, 0 <= x <= 1.
def expneg(x, n=32):
term=F(1); even=term
for k in range(1,n+1):
term *= -x/k
even += term
odd=even + term*(-x)/(n+1)
return odd, even
def G_bounds(x):
xl,xh=expneg(x)
yl,yh=expneg(x/10)
return (2*x*xl/(1-xl)+2*(x/10)*yl/(1-yl)-3-x/10,
2*x*xh/(1-xh)+2*(x/10)*yh/(1-yh)-3-x/10)
lo=F('0.96093330677944'); hi=F('0.96093330677945')
assert G_bounds(lo)[0]>0 and G_bounds(hi)[1]<0
el,eh=expneg(lo/10); fl,fh=expneg(hi/10)
gl,gh=expneg(lo); hl,hh=expneg(hi)
qlo=fl*(1-eh)**2*(1-gh)**2*100/hi**3
qhi=eh*(1-fl)**2*(1-hl)**2*100/lo**3
al,ah=expneg(F(1,10)); bl,bh=expneg(F(1))
alpha_lo=al*(1-ah)**2*100*(1-bh)**2
alpha_hi=ah*(1-al)**2*100*(1-bl)**2
assert F(84,100)*qhi < alpha_lo-F(1,20)
assert F(85,100)*qlo > alpha_hi-F(1,20)
# The finite-ramp k>=3 certificate also verified by exact rational arithmetic.
assert 3*alpha_lo>F(29,30)
def q(x):
return np.exp(-x*.1)*(-np.expm1(-x*.1)/(x*.1))**2*(-np.expm1(-x))**2/x
xstar=brentq(lambda x:2*x/np.expm1(x)+.2*x/np.expm1(.1*x)-3-.1*x,.8,1.1)
qstar=q(xstar)
rng=np.random.default_rng(902913)
rows=[]
for k in range(1,9):
maximum=0.; max_budget_ratio=0.; negative_residue=0
for trial in range(400):
edges=rng.uniform(.02,1.,(k,k)); edges=np.triu(edges,1); edges=edges+edges.T
# Include sparse port attachment to give negative spectral residues.
left=rng.uniform(.02,1.,k); right=rng.uniform(.02,1.,k)
if k>1 and trial%2==0:
left[1:]=0.; right[:-1]=0.
cap=10**rng.uniform(-.6,.6,k)
lap=np.diag(edges.sum(axis=1)+left+right)-edges
inv=np.diag(cap**-.5); Q=inv@lap@inv
u=inv@left; v=inv@right
rates,V=np.linalg.eigh(Q)
residues=(V.T@u)*(V.T@v)
negative_residue += int(np.any(residues< -1e-12))
budget=u@np.linalg.solve(Q,v)
response=np.sum(residues*np.exp(-rates*.1)*(-np.expm1(-rates*.1)/(rates*.1))**2*(-np.expm1(-rates))**2/rates**2)
assert response >= -1e-11 and response <= k*budget*qstar+1e-10
maximum=max(maximum,response/(k*budget*qstar))
max_budget_ratio=max(max_budget_ratio,response/(budget*qstar))
rows.append({'states':k,'trials':400,'max_D_over_k_a_qstar':maximum,'max_D_over_a_qstar':max_budget_ratio,'negative_spectral_residue_cases':negative_residue})
result={'root_bracket':[float(lo),float(hi)],'qstar_bounds':[float(qlo),float(qhi)],'alpha_bounds':[float(alpha_lo),float(alpha_hi)],'84_upper':float(F(84,100)*qhi),'required_lower':float(alpha_lo-F(1,20)),'85_lower':float(F(85,100)*qlo),'required_upper':float(alpha_hi-F(1,20)),'threshold_85_certified_by_rational_arithmetic':True,'kernel_height_condition_certified_by_rational_arithmetic':True,'random_checks':rows}
Path(__file__).with_suffix('.json').write_text(json.dumps(result,indent=2), encoding='utf-8')
print(json.dumps(result,indent=2))
物理部品から組み立てる、85状態と全応答の構成
#!/usr/bin/env python3
"""Finite checks of the edge-star construction; not a proof of optimality."""
import json, math
from pathlib import Path
import numpy as np
def stable_r(x):
return x/math.expm1(x) if x < 700 else 0.0
def kernel(mu,t,h,T):
return math.exp(-mu*t)*(-math.expm1(-mu*h))**2/mu*((-math.expm1(-mu*T)/(mu*T))**2 if T else 1.0)
def optimum(t,h,T):
a,b=t/h,T/h
def g(x):return 2*stable_r(x)+(2*stable_r(b*x) if b else 2)-3-a*x
lo,hi=0.0,1.0
while g(hi)>0:hi*=2
for _ in range(100):
mid=(lo+hi)/2
if g(mid)>0:lo=mid
else:hi=mid
mu=(lo+hi)/(2*h)
return mu,kernel(mu,t,h,T)
def build(n,lam,c0,budgets,rates):
ports=2*n; kappa=lam*c0/n
active=[(i,j,float(budgets[i,j]),float(rates[i,j])) for i in range(n) for j in range(n) if budgets[i,j]>0]
r=len(active);spokes=np.zeros((r,ports));diag=np.zeros(r);caps=np.zeros(r)
for z,(i,j,a,mu) in enumerate(active):
spokes[z,i]=spokes[z,n+j]=2*a;diag[z]=4*a;caps[z]=4*a/mu
direct=np.zeros((ports,ports))
for i in range(n):
for j in range(n):
v=np.zeros(ports);v[i]=1;v[n+j]=-1
direct+=(kappa-budgets[i,j])*np.outer(v,v)
Lbb=direct+np.diag(spokes.sum(axis=0))
K=Lbb-(spokes.T/diag)@spokes if r else Lbb.copy()
B=spokes/np.sqrt(caps)[:,None] if r else spokes
return K,Lbb,B,np.array([mu for _,_,_,mu in active])
def target(n,lam,c0):
I=np.eye(n);J=np.ones((n,n))/n
H=c0*np.block([[I,J],[J,I]])
K=lam*c0*np.block([[I,-J],[-J,I]])
return K,H
out={'checks':[]}
for n in range(2,11):
for k in range(n+1):
lam,c0=1.7,.8;kappa=lam*c0/n
budgets=np.zeros((n,n));rates=np.full((n,n),lam)
for i in range(n):
for shift in range(k):budgets[i,(i+shift)%n]=kappa
K,Lbb,B,poles=build(n,lam,c0,budgets,rates)
Kstar,H=target(n,lam,c0)
static=float(np.max(np.abs(K-Kstar)))
HF=Kstar+lam*H
actual=float(np.linalg.norm(HF-Lbb,2));expected=2*lam*c0*(1-k/n)
assert static<1e-12 and abs(actual-expected)<1e-12
for omega in [.2,1,20]:
if len(poles):Y=Lbb-B.T@((1/(poles+1j*omega))[:,None]*B)
else:Y=Lbb.astype(complex)
Ys=Kstar+(1j*omega*lam/(1j*omega+lam))*H
got=float(np.linalg.norm(Ys-Y,2))
want=expected*abs(1j*omega/(1j*omega+lam))
assert abs(got-want)<1e-12
out['checks'].append({'n':n,'k':k,'states':n*k,'static_error':static,'high_frequency_norm':actual,'exact_formula':expected})
n=10;lam=c0=h=1.;t=T=.1;eps=.05
mu,qmax=optimum(t,h,T);alpha=lam*kernel(lam,t,h,T)
quotient=n*n*(alpha-eps)/(lam*qmax);r=math.ceil(quotient);kappa=lam*c0/n
budgets=np.zeros((n,n));budgets.flat[:r-1]=kappa;budgets.flat[r-1]=(quotient-r+1)*kappa
rates=np.full((n,n),mu)
K,Lbb,B,poles=build(n,lam,c0,budgets,rates)
Kstar,H=target(n,lam,c0)
# D=B.T f(Q) B, with f(mu)=q(mu)/mu because B.T B coefficients are a*mu.
D=B.T@((np.array([kernel(p,t,h,T)/p for p in poles]))[:,None]*B)
d=float(D[:n,n:].sum()/n)
assert np.max(np.abs(K-Kstar))<1e-12
assert abs(d-(alpha-eps))<1e-12
assert abs(r-85)==0
out['scalar_case']={'states':r,'real_quotient':quotient,'mu':mu,'qmax':qmax,'alpha':alpha,'actual_d':d,'target_lower_endpoint':alpha-eps,'partial_budget_fraction':quotient-r+1,'static_error':float(np.max(np.abs(K-Kstar)))}
path=Path(__file__).with_suffix('.json');path.write_text(json.dumps(out,indent=2))
print(json.dumps({'cases':len(out['checks']),'scalar':out['scalar_case'],'all_passed':True},indent=2))
漏れの不等式と、その等号・物理例
import json
from pathlib import Path
import numpy as np
rng=np.random.default_rng(829)
def check(F,n,theta=1.0):
D=F.T@F; m=F.shape[1]-n; r=F.shape[0]
S=D[:n,n:].sum(); AU=D[:n,:n].sum(); AV=D[n:,n:].sum()
WU=D[:n,:n].sum()-np.trace(D[:n,:n]); WV=D[n:,n:].sum()-np.trace(D[n:,n:])
# Explicit nonnegative sums avoid cancellation for sparse limiting tests.
WU=sum(D[i,j] for i in range(n) for j in range(n) if i!=j)
WV=sum(D[i,j] for i in range(n,n+m) for j in range(n,n+m) if i!=j)
W=theta*WU+WV/theta
a=np.sqrt(theta)*F[:,:n].sum(axis=1); b=F[:,n:].sum(axis=1)/np.sqrt(theta)
I=np.square(a-b).sum()
B=np.sort(D[:n,n:].ravel())[::-1][:r].sum()
rhs=B+W+np.sqrt(I*W)
error=(S-rhs)/max(1,S)
assert error<2e-12,(F,n,theta,error)
old=np.sqrt(np.trace(D[:n,:n])*WV)+np.sqrt(np.trace(D[n:,n:])*WU)+np.sqrt(WU*WV)
return {'S':float(S),'B_r':float(B),'W':float(W),'I':float(I),'new_penalty':float(W+np.sqrt(I*W)),'old_penalty':float(old),'relative_violation':float(error)}
maxviol=-1.;count=0
for trial in range(5000):
n=int(rng.integers(1,10));m=int(rng.integers(1,10));r=int(rng.integers(1,15))
F=np.exp(rng.uniform(-7,7,(r,n+m)))*(rng.random((r,n+m))<rng.uniform(.05,1))
theta=float(np.exp(rng.uniform(-7,7)))
x=check(F,n,theta);maxviol=max(maxviol,x['relative_violation']);count+=1
sharp=[]
for n in [2,3,5,10,20]:
# n factors; U is coordinate-aligned, V is uniform. Every row is balanced.
F=np.column_stack((np.eye(n),np.ones((n,n))/n))
x=check(F,n);x['n']=n;assert abs(x['S']-x['B_r']-x['W'])<1e-10
sharp.append(x)
physical=[]
for n in [2,3,5,10]:
lam=.7;c0=1.3;h=.9;t=.2
F=np.column_stack((np.sqrt(c0)*np.eye(n),np.sqrt(c0)*np.ones((n,n))/n))
v=F.sum(axis=1);C=np.diag(v*v);g=lam*v[:,None]*F
LII=np.diag(g.sum(axis=1));LBB=np.diag(g.sum(axis=0));LIB=-g
K=LBB-LIB.T@np.linalg.solve(LII,LIB)
H=F.T@F
Htarget=c0*np.block([[np.eye(n),np.ones((n,n))/n],[np.ones((n,n))/n,np.eye(n)]])
Ktarget=lam*c0*np.block([[np.eye(n),-np.ones((n,n))/n],[-np.ones((n,n))/n,np.eye(n)]])
max_cross=0.
for omega in [0,.1,.7,2,100]:
s=1j*omega
Y=LBB-LIB.T@np.linalg.solve(s*C+LII,LIB)
Ytar=Ktarget+s*lam/(s+lam)*Htarget
max_cross=max(max_cross,float(np.max(np.abs(Y[:n,n:]-Ytar[:n,n:]))))
assert max_cross<1e-12
kV=-K[n:,n:]+np.diag(np.diag(K[n:,n:]))
assert np.max(np.abs(kV-(np.ones((n,n))-np.eye(n))*lam*c0/n))<1e-12
physical.append({'n':n,'r':n,'cross_transfer_max_error':max_cross,'within_V_steady_leak':float(lam*c0/n),'total_capacity':float(np.trace(C))})
out={'cases':count,'max_relative_violation':maxviol,'sharp_family':sharp,'physical_family':physical,'interpretation':'Finite checks support implementation; analytic proof is primary. Not a novelty certificate.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2))
print(json.dumps(out,indent=2))
ZIPのSHA-256:2eb5071d3ae3068fc22583f5d7049da1bd7b45210d2b6a583bb3faa6a4a39cee。資料はこのHTMLに埋め込まれており、ダウンロードに外部通信は不要です。
測り方を変えても残る、
時間への集中の限界。
前節では、決まった二つの時間窓から最少85状態を求めました。さらに抽象化すると、時間ごとの重みが非負である、任意の測り方に共通する上限が得られます。内部を複雑にして、熱の伝わる時刻をどこまで狙い撃ちできるか。その限界です。
同じ定常結合を持つ「最適な1状態」を基準にすると、k状態で得られる観測値は最大でもCk倍。この係数は、あらゆる非負の測定窓をまとめて扱う上限として、これ以上小さくできません。
一つの容量による応答は、指数関数的に広がります。容量をいくつも経由させれば、特定の時刻付近へ応答を集められます。しかし、状態数を増やしたときの集中の上限は、約√kの速さでしか増えません。この制限は、窓幅や待ち時間を先に固定せずに証明できます。
Ck = kk e1−k / (k−1)!a:定常結合 / Dw:重みwで測った過渡応答
qw:同じ測り方に対して、1状態の速さを最適化した値
対象は、正の内部容量・非負の相反伝導を持つ、安定な有限熱回路/接地容量RC回路です。一対の境界間の過渡応答を調べます。w≥0が必要で、符号が混じる任意の測定処理まで主張を広げていません。全伝達関数を1状態で置き換えられる、という意味でもありません。
窓を狭くすると、応答の比が鋭い上限に近づきます。
緑はErlang(k, rate k)の密度、灰色はe−t、破線はCke−tです。比の分母には、窓に合わせて速さを改めて最適化した1状態を使います。色の付いた帯が測定窓です。
緑はRC回路で近づける「極限」の曲線です。k>1では、この図を有限の部品値での厳密な実現例とは扱いません。上限の鋭さには、窓を狭めることと、部品値の制約を設けないことを使っています。
大きい集中が見えれば、内部の個数を逆算できる。
測定からR=Dw/(a qw)が分かれば、Ck≥Rを満たす個数が必要です。大きなRに対して必要個数は概ねRの二乗で増えます。有限の値の判定では近似式ではなく、上のCkを使います。
また、Ck≤kなので、前節の「各状態が使える信号予算」を足す議論も、任意の非負測定窓へ拡張できます。定常結合が均一で三角形を含まない境界グラフでは、条件が整えば測定窓を固定した最少個数の式も、そのまま一般化できます。
さらに、内部構造の最適化を、k本の「速さ探し」へ落とせる。
測定核wを一つ決めた場合には、√k型の共通上限よりも強く言えます。複雑な内部接続や多数の部品値を全て探索して得る観測値の上限は、Erlang分布の段数j=1,…,kを比べ、各々の速さρだけを最適化した値と厳密に一致します。
Ek(w) = max1≤j≤k supρ>0 ∫0∞w(t)pj,ρ(t)dtpj,ρ:j段・率ρのErlang密度
接続構造も自由な回路の最適化 → k個の、1変数の最適化
分解定理から上限が従い、それぞれのErlang密度へ近づく物理回路が逆向きの一致を与えます。等しいのはsup、つまり到達可能な値の上限です。有限の部品値でその端点そのものを作れるとは限りません。
定常応答の支持グラフが三角形を含まなければ、辺ごとの予算が不均一でも、さらに全回路の上限を各辺へ何状態を割り当てるかという整数最適化へ変換できます。これは最適な1状態へ限定した配分ではなく、各辺のEkまで含む主張です。端点での等号と、上限を厳密に下回る目標の実現は区別します。
既知の分解定理を適用
ガンマ・Dirichlet分解
鋭い係数Ck
証明できたことと、新規性は分けます。可逆な吸収時間の分解はMicloの既知定理です。ガンマ分布と指数分布の比較も既知の道具として扱います。ここでの成果候補は、それらから導いた任意の非負測定核に対する鋭い上限と、物理的な状態数への帰結です。同一の主張が既に公表されていないかは、引き続き照合が必要です。[74][75][76]
一般定理の仮定、証明、鋭さを検証する
定式化:非負の測定核を、後から自由に選ぶ
Qをk×kの対称正定値Stieltjes行列(非対角成分は非正)、u,v≥0とし、a=uᵀQ−1v>0とする。正規化された密度fと、1状態の最適観測値qwを
Dw=a∫0∞w(t)f(t)dt,
qw=supμ>0∫0∞w(t)μe−μtdt
と定義する。任意の非負可測wについて、次が成り立つ。qw=∞なら不等式自体は自明なので、実際に下界として使うのはqw<∞の場合である。
ゆえに Dw ≤ a Ck qw.
同じνが全てのtを同時に支配する。その後で、どの非負測定核wを選んでもよい。元の二窓の差も、過渡応答の減衰率に対する非負核へ変換して扱う。
1. 可逆な吸収時間への変換
まずQが既約とする。h=Q−1v>0、H=diag(h)と置き、
と定める。Tの非対角成分は非負で、T1=−β≤0。αは確率ベクトルで、足りない行和を吸収先への遷移率とすると、吸収時間密度はαᵀeTtβ=f(t)となる。πi∝hi²に関してπiTij=πjTjiなので、過渡部分は可逆である。
Miclo「On absorption times and Dirichlet eigenvalues」Theorem 1.2(仮定B1・B2)を適用すると、fは最大k個の独立指数変数の和の密度の凸混合になる。ここが既知の非初等的な入力である。Qが可約なら対角ブロックごとに適用し、正のaを持つブロックを、そのaの比で混ぜる。[74]
2. 指数変数の和を、Erlangの混合に変える
独立なEi∼Exp(1)からX=Σi=1jEi/λiを作る。R=ΣEiとPi=Ei/Rに変数変換すると、
X=R A(P), A(P)=ΣPi/λi.
実際、変換後の密度はe−RRj−1で、Rと単体上の一様分布に分離する。Pを固定すれば、Xは形状j・率ρ=1/A(P)のErlang分布である。同じ率が重なっていても、この議論はそのまま成り立つ。
3. 密度を点ごとに抑えると、全ての非負窓に効く
指数密度gμ(t)=μe−μtとErlang密度pj,ρ(t)=ρjtj−1e−ρt/(j−1)!の比は
=j(ρt)j−1e−(1−1/j)ρt/(j−1)! ≤ Cj.
j>1ではρt=jで最大になり、その値がCj。j=1では恒等的に等号になる。さらに
[Cj+1/(j+1)]/[Cj/j]=(1+1/j)j/e <1
だから、j≤kならCj≤Ck、かつCk≤k。前の二段階の混合に沿って指数包絡線を混ぜれば、総質量がCk以下の包絡線を得る。不足分を任意の正の率へ加えてCkで割ると、上の確率測度νとなる。w≥0を掛け、Tonelliの定理で積分順を交換すれば主張を得る。
Ck ∼ e√(k/(2π)) ≈ 1.08444√k.
最後の近似はStirlingの公式による漸近式であり、全ての有限kでの等式や厳密な下界としては使わない。
4. 係数Ckは、物理回路の範囲でも小さくできない
Aをk頂点の道グラフの隣接行列とする。0<ε<1/2に対してQε=I−εA、u=e1、v=ekと取る。Qεは対称正定値Stieltjes行列。両端の最短歩道がただ一つであることから、級数展開で
ε−(k−1)(Qε−1)1k → 1.
したがって、正規化した密度はErlang(k,1)へ、各コンパクト時間区間で一様に近づく。時刻kの周りの幅2δの矩形窓wδを取り、まずε→0、次にδ→0とすると、
∫wδ(t)fε(t)dt / qwδ → Ck.
よって全ての回路と非負核に共通する定数は、Ck未満にできない。図では時間を拡大縮小し、平均時刻を1に揃えている。滑らかで非負の、幅が縮む窓でも同じ極限が得られる。
5. 対称行列から、正の部品だけを持つ熱回路へ戻す
既約なQに対しz=Q−1(u+v)>0と置き、内部容量Ciと伝導率を
giL=ziui, giR=zivi
と選ぶ。Qz=u+vなので、内部Laplacianはdiag(z)Qdiag(z)となる。容量は正、伝導率は非負で、二境界以外の熱の逃げ先は要らない。定常伝導率はa=uᵀQ−1v。容量と伝導率を全てκ/a倍すれば、fとQを変えずに、定常伝導率を任意のκ>0へ揃えられる。
この鋭さは上限値への接近を意味する。有限幅の窓と、非退化な一つの有限回路で等号が達成されるという主張ではない。ε→0で部品値が発散したりゼロへ近づいたりし得る。最小部品値、容量の総予算、時定数の範囲などを制限すれば、より小さい上限を得られる可能性が残る。
前節の「最少個数」が、任意の非負測定窓へ拡張される条件
厳密に保存する定常応答Kの支持グラフが三角形を含まず、m本の辺の伝導率が全てκ>0であるとする。全ての辺に同じ非負核wを使い、観測値をS=ΣeDeとする。さらに0<qw<∞で、1状態の最適率を有限の正のμで達成できると仮定する。
内部の連結成分は、定常応答のゼロを保つ限り、各々ただ一つの境界辺にしか寄与できない。k状態の成分の寄与はaCkqw≤akqw。a≤κなので、全体でS≤rκqwとなる。
逆にr≤mなら、r本の異なる辺へ最適率の1状態を一つずつ置ける。最後の辺は必要に応じて動的な伝導率を減らし、残る定常伝導は直接の伝導素子で補う。従って、目標0≤Starget≤mκqwと許容誤差η≥0に対して
前節の「3qw≥sup w」という窓の条件が不要になった。上限がsupとして存在するだけで達成されない場合には、ちょうど端点へ合わせる主張は別途調べる必要がある。上限未満への近似構成と個数の下界は引き続き有効である。不均一な定常予算については、単純な切上げ式をそのまま使わない。
設計で使う形:限られた状態数を、どの辺へ割り当てるか。
定常応答を変えずに、狙った時間帯の応答を大きくしたい。この設計問題では、強い辺に内部状態を追加する方が、弱い辺に新しい状態を置くより有利な場合があります。三角形を含まない定常グラフなら、あらゆる内部回路を含めた性能の上限を次の式で表せます。
ce = 観測の重みηe × 定常伝導率κe / E0=0
例えば時間0.9〜1.1だけを測り、3本の辺の予算を1、0.5、0.1とします。全辺の観測の重みは1です。2状態では上限約0.11055、3状態では約0.14512。したがって目標0.14には3状態が必要十分です。3個目は最も弱い辺ではなく、最も強い辺へ追加します。
| 状態数r | 上限を与える配分 強・中・弱 | 全回路の上限Vr |
|---|---|---|
| 2 | 1・1・0 | 0.11054848 |
| 3 | 2・1・0 | 0.14511748 |
| 8 | 6・2・0 | 0.24559936 |
表の値は解析式の浮動小数点評価です。各辺を1状態だけで作る方式は合計約0.11792で頭打ちです。上限の端点の達成とは区別し、0.14のように上限を厳密に下回る値は有限回路で実現できます。一般の観測核で最少個数を数値的に保証するには、1変数の最大化にも誤差保証が要ります。
目標0.14を、極限を使わない有限の3状態回路で実現する
境界をb0〜b3とし、定常グラフは伝導率1、1/2、1/10の3辺の道とする。強い辺には、b0—x1—x2—b1の順に伝導率11、11/9、11を置き、内部容量を両方55/9とする。中間の辺はb1—x3—b2に伝導率1、1、内部容量2。弱い辺は伝導率1/10の直接辺だけにする。
強い辺のQは対角2、非対角−1/5で、緩和率は9/5と11/5。中間の辺の率は1。q(ρ)=e−0.9ρ−e−1.1ρと置くと、信号は厳密に
= 0.1447470384… > 0.14.
この大小関係は有理数のTaylor上下界でも保証した。θ=0.14/Sとし、内部状態に関わる容量と伝導率を全てθ倍する。強い辺と中間の辺にそれぞれ1−θ、(1−θ)/2の直接伝導を追加すれば、定常応答は変わらず、信号は厳密に0.14になる。有限の正の部品で完成する。
2状態の不可能性は丸め誤差に依存せず示せる。μe−μt≤1/(et)だからqw≤2/(9e)。2状態の配分の上界はmax(3/2,4/e)qw=(3/2)qwであり、
ここでe>8/3を用いた。従って「最少3状態」は、数値表だけによる推測ではなく、下界と有限構成が一致した結果である。
厳密な変分縮約・状態配分・端点の扱いの証明
固定した観測核に対するEkの厳密性
w≥0を可測、qw<∞とする。先の分解により、任意のk状態の正規化応答は、j≤kのErlang密度の混合である。各混合成分の観測値はEk以下だから、全体も以下になる。逆に任意のj≤k、ρ>0について、率ρへ拡大縮小した対称道グラフの密度fεはpj,ρへ点ごとに収束する。Fatouの補題から
≤ sup物理回路、状態数≤k ∫w f.
ρとjについて上限を取ると逆向きの不等式を得る。wの連続性や有界性は不要である。各道グラフは先の正の部品による構成で実現でき、定常結合も固定できる。従って、一変数最適化への縮約は単なる緩和ではなく、上限値の一致である。
固定する静的行列Kの条件
Kは三角形を含まないグラフのLaplacianで、辺eの伝導率κe>0を厳密に保存する。内部容量は正の対角行列、伝導は相反・非負、内部成分は境界へ接続され安定とする。境界温度は入力なので内部状態に数えない。全辺で共通の非負核wを使い、観測の重みηeも非負とする。
非負回路では、内部連結成分が触れる境界集合はK上のクリークになる。これは既知のKron縮約の性質である。[69] 三角形がないため一つの成分が寄与する境界辺は高々一つ。辺e上の各成分の定常寄与ae,jは、Σjae,j≤κeを満たす。残りは直接伝導である。
辺eに合計ke状態を使うと、Ekの単調性から、その辺の信号はκeEke以下。全辺で足すとVrが上界になる。逆に有限個の整数配分から最良を選び、それぞれの辺にEkeへ近づく道回路を独立に置き、定常伝導率をκeへ揃えると、Vrへ任意に近づける。
計算法と必要十分の意味
Vℓ,s=max0≤k≤s{Vℓ−1,s−k+cℓEk},
Vr=Vm,r.
Ekが与えられた後の演算量はO(mr²)。任意のwでEkの離散凹性を証明したわけではないので、限界利得の並べ替えだけで解けるとは主張しない。動的計画法そのものは標準的な方法である。
- 要求値Sreq>Vrなら、r状態では不可能。
- 0≤Sreq<Vrなら、r状態以下で実現可能。目標を超える有限回路を選び、全動的部品の容量と伝導率を同じ比率で縮小する。失った定常伝導を直接の辺で補う。極の位置は変わらず、観測値を正確に合わせられる。要求値0なら直接伝導のみでよい。
- Sreq=Vrの端点では別途、達成可能性を調べる。
表の矩形窓は、速さの最適値も解析的に求まる
w=1[a,b]、0<a<bとする。j段Erlangの区間確率のρ微分は、bje−ρb−aje−ρaと同符号。正から負への変化は一度だけで、
qj = e−ρja Σℓ=0j−1(ρja)ℓ/ℓ!
− e−ρjb Σℓ=0j−1(ρjb)ℓ/ℓ!.
従って表は局所探索の結果ではなく、この大域最適率と有限の動的計画法を評価したものになる。
より簡単な性能保証:凹な係数列と、集中の二乗に比例する状態数下界
W*=sup w、d0=0、dk=min(qwCk,W*)と置く。C(x)=xxe1−x/Γ(x)は増加かつ厳密に凹で、C(0)=0へ連続拡張できる。従ってdkの増分は非負で減少する。
=「全てのce(dk−dk−1)」の大きい方からr個の和.
Brは計算しやすい上界だが、固定したwの厳密な上限Vrとは区別する。Stirlingの厳密不等式とCauchy–Schwarzを使うと、r>0についてさらに
r ≥ (2π/e²) Sreq² /(qw²Σece²).
凹性の証明:A(x)=(log C)'=log x−ψ(x)=∫e−xtφ(t)dt、φ(t)=1/(1−e−t)−1/tと置く。φは1/2から1へ増加し、0<u<tならφ(u)φ(t−u)<φ(t)。畳み込みのLaplace変換からA²<−A′、従ってC″/C=A²+A′<0。増加性はA>0、原点の極限はC(x)∼exから従う。完全な証明と配分コードは再現資料に収録した。
もう一つの抽象化:保存則から、隠れた構造を縛る。
時間の応答とは別に、以前のCP行列の議論にも一般化が得られました。非負の隠れた因子が作る行列について、群ごとの釣り合いがあり、群内の余分な結合が小さければ、各群から一つだけを選ぶ組合せ構造に近いことを、誤差の式で保証できます。観測座標の総数に依存せず、必要な因子数も増やしません。
熱回路から得たCP観測行列にも使えますが、これは行列の構造を近似する定理です。近似した行列を同じ定常応答の回路として実現できることや、全時間応答の近似まで自動で保証するものではありません。
多群の構造安定性:最良係数、保存則を保つ版、証明
D=FᵀF、F≥0とし、Fの行数はr以下とする。座標をp≥2個の非空群G1,…,Gpに分割する。群内の漏れWと、群の総量の不釣合いIを
I=Σg<h(1Gg−1Gh)ᵀD(1Gg−1Gh)
と定義する。Wでは(i,j)と(j,i)を両方数える。I≥0で、I=0はD(1Gg−1Gh)=0が全群対に成り立つことと同値。全ての因子行で群の総和が等しくなる。
因子数を増やさない、構造への距離
各因子・各群から最大座標を一つ残してF0を作る。D0=F0ᵀF0はr以下の非負因子を持ち、群内の非対角成分はゼロ、0≤D0≤Dが成分ごとに成り立つ。そして
‖M‖成分和=Σij|Mij|。二つの係数はこの形式の一様な評価としてそれぞれ最良である。特にI=0では漏れWに対して線形で、観測座標数や因子数によらない評価となる。p=2なら7W/2。
証明の要点:一因子の群gの和をag、最大値をmg、漏れをwg=ag²−‖fg‖²とすると、mg≥ag−wg/ag。捨てた対角質量はwg/2以下。二群の和がa≥b>0、漏れがu,vなら、群間の質量損失は
≤ u+v+(a−b)√v.
全ての因子・群対で足し、Cauchy–Schwarzで不釣合いの項を評価すると、順序を区別しない群間損失は(p−1)W+√((p−1)IW)以下。これを2倍し、群内損失Wと対角損失W/2を足せば式を得る。群和が0の項は直接ゼロとして扱う。
線形係数の鋭さ:一因子で、p−1群は単独座標1、残る群だけ(1/2,1/2)とする。I=0、W=1/2で、最良の成分支配された1因子近似の損失が(2p−1/2)Wに一致する。平方根係数の鋭さは、p−1群を単独A、残る群をm個のb/mとし、A/b→∞、m→∞で得る。
保存則まで維持すると、重み付きハイパーグラフになる
I=0なら、各因子の全群の和は同じaである。各群の最大座標を選び、その値を全群共通のt=mingmgまで下げる。この因子は「各群から一つずつ選ぶ集合」の指示ベクトルのt倍となる。対応するD♭はr以下の因子数、成分ごとの0≤D♭≤D、全ての群釣り合いの保存則を満たし、
この係数も最良。最小の最大値tを持つ群jでa²−t²≤3wj/2だから、一因子の損失p²(a²−t²)を足せばよい。鋭さは上と同じ(1/2,1/2)の例で得る。p=2なら、二部グラフの辺に対応するt²(ei+ej)(ei+ej)ᵀの和になる。
限界:構成には非負因子Fが与えられている必要がある。Dだけからの効率的な因子化アルゴリズムではない。成分ごとの支配は半正定値順序での支配を意味せず、通常D−D0は不定符号になる。最初のD0は釣り合いを保つとは限らない。最大座標を残す方法自体は既知なので、それを新規発見としない。[77]
既知の道具と、今回検討する差分。
評価は「既知の確率論を接続した、強く有用な系」です。成立の証明は得られましたが、学術的新規性の確認は未完了です。特にCkの式そのものを新しい定数として主張できません。
| 内容 | 確認した既知部分 | 今回の差分候補 |
|---|---|---|
| 可逆な吸収時間 | MicloのTheorem 1.2:指数変数の和の混合。[74] | 正の相反回路に適用し、任意の非負測定の最適化へつなぐ。 |
| Erlangによる縮約 | YuのTheorem 3の証明に尺度混合。[76] | 物理的な道回路の極限と合わせて上限値の一致を示す。 |
| √k型の最良係数 | Ross第6版p.615演習8に同じ係数。指数密度を使う棄却法の古典的計算。[75] | 可逆正半群全体の一様な包絡と、固定定常応答の状態数下界。 |
| PH分布の集中 | HeらのLemma 1・2、Corollary 1:密度の増加率・確率順序・モーメント境界。今回本文を取得。[78] | 任意の非単調な非負窓の観測値を扱う点を分けて比較。 |
| 多群CP安定性 | 最大座標の丸めはChen–He–Zhang §3.2 Lemma 7に既出。[77] | 群の釣り合い、成分和の距離、因子数維持、最良係数の組合せ。 |
既知の分解と極限閉包から今回の主張が容易な系として導かれている可能性もある。探索で同じ式が見つからなかったことは、先取性の証明にはならない。証明と照合記録を分けて保存し、相型分布・正値実現・CP錐の誤差評価の専門文献との比較を残す。
今回の証明ノートと、独立検算をダウンロード
一般核・重み付き配分・CP安定性の証明ノート、既知文献との比較、独立監査、検算コードと結果をまとめた。確率論の定理を除く今回の導出は各ノートで追える。検算は証明の代用ではなく、式・物理実現・実装の取り違えを確認するもの。
- 物理的な容量・伝導率と定常応答の対応を、1〜9状態で有理数により確認。
- 最良係数へ近づく道回路と、Erlangの包絡を確認。
- CP行列1,200例を厳密有理数で独立検算。加えて600例を行列レベルで検算し、係数の鋭さを確認。
- 矩形窓の解析的最適率、配分の動的計画法、有限回路の具体例を再現。
外部論文のPDFは同梱せず、文献表の公開リンクから辿れる。今回の標準ライブラリ版コードはPython 3で実行できる。ファイルごとの依存関係は同梱READMEに記載。
容量の予算が決まると、
複雑にしても越せない壁がある。
前節の最良例では、部品値の大きさを制限しませんでした。現実の設計へ一歩近づけるため、今回は内部の総容量に上限Bを置きます。すると、状態数による限界とは別の、どれほど内部を複雑にしても越えられない上限が現れます。
時間窓の観測値を増やす目的に対して、正の容量を何個に分割し、どのように配線しても、同じ総容量を使った単純な1状態を上回れない領域があります。有限の部品で等号を達成できます。
ここで固定するのは、二つの端子間の定常伝導係数κと、内部容量の総量です。端子同士を直接つなぐ伝導も使えます。直接伝導で定常的な結合を補いつつ、内部容量を測りたい時間帯に合わせて配置します。熱回路なら、容量Cの単位はJ/K、伝導係数gはW/Kです。
Gw = supλ>0 λq(λ), q(λ)=∫0∞w(t)λe−λtdtDw:端子間の過渡核hを、時間重みwで積分した値
B:総容量の上限。行列の記号Bとは別の、スカラーの予算
Gwは測り方だけから決まります。右辺には状態数がありません。従って、状態を増やして得られる集中にも、総容量による絶対的な上限がかかります。逆向きに読むと、測定値Dwを実現するには少なくとも4Dw/Gwの総容量が必要です(0<Gw<∞の場合)。
仮定は、二端子だけに接続された、正の内部容量と非負の相反伝導を持つ安定な有限回路です。他の端子・環境への漏れは含めません。Dwは端子間の過渡核の積分値であり、投入熱量や最高温度そのものではありません。任意の非負可測wで評価でき、有限の性能保証に使うときはGw<∞を仮定します。
無次元化した例:定常伝導係数κ=1、測定窓は時刻0.9〜1.1。kは「使ってよい内部状態数の上限」です。実際の熱容量・伝導係数の単位へ戻す際は、選んだ時間・容量の基準を用います。
淡い緑の範囲では二つの値が重なり、どのk≥1でも厳密な最適値です。その他の範囲では、破線は上界であり、達成できるとは限りません。k=1なら、緑の曲線そのものが全てのBで厳密な最適値です。
下の値は、この有限回路で作れる。
内部容量を一つ置き、左右に同じ伝導係数gの枝をつなぎます。必要に応じて直接伝導dで補うと、定常伝導係数は常にg/2+d=1です。Bが大きいときは予算の一部だけを使います。
部品値は予算と定常伝導係数の制約を満たします。
「最良」は、今回は極限まで待たずに達成できる。
λq(λ)を最大にする率λcが存在し、Bλc/4≤κなら、容量Bの1状態で上界に等しくなります。左右の伝導係数をBλc/2、直接伝導係数をκ−Bλc/4とすればよいからです。B>0のとき内部容量と左右の伝導係数は正で、直接伝導は非負です。B=0なら内部状態を置きません。
max容量合計≤Bの全回路 Dw = (B/4)Gwλcが最大化率として存在する場合。状態数は自由でも、1状態で達成。
この例ではλc≈2.01348、Gw≈0.10900。従ってB≤約1.98661なら、1状態が全ての有限回路に対して最適です。容量を小分けにする工夫を続ける前に、容量そのものが支配的な制約かを判断できます。
容量が増えたら、2状態が実際に有利になる例もある
同じ窓[0.9,1.1]、κ=1で予算B=5にすると、有限の2状態でD≈0.097555を達成できる。同じ予算での最適1状態は約0.073699なので、約32.4%大きい。
直列経路「左端子—容量1—容量2—右端子」の二つの容量を各5/2、両端の伝導係数を各15/4、中央を15/8とし、端子間に直接伝導1/16を加える。総容量は5、定常結合は1である。
D=(15/8)q(3/2)−(15/16)q(3).
この値は上の図の緑線より上にある、別の達成例。2状態または全回路の大域最適値とは主張しない。小容量では分割しても無益だが、予算が増えると内部構造の工夫が役立つことを、二つの有限構成で比較できる。
ある瞬間の応答にも、同じ予算から限界が出る。
この式は、遅い時刻tに大きな過渡核を残すための容量負担を表します。時刻tを先に固定すれば、率2/tの1状態がこの容量上界に達します。ただし、固定した定常伝導係数κに対してB/(2t)≤κという実現条件も必要です。同じ回路が全時刻で同時に等号を満たすという意味ではありません。
波形全体を指定すると、必要容量が正確に決まる例。
もう一歩進めて、観測値一つではなく、二端子間の過渡核h(t)を全時刻で一致させます。異なる減衰率λjを使ってh(t)=Σrje−λjtと書けるなら、どんな有限回路でも
特に、h(t)=Ae−αt−be−βt、A≥b>0、0<α<βなら、最小総容量は4A/α²で、2状態の有限回路が達成します。ここでは小文字bが速い指数の係数で、容量予算Bとは異なります。
Lは左端子、Rは右端子。枝の数値は伝導係数で、全て非負です。
総容量4が必要で、4で十分。回路の内部を増やしても、同じ波形を総容量4未満では作れません。
図の容量は2+2。動的部分の定常結合は7/8で、直接枝1/8を足すと定常結合κ=1になります。
平均遅延だけから分かる容量下限は15/4=3.75です。波形全体の係数を使うことで、これを厳密な4へ引き上げられます。
固定したのは一つのクロス応答h(t)です。自己応答も含めた全ポート伝達行列を固定した最小実現問題とは区別します。数値は無次元例です。
証明:容量の上限と、波形からの最小容量
1.物理量を、対称な行列へ移す
C=diag(Ci)を正の内部容量、Lを内部伝導行列、gL,gRを非負の境界伝導ベクトルとする。相反性からLは対称で、非対角成分は非正。各内部連結成分は境界につながり、Lは正定値とする。二端子以外への漏れがなければL1=gL+gR。
h(t)=uᵀe−Qtv ≥ 0,
z=Q−1(u+v)=C1/21, y=Q−1(u−v).
したがって‖z‖²=Ctot。動的な定常結合をadyn=∫h=uᵀQ−1vと書く。直接枝はhに含まれず、総定常結合はκ=adyn+gdirect。
2.正のスペクトル評価で、全ての回路をまとめて抑える
≤ zᵀQ²e−Qtz.
Q²e−Qtは半正定値。w≥0で積分し、Qを直交対角化すると、各固有値λの係数はλ²∫we−λt=λq(λ)≤Gw。従って4Dw≤CtotGw≤BGw。無限積分は、非負項へのTonelliの定理で扱える。
最大化率λcで、C=B、gL=gR=Bλc/2とすればy=0で等号。直接枝κ−Bλc/4が非負である条件が、本文の小容量条件になる。
点ごとの評価にはmaxλ>0λ²e−λt=4/(e²t²)を使う。遅い時刻の積分には、w=1[T,∞)としてmaxλe−λT=1/(eT)を使えば
B≤4κTなら、率1/Tの同じ1状態構成が等号を達成する。なおw=1[0,T]など開始時刻0を含む窓ではGw=∞となり、この容量上界は役に立たない。定常結合からのDw≤κ‖w‖∞は残る。
3.漏れや他の端子があっても、容量上界は残る
観測する二端子以外に非負の漏れ・境界伝導があれば、Qzphys=u+v+r、r≥0、zphys=C1/21。Q−1が成分ごとに非負なので、zeff=Q−1(u+v)≤zphys。証明のzをzeffに変え、‖zeff‖²≤Ctotを使えば同じ上界を得る。他端子は基準温度・電位に固定する。以下の容量の等式は漏れなしの場合に限定する。
4.全波形の正の残差が必要容量を決める
λjの固有空間への直交射影をPjとする。異なる指数関数の一次独立性と上の恒等式により
Ctot≥4Σj(rj)+/λj².
正のrjに必要な‖Pjz‖²を足せばよい。観測に現れないモードを追加しても下界は弱まらない。他端子がある場合もzeffで証明できる。全てrj≥0なら、各項に容量4rj/λj²の左右対称な1状態を置いて並列にすれば、下界を達成する。
二指数の差Ae−αt−be−βtには、次を選ぶ。
gL=((A+√Ab)/α, (A−√Ab)/α),
gR=((A−√Ab)/α, (A+√Ab)/α).
Qの対角成分は(α+β)/2、非対角成分は−(β−α)/2。対称モードの率と残差はα,A、反対称モードではβ,−bとなり、全時刻で一致する。定常結合κも指定するならκ≥A/α−b/βが必要十分で、差を直接枝で補う。b>0なら二つの非零極があるので、状態数も最小の2。b=0なら1状態でよい。
容量の余裕が小さいと、波形の自由度も制限される
漏れのない二端子系で、p=L−1gL、f=h/adyn、μ=∫tfと置く。pは左右の境界値を1と0にしたときの内部の定常値で、0≤p≤1。
δ=Ctot−4adynμ=ΣCi(2pi−1)² ≥ 0.
最初の恒等式は既知の遷移経路理論に対応する。δ=0ならp=1/2、u=vとなり、hは非負の指数関数の混合になる。内部配線そのものが消えるという主張ではない。
さらにh±=¼(z または y)ᵀQ²e−Qt(z または y)とし、b−=∫h−とすると、h+=h+h−。λmax(Q)≤Λなら、指数分布の混合g=h+/(adyn+b−)に対し
ここでTVはL¹距離の半分。緩和率上限がない場合でも、時間で重み付けした密度F=th/(adynμ)とG=4th+/CtotはTV(F,G)≤δ/Ctotを満たす。GはErlang形状2の混合であり、元のfについての無条件の指数混合近似とは異なる。証明は、それぞれの密度を二つの確率密度の凸結合として書くことによる。
緩和率にも上限を置くと、状態数による性能向上は有限個で止まる
0<ℓ<Uの帯域にQの全固有値があるとする。容量と伝導係数の大きさは制限しない。このとき、非負の測定窓wに対する、k状態以下の正規化核fの観測値の厳密な上限は
前節の可逆吸収時間の分解とGamma–Dirichlet表現で現れる率は、元の固有値の重み付き調和平均なので帯域内に残る。逆向きは、対称な細い経路Qε=ρ(I−εApath)でErlang核へ近づける。帯域端点は内側から近づける。これは上限の等式であり、有限回路での最大値の達成は保証しない。
wが[0,T]だけを測るなら、j≥UTに対しErlang(j+1,ρ)/Erlang(j,ρ)=ρt/j≤1。従って
例として帯域[0.8,1.2]、窓[0.9,1.1]では、J=2。1状態の上限は約0.073699、2状態以上の上限は約0.086605で、それ以上の状態数では改善しない。対象はこの単一観測値で、全波形や複数の観測値の同時再現ではない。
理想的な多段化には、この構成では容量が必要になる
j状態の対称経路では、目標Erlang核との全変動距離はTV≤(j−1)ε²。一方、動的定常結合κを固定したとき、総容量はε→0で
2状態なら厳密にCtot=2κ(1+ε)/[ρε(1−ε)]。近似誤差を0へ追い込むこの経路族では、容量が発散する。これはこの構成の費用であり、全ての近似方法に共通する必要量の下界ではない。容量制限まで課した最適化は、別途解く必要がある。
例外:ℓ=UならQ=ℓIで指数核しか残らないため、上のErlang式へそのまま代入できない。また前節の普遍定数Ckは率を自由に選べる1状態との比較である。同じ帯域に制限された1状態との比には、任意の非負窓に共通する有限定数は存在しない。証明・反例・15経路の数値確認は再現資料に収録。
操作図の計算式と、上界・達成値の区別
図はκ=1、a=0.9、b=1.1、w=1[a,b]を使う。このa,bは測定窓の端であり、定常結合を表す旧節のaとは別である。
μ1=log(b/a)/(b−a),
Gw=λcq(λc).
λcは(λq(λ))'=0の正の最大化率で、次の方程式を二分法で求める。
数値計算では同値な対数微分1/λ−a+(b−a)/(e(b−a)λ−1)=0を使う。左辺は厳密に減少し、正から負へ一度だけ変わるため、最大化率は一意である。λq(λ)=λ²∫abe−λtdtの導関数はλ≤2/bで正、λ≥2/aで負。実装は符号の異なる端点から二分する。1状態の最大化率μ1とは異なる。
橙色:二つの独立した上界の小さい方
Ekは前節の状態数だけを制限した厳密な上限。j段の最適率ρj=jμ1を使い、j=1,…,kのErlang区間確率の最大値を取る。二つの上界を合わせたUは、一般に両制約下の最適値と断定できない。
緑色:有限の1状態で実現する厳密な最適値
B>0としλ0=4κ/Bと置く。この矩形窓では最適率は、λ0≥λcならλc、μ1<λ0<λcならλ0、λ0≤μ1ならμ1となる。得られた率λに対し
C=4A/λ, g=2A, d=κ−A
とすれば、C≤B、g,d≥0、定常結合κで、観測値はAq(λ)=L(B)。B=0はC,gを置かず直接伝導d=κだけにする。表示値とグラフは浮動小数点評価であり、一般核の数値的な大域最適化や製造誤差の保証を行うものではない。
先行研究と照らした、今回の位置づけ。
| 主張・分野 | 本文照合と今回の判断 |
|---|---|
| 容量と平均遅延 | Metznerら(2009)の式(2.21)、§2.6、およびRoux(2022)p.134111-5の「反応経路の平均時間=占有量/流束」と対応する。既知結果として扱う。[80][81] |
| 容量による鋭い観測上界・小容量域の有限最適回路 | 今回、解析的証明と等号構成を検証した。対称半群のスペクトル評価から短く導けるため、同じ式が検索で見つからなくても先取性は確定しない。 |
| 波形からの容量下界・二指数の厳密解 | クロス応答全体について必要量と達成構成が一致した。ただし、古典的な容量最小化との照合が未完了。Hagopian–Frisch(1970)、Boesch–Hagopian(1971)の中心本文は未取得。[83][84] |
| RCの実設計 | Vandenberghe・Boyd・El Gamal(1998)は主要時定数と回路の大きさの最適化を扱う。今回の観測核に対する全配線共通の下界とは目的・制約が異なる。実機適用には形状、接触、製造誤差などの追加条件が必要。[82] |
| 最小電気回路実現 | Hughes(2018)は多ポートも扱い、RLCT回路の容量素子・誘導素子の最少数を評価する。今回との差はスカラー/多ポートではなく、変圧器・インダクタを許す範囲と、非負伝導・接地容量という制約にある。[79] |
2026 10 03の検算メモ:容量上界(ランダム300回路で 4D/(CtotGw) の最大0.952、点ごとの評価で最大0.970)、λc・Gw・部品値、B=5の2状態回路(D≈0.0975547)、波形e−t−¼e−2tの回路(全時刻で一致・総容量4)、aμ=ΣCipi(1−pi)とδの恒等式、帯域制限の値(0.0736990・0.0866048)を独立に再計算し、いずれも一致。照合候補(推測):平均遅延の式はRC回路のElmore遅延(1948)や、Rubinstein–Penfield–Horowitz(1983)のRC木の遅延上下界と形が近く、容量と遅延の文献として優先して照合したい。なお、この節では a・b を測定窓の両端、B を容量予算の意味で使っており、前節までの記号とは別物です。
今回言える成果:総容量という資源制約を加えると、測定値から必要容量を保証でき、一部の設計問題では最適値と有限回路が一致する。学術的新規性は未確定。一般の最小正値実現・最小相型実現の未解決問題を解決したとは扱わない。
以前の「任意の測定窓で成立」は、窓を一つ選ぶたびに最適化できるという意味。同じ一つの回路が、全ての窓で同時に最適・全応答一致になるとは限らない。今回は別途、二指数のクロス応答全体を固定した問題を明示して解いている。
証明・検証スクリプト・照合記録を持ち帰る
解析的証明、独立監査、一次資料の照合箇所、容量の数値確認(300回路・100構成)、15経路の近似と容量の確認を収録。数値実験は証明の代わりではなく、式と実装の整合確認です。
Python 3、NumPy、SciPyで実行できます。外部論文のPDFは含めず、出典リンクを記載しています。
証明、出典、再現コード。
ここからは専門的な記録です。本文の説明に対応する詳細を開けます。探索途中の数値と判断は、当時の記録として保持しています。最新成果は「総容量の制約と有限の最適回路」。一般化の到達点は「測り方によらない一般定理」と「最少状態数の具体例」を優先してください。
数値の変遷 — 現在の下限は11/62
以下は同じ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 |
| 2026 09 21・現在 | 11/62 ≈ 0.177419 | 約7.7942 mW |
熱流を記載した4行は、容量尺度1 J/K、緩和率0.25 s⁻¹、1 Kを1秒の線形ランプで立上げ、0.1秒待機、各窓5.025725秒の同じ合成例。下限の保証が強まったのであって、模型の実際の誤差を減らした結果ではありません。数式と現在の判断は最新の証明を参照してください。
A. 最新の証明:成分別の下限・測定補正・集約式と文献照合
誤差下限を強め、測定器の記憶を分ける
新たに取得した公開著者稿との照合から、一般論の帰属を更新した。その上で、捨てていた成分情報を使って下限を強め、一次遅れを持つ測定器でも使える補正・正規化を導いた。以下の結果は解析的な証明と合成例に基づき、実機の性能値ではない。
A. 捨てていた上下限を使い、距離下限を11/62へ改善する
前の三集約式は、対角の上限・反対頂点間の上限・サイクル四辺の下限だけを使う範囲で最良だった。今回は、対角の下限とサイクル四辺の上限も使う。この追加情報により、既知の四角形行列H₀に対する結果を次まで進められる。
11/62 ≈ 0.1774193548、D₃=infF∈ℝ₊3×4∥FᵀF−H₀∥max。
上界は前に有理数演算で検証した代数的な可行例による。今回改善したのは下界である。以下の証明は誤差11/62以下の閉じた箱も排除する。表示では保守的に「≤」を使うが、11/62ちょうどを判定保留へ戻す必要はない。最小誤差そのものや大域最適解は未決定である。
1. 各成分の異なる誤差幅を、五つの安全な値へまとめる
測定から、対称な真の行列Xについて個別の区間 ℓij≤Xij≤uij が保証されているとする。サイクルは12・23・34・41、反対頂点間は13・24である。
| 記号 | 区間から作る値 | 真の行列に課される条件 |
|---|---|---|
| L | mini ℓii | 全ての対角成分がL以上 |
| D | maxi uii | 全ての対角成分がD以下 |
| m | mincycle max(0,ℓij) | 四辺の全てがm以上 |
| M | maxcycle uij | 四辺の全てがM以下 |
| z | max(0,u13,u24) | 反対頂点間がz以下 |
同じ誤差幅を全成分に仮定する必要はない。ただし、区間そのものが真値を覆うという保証は必要である。以下は、分岐を少なくした十分条件として次の領域で使う。
この領域の外では、この新しい判定は保留とする。既存の三集約式などが使える場合まで否定するものではない。
2. 判定式
次の四つの補助量を計算する。いずれの分母も、上の前提で正である。
V=min{M, mz(D−z)/(m²−Dz)}、
R=min{M, 2Dzm/(z²+m²)}。
さらに 0<U≤z、A≤D、R≥m、V≥m を確認する。この整合条件を満たす場合、A≥L>M≥Rなので A>R、Am>Rz も自動的に成立する。
L−Pmax > M ⇒ 区間に整合するCPランク3以下の行列は存在しない。
したがって、測定行列のCPランクが内部状態数以下になる実験条件の下では、3状態以下の候補模型を排除できる。前提や整合条件を満たさない場合は、実装を単純にするため保留としてよい。この十分条件を満たさないことは、3状態で十分だという意味ではない。
五値判定の証明:平面への配置から、残る高さを評価する
反対に、区間内のXが X=FᵀF、F≥0、Fの行数≤3 と書けたとする。必要なら零行を足し、4本の列ベクトルをℝ³内で考える。対角はL以上、全ての非対角成分はM以下で、L>Mだから、どの2列についてもGram行列の行列式は L²−M²>0 以上。従って全列は非零で、対ごとに一次独立である。
Brandts–KřížekのCorollary 3.6をそのまま適用できる。非負八分空間内で、二つの列が同じ座標を0に持つ配置を選べる。これは既知の定理であり、その仮定はここで全て満たされている。今回はL>Mを前提にしたため、退化例の摂動処理を必要としない。[34]
反対頂点の組が座標平面にある場合:全列をその平面へ射影する。各サイクル辺は平面上の列に接しているため、その内積は変わらない。対角と反対頂点間の内積は増えず、全列は非負の2次元に入る。
角度が最小の列をviとし、そのサイクル上の隣接列をvj,vkとする。二つの行列式は同符号なので、2次元のLagrange恒等式から
=−det(vi,vj)det(vi,vk)≤0。
j,kは反対頂点である。よってm²≤Dzとなり、前提に反する。射影後の零列はm>0に反するため生じない。これは前の2次元補題と同じ議論である。
隣接する組が座標平面にある場合:サイクルの対称性により列1,2と置いてよい。次の記号を使う。
Δ=ab−r²≥L²−M²>0。
列3,4の座標平面への射影内積はP=N/Δであり、
射影が非負座標平面にあるため、P≥0、従ってN≥0である。この必要条件から、元の区間を次のように絞れる。
v,wの上限:a,b≤D、r≥mを使い、u,xをzへ増やすと上界は増える。偏微分はDv−mx、Dw−muで、m(D−z)>0以上である。よって
右辺のwに関する偏微分はDz−mv≤Dz−m²<0。wを下限mへ置くと、v(m²−Dz)≤mz(D−z)が得られる。v≤Mも合わせてv≤V。対称にw≤Vである。
rの上限:rを置き換えず、a,b≤Dだけを使うと
≤Dz(v+w)/(z²+vw)≤2Dzm/(z²+m²)。
最初の分母はwv≥m²>0。中央の比はu,xを増やすと増加する。例えばu微分の分子はw(v²−x²)>0である。最後の比はv,w≥m>zで各々減少し、両者をmにすると最大になる。r≤Mと合わせ、r≤Rを得る。
a,bの下限:b≤D、r≥mを使い、u,xをzへ増やす。この際の偏微分Dv−mxとaw−muは、前提L>M≥m>zから正である。すると
右辺のv微分はm/z−D/w≥(m²−Dz)/(mz)>0、w微分は(Dv−mz)/w²>0である。v=w=mで最小となるためa≥z+m²/z−D。a≥Lも合わせてa≥A、対称にb≥Aとなる。
u,xの下限:a,b≤D、r≥mを使い、xだけをzへ増やすと、
分母と分子はm²>Dzから正。wを増やすと増え、v微分の分子はz(D²−m²)>0である。v=w=mにしてu≥(m²−Dz)/(D−z)=Uを得る。対称にx≥Uである。ここまでで、a,b≥A、r≤R、v,w≤V、u,x≥Uがそろった。
射影ノルムの上限:列3の射影の二乗ノルムは
a,bについての偏微分は、それぞれ −(bu−rw)²/Δ²、−(aw−ru)²/Δ² で非正。従ってa,bを下限Aへ置くとP₃は増える。この変更中もA>R≥rにより分母は正である。
a=b=Aとした後は、Au≤Dz<m²≤rw、ru≤Rz<Am≤Awである。従ってP₃はuに関して減少、wに関して増加する。またr微分の符号は
で決まり、rについても増加する。よってu=U、w=V、r=Rを代入したPmaxが上限になる。列4の射影ノルムP₄=(bv²−2rvx+ax²)/Δも、xが小さい側、vが大きい側として同じ上限を持つ。
残る高さから矛盾:列3,4の第3座標をh₃,h₄≥0とする。全体の二乗ノルムはL以上なのでh₃²,h₄²≥L−Pmax。判定条件L−Pmax>M≥m>0の下では、
これはサイクル辺の上限X₃₄≤Mに反する。平面に置かれる二列が反対頂点でも隣接頂点でも不可能なので、区間内のCP3行列は存在しない。□
3. H₀の閉じた誤差箱への代入
∥X−H₀∥max≤e、e=11/62と仮定する。CP3の候補ならXは成分非負なので、五値はL=2−e、D=2+e、m=1−e、M=1+e、z=eと取れる。前提と全ての整合条件を、有理数演算で確認できる。
| 量 | 厳密値 |
|---|---|
| L、D、m、M、z | 113/62、135/62、51/62、73/62、11/62 |
| A、U、V、R | 113/62、9/62、187/186、75735/84382 |
| Pmax | 1607793697181 / 2499351279048 |
| L−M−Pmax | 4690998979 / 2499351279048 > 0 |
最後の正の余裕は約0.0018768866。符号の判定はこの小数表示に頼らず、分子・分母が正の整数であることから行う。従って誤差e以下の閉箱にCP3行列はない。対角下限Lと辺上限Mの差が正なので、零列・比例列も前提によって除かれ、閉箱の端点に未処理の例外はない。
再現コード round6_geometry_certificate.py はPython標準ライブラリのFractionだけで全ての符号と分母を検算する。最適化ソルバーの「解が見つからなかった」という判定は使っていない。11/62はこの手順で証明した下界であり、この手順自体を最適化した値でもない。
同じ合成実験への換算
容量尺度1 J/K、λ=0.25 s⁻¹、1 Kを1秒の線形ランプで立上げ、0.1秒待って各h=5.025725秒を測る条件では、a=e−0.025(1−e−0.25)/0.25·(1−e−λh)²。真の熱流の最大誤差Eは、
以前の三集約による7.321860 mWに対して33/31倍。区分二次ランプでは約7.784105 mW、既述の電気的縮尺では約7.784105 µA。これは全4入力・4出力・観測区間のどこかで避けられない誤差であり、全時刻・全出力で常に生じる値ではない。
B. ゼロ結合を禁止したときの最少数 — 既知結果の具体化
Bomze–Dickinson–StillのDefinition 1.1は、H=FᵀFの因子Fの全成分を厳密に正にしたときの最少行数をcp⁺(H)と定義する。分解不能なら∞。以下の頁・定理番号は、取得した2014 11 04の公開著者稿に対応し、刊行版の番号との一致は未確認である。[61]
| ρ | 通常ランク | 非負因子の最少行数 | 正因子の最少行数 |
|---|---|---|---|
| 0 | 3 | 4 | ∞ |
| 0<ρ<1/2 | 3 | 4 | 4 |
| ρ=1/2 | 3 | 3 | 4 |
| ρ>1/2 | 3 | 3 | 3 |
この表は、既知のCPランクの境界と、同稿の正因子化の議論を組み合わせた具体化として扱う。独立した新理論とは主張しない。
正因子の構成と、境界に正の3行因子がない証明
F₀を四角形の0/1辺因子とし、各行・列の和を2とする。α=(√(1+ρ)−1)/2と置くと、F₄=F₀+αJはρ>0で全成分が正であり、
これはBDS Theorem 4.8(p.6)のPerron方向への加算による正因子化の直接例。H₀の正規化Perronベクトルx=1/2·1、固有値4、加算係数μ=4ρを使う。定理の証明は、このように零成分を持つ非負行列も明示的に扱う。ρ<1/2では既知のcp(Hρ)=4が下限を与え、ρ=0ではH₁₃=0のため正因子は不可能。
ρ>1/2ではh=√(1+ρ)、q=√(3/8)として、既存の直交回転から得た3行因子は次のとおり。
[ h/2−q, h/2+q, h/2+q, h/2−q ]
[ qh−1/4, qh−3/4, qh+1/4, qh+3/4 ]
[ qh+3/4, qh+1/4, qh−3/4, qh−1/4 ].
F₃ᵀF₃=Hρ、h/2>q、qh>3/4なので全成分が正。通常ランク3が下限を与える。境界ρ=1/2では非負3行因子はあるが、別の正3行因子もないことを示す必要がある。
H*=H₁/₂=GᵀG、G>0、Gが3行と仮定する。x=1/2·1、y=GxとするとH*x=6x、Gᵀy=6x、yᵀy=6。十分小さいt>0ではGₜ=G−tyxᵀも正で、
右辺のパラメータは0と1/2の間になるため、CPランク4という既知結果に矛盾する。よって境界のcp⁺は4。CP錐の内部を仮定するBDS Theorem 4.9を、ランク3のHρへ無条件に適用した証明ではない。□
熱回路で「結合が正」と読み替えられる条件
前掲の熱回路モデルでQ=CI−1/2LIICI−1/2、B=CI−1/2(−LIB)とする。H=BᵀQ−2BだからF=Q−1Bが非負Gram因子になる。全境界–内部結合が正ならB>0、Q−1は非負で対角が正なのでF>0。従って内部数r≥cp⁺(H)。より一般に、各内部連結成分が全境界へ接続する場合も同じ必要条件が成立する。
逆に正の因子Fの各行fについてv=Σⱼfⱼ、容量C=v²、境界との伝導gⱼ=λvfⱼを選べば、全結合が正の独立星形を構成できる。境界間の残余伝導−Kᵢⱼ−λHᵢⱼ≥0という、もとの実現条件は別に必要。したがってこの条件下では、全境界–内部結合を正にした最少内部数がcp⁺(H)となる。
さらに単一極の厳密実現でr=rank(H)=3なら、Bの行ランクも3。対称Qの各固有空間の留数が半正定値なので、目標にない極を相殺することはできずQB=λB。従ってQ=λIで、内部同士の伝導はゼロとなる。ρ=1/2のどの厳密な3内部実現にも、少なくとも一つの境界–内部結合のゼロが必要である。全境界への結合が正という条件は、内部点同士もつながっているという条件ではない。
C. 測定器の遅れを補正してから、状態数を判定する
真の熱流をqᵢⱼ、観測をyᵢⱼとする。入力実験jの一定の正の倍率bⱼ、出力iの一定の正の倍率aᵢ、一次遅れθᵢ>0を許し、観測区間で次を満たすと仮定する。
cᵢⱼは定数オフセット。各出力チャンネルの倍率・時定数は実験間で一定、立上りの形は全入力で共通、物体の初期平衡と回路条件は従来どおり。未知の任意フィルター、時刻ずれ、チャンネル混合はこのモデルに含めない。
Eᵢⱼ=2yᵢⱼ(T+h)−yᵢⱼ(T)−yᵢⱼ(T+2h),
Aᵢⱼ=Jᵢⱼ+θᵢEᵢⱼ=aᵢbⱼDᵢⱼ.
証明はセンサーの微分方程式を各窓で積分して引くだけ。等長窓なので定数は消え、微分項が3端点の式になる。センサーの初期値は任意でよく、立上り中の境界容量の応答も補正される。ただし、物体そのものの初期化条件は残る。
補正しないと、内部0個からCPランク4が現れる反例
A(C₄)を四角形の隣接行列、K=2I−A(C₄)、CB=4Iとする。内部容量は0個。単位ステップの真の応答はq=K·1t≥0+CBδ₀で、t>0では一定である。同じゼロ初期値の一次遅れk(t)=e−tを全出力へかけると、
J=e−T(1−e−h)²H₀.
JのCPランクは4だが、物体の内部数は0。共通かつ非負のセンサーフィルターという条件だけでは、従来の判定は保証されない。θ=1の端点差Eは−Jなので、補正A=J+Eは厳密に0へ戻る。
この反例は理想ステップだけに依存しない。立上りが共通の単調ランプで、正の微分測度μが[0,T₀]にある場合、窓の開始T>T₀では係数e−Tが∫e−(T−v)μ(dv)>0に置き換わる。同じ偽のH₀信号が残る。無限尾を持つ遅れに対し、有限時間待つだけでは厳密には消えない。
一定の正の倍率は、相反する二つの測定から消せる
補正後のAは倍率のため対称とは限らない。算術平均ではなく、相反ペアの幾何平均を使う。
Cᵢᵢ=1, Cᵢⱼ=√[AᵢⱼAⱼᵢ/(AᵢᵢAⱼⱼ)]=Dᵢⱼ/√(DᵢᵢDⱼⱼ).
Dの対角が正のときに限り後式を使える。正の対角合同はCPランクを保存する既知の操作であり、cp(C)=cp(D)。[58] 従って、正の一定ゲインの分離形aᵢbⱼと共通波形が検証されていれば、絶対倍率が未知でも状態数の排除はできる。H₀に比例する理想信号ならC=H₀/2となる。mWなどの絶対誤差へ戻すには、別途振幅・ゲインの校正が必要。
時定数の校正誤差と、各測定の異なる誤差幅
|J−Ĵ|≤εJ、|E−Ê|≤εE、|θ−θ̂|≤δθ、0<θ≤θ⁺を全対象で同時に保証する。Â=Ĵ+θ̂Êについて、
A−Â=(J−Ĵ)+θ(E−Ê)+(θ−θ̂)Êに三角不等式を適用した。端点誤差がε₀,ε₁,ε₂ならεE=ε₀+2ε₁+ε₂。各窓の積分誤差は和をεJへ入れる。全時刻で観測誤差≤σ、時定数が正確ならεA≤(2h+4θ)σに数値積分誤差を加えればよい。独立雑音の仮定は不要。
各Aの区間をℓᵢⱼ=max(0,Âᵢⱼ−εA,ij)、uᵢⱼ=Âᵢⱼ+εA,ijと置く。すべてのuが非負、対角のℓが正なら、
Uᵢⱼ=√[uᵢⱼuⱼᵢ/(ℓᵢᵢℓⱼⱼ)]
がCᵢⱼの安全な下限・上限になる。c=mincycleLᵢⱼ、z⁺=min(1,maxoppositeUᵢⱼ)としてc>M(1,z⁺)なら3状態以下を排除する。上の五値判定にも、対角上下限を1、サイクル上限をmin(1,maxcycleUᵢⱼ)として渡せる。
uᵢⱼ<0やLᵢⱼ>1なら、まず仮定した測定器・物理模型のクラスとの不整合である。「だから4状態」とは結論しない。対角下限が0以下なら、この正規化は使わない。統計的区間を使う場合は全成分・使用した窓選択を同時に覆う必要があり、標準偏差をそのまま決定論的な幅へ置き換えない。
適用範囲の追加監査:窓を増やせばよいとは限らない
二窓の重みを(1,−3,3,−1)の四窓へ変えると、定常以外のドリフトも消せるが、CP性は一般には保てない。Q=[[2,−1],[−1,2]]、B=I、T=h=log(10/9)で、内部核Q−2e−QT(I−e−Qh)⁴の非対角成分は厳密に−346880018961/2000000000000000。半正定値でも非負とは限らない。
全状態数へ拡張する自己畳み込みdg=ν*νも、νが非負であることが必要。ν=2δ₀−δlog2を許すと、同じ二内部系の二窓差に負の非対角成分が生じる。また、内部容量を非対角へ広げると、CI=[[2,−1],[−1,2]]、LII=−LIB=LBB=I、T=h=3log2で非対角成分−143/1024となる。相反・受動という条件だけで、対角内部容量の仮定を省略してはいけない。
いずれも適用範囲を確認する独立な解析例。これらの注意一般の学術的新規性を主張するものではない。
D. 公開本文の照合で、帰属をどう更新したか
BDSの15頁公開著者稿を本文・文献表まで照合した。全定理を独立に証明し直したという意味ではない。比較に直接使った箇所は、Definition 1.1、Theorems 2.4・4.8・5.1、Lemma 5.2、§6の半代数的な集合の議論である。[61]
| 先行結果 | 今回の扱い |
|---|---|
| Theorem 2.4(p.3):CPランクの下半連続性 | H₀からCP3まで正の距離があるという存在論は既知。最大成分ノルムでの具体的定数は同定理にない。同稿が帰属する2013年原論文の命題本文は未取得。 |
| Theorem 4.8(p.6):Perron方向への加算で正因子化 | Hρの正4因子構成を、同定理の直接例へ帰属。正成分の族を作ること自体は成果候補から外す。 |
| Theorem 5.1(p.7)、Lemma 5.2(p.8) | 4×4の最大CPランク4、正成分のCP行列のCP-plusランク≤4を既知として利用する。 |
| 内部での局所一定性、genericity | 全Hρはランク3の4×4行列でCP錐の境界にある。錐の内部の定理や全空間での一般性を、この族へそのまま移さない。 |
| 三集約極値式、11/62の個別成分評価、二窓測定 | 同じ命題は読んだBDS稿では確認できない。これは一資料との比較結果であり、先取性の確定ではない。基礎の認識定理・正規化・線形フィルターの代数は既知。 |
追加リストの取得状況も反映した。以下の「未取得」は無料本文が存在しないという断定ではない。
| 照合候補 | 2026 09 21時点の確認範囲 |
|---|---|
| Basson–Halkias 1965 [62] | IEEE登録書誌・DOIを確認。中心本文は未取得。 |
| Stein–Moore 1971 [63] | DOI、巻頁年を確定。中心本文は未取得。 |
| Stein 1971会議稿 [64] | Stein1973の参考文献で題名・会議・頁を確認。会議録番号71 C 53-CT。本文未取得。 |
| Mathew–Chandrashekaran [65] | 出版社の要旨・書誌・参考文献まで。オンライン公開2026 09 19、巻号は2027年。購読限定で具体的な角度閾値は未照合。 |
| De Tommasiほか 2014 [66] | 著者掲載の要旨とDOIまで。時間領域の受動RC同定との本文比較は残る。 |
| Berman–Shaked-Monderer 2003/Shaked-Monderer–Berman 2021 [60] [67] | 書誌・目次・試し読み入口まで。必要な小サイズ・CPランクの章本文は未取得。 |
回路側では、共通帰線を持つことと全内部容量が接地されることを区別する。またZ(s)の実現からY(s)=Z(s)−1へ移す際は、可逆性・極構造・入出力・容量配置・数える状態が保たれるかを確認する。今回のKは特異であり、「インピーダンスとアドミタンスは容易に読み替えられる」として未読の最小性定理を代用しない。
残す成果候補:既知の幾何定理から導いた具体的な集約・成分別の不等式、検算可能な誤差定数とSDP分離例、明示した測定器モデル下の状態数判定への組み合わせ。数学的な証明と、歴史的な新規性の確認は引き続き分けて扱う。
11/62の厳密な有理数検算 — Python標準ライブラリ
"""Exact rational margins for the Round 6 coordinate-plane exclusion.
The mathematical implication is proved in round6_geometry.md; this script
certifies the chosen constants and strict signs without floating-point tests.
"""
from fractions import Fraction as Q
from pathlib import Path
import json
def certify(e):
assert Q(1, 6) < e < Q(1, 4)
m, M, L, D = 1-e, 1+e, 2-e, 2+e
assert 0 < e < m <= M < L <= D
A = max(L, 1/e-4+e)
V = min(M, 2*e*m/(1-4*e))
R = min(M, 2*D*e*m/(e*e+m*m))
U = (1-4*e)/2
assert 0 < U <= e < m
assert L <= A <= D
assert m <= V <= M and m <= R <= M
assert A > R
assert m*m > D*e
assert D*m > M*e
assert A*m > R*e
Pmax = (A*(U*U+V*V)-2*R*U*V)/(A*A-R*R)
assert Pmax >= 0
assert L-Pmax > M
return dict(error_budget=e, m=m, M=M, L=L, D=D,
A=A, U=U, V=V, R=R,
opposite_pair_margin=m*m-D*e,
projected_norm_upper=Pmax,
fourth_edge_margin=L-M-Pmax)
def main():
main_result = certify(Q(11, 62))
# A slightly larger rational budget certifies a uniform strict margin
# for general-position approximation of a boundary/degenerate factor.
perturbation_result = certify(Q(17742, 100000))
assert perturbation_result['error_budget'] > main_result['error_budget']
data = {'status': 'Exact rational assertions passed',
'proved_lower_bound': str(main_result['error_budget']),
'main_exact': {k: str(v) for k,v in main_result.items()},
'display_only': {k: float(v) for k,v in main_result.items()},
'strict_perturbation_budget': str(perturbation_result['error_budget']),
'strict_perturbation_margin': str(perturbation_result['fourth_edge_margin']),
'pairwise_independence_directly_from_L_greater_than_M': True,
'global_optimality_claimed': False}
output = Path(__file__).with_name('round6_geometry_certificate.json')
output.write_text(json.dumps(data, indent=2)+'\n')
print(json.dumps(data, indent=2))
if __name__ == '__main__':
main()
センサー・正因子・倍率相殺の独立数値検査 — Python + NumPy
"""Independent numerical checks accompanying round6_independent_audit.md.
Analytic arguments are in the note; floating-point checks are not proofs.
"""
import json
import math
from pathlib import Path
import numpy as np
H0 = np.array([[2, 1, 0, 1], [1, 2, 1, 0],
[0, 1, 2, 1], [1, 0, 1, 2]], dtype=float)
J = np.ones((4, 4))
A = H0 - 2 * np.eye(4)
K = 2 * np.eye(4) - A
CB = 4 * np.eye(4)
def e_integral(rate, left, right):
return (math.exp(-rate * left) - math.exp(-rate * right)) / rate
def two_window(fun_integral, T, h):
return fun_integral(T, T+h) - fun_integral(T+h, T+2*h)
def F3(rho):
h, q = math.sqrt(1+rho), math.sqrt(3/8)
return np.array([[h/2-q, h/2+q, h/2+q, h/2-q],
[q*h-.25, q*h-.75, q*h+.25, q*h+.75],
[q*h+.75, q*h+.25, q*h-.75, q*h-.25]])
def F4(rho):
F0 = np.array([[1, 1, 0, 0], [0, 1, 1, 0],
[0, 0, 1, 1], [1, 0, 0, 1]], dtype=float)
return F0 + ((math.sqrt(1+rho)-1)/2) * J
def main():
result = {'checks_are_numerical': True}
# Zero-internal-node sensor counterexample.
T, h = .7, .8
y = lambda t: K + H0 * math.exp(-t)
iy = lambda l, r: K * (r-l) + H0 * e_integral(1, l, r)
Dy = two_window(iy, T, h)
Ey = 2*y(T+h) - y(T) - y(T+2*h)
coefficient = math.exp(-T) * (1-math.exp(-h))**2
result['fake_sensor'] = {
'coefficient': coefficient,
'uncorrected_residual': float(np.max(np.abs(Dy-coefficient*H0))),
'corrected_residual': float(np.max(np.abs(Dy+Ey))),
'K_min_eigenvalue': float(np.linalg.eigvalsh(K).min()),
'K_row_sums': K.sum(axis=1).tolist(),
}
assert np.max(np.abs(Dy-coefficient*H0)) < 1e-14
assert np.max(np.abs(Dy+Ey)) < 1e-14
# General first-order sensor: q(t)=q0+sum weights exp(-alpha t).
# Independent exact antiderivatives; nonzero sensor initialization.
records = []
q0, weights, rates, initial = 1.7, [2.3, -.4], [.31, 1.73], -1.2
for beta in [.2, .9, 3.1, 7.0]:
for T, h in [(.03, .07), (.5, .8), (1.4, 2.0)]:
def y(t):
return q0 + (initial-q0)*math.exp(-beta*t) + sum(
w*beta/(beta-a)*(math.exp(-a*t)-math.exp(-beta*t))
for w, a in zip(weights, rates))
def iq(l, r):
return q0*(r-l) + sum(w*e_integral(a, l, r)
for w, a in zip(weights, rates))
def iy(l, r):
return q0*(r-l) + (initial-q0)*e_integral(beta, l, r) + sum(
w*beta/(beta-a)*(e_integral(a, l, r)-e_integral(beta, l, r))
for w, a in zip(weights, rates))
Dq, Dy = two_window(iq, T, h), two_window(iy, T, h)
Ey = 2*y(T+h)-y(T)-y(T+2*h)
residual = abs(Dq-Dy-Ey/beta)
assert residual < 3e-14
records.append({'beta': beta, 'T': T, 'h': h, 'residual': residual})
result['sensor_identity'] = records
# Shared-endpoint composite trapezoidal weights and exact l1 noise bound.
trap_records = []
for N in [1, 2, 5, 10]:
h = .8
dt = h/N
for tau in [.01, .2, 1.0]:
w = np.r_[dt/2, np.full(N-1, dt), 0.,
np.full(N-1, -dt), -dt/2]
w[0] -= tau
w[N] += 2*tau
w[-1] -= tau
exact = abs(dt/2-tau)+3*tau+dt/2+2*(N-1)*dt
assert abs(np.sum(np.abs(w))-exact) < 1e-14
trap_records.append({'N': N, 'tau': tau, 'l1_weight': exact})
result['trapezoid_noise_weights'] = trap_records
factor_records = []
for rho in [1e-6, .1, .49, .5, .500001, .7, 1., 5.]:
expected = H0 + rho*J
g4 = F4(rho)
assert g4.min() > 0
assert np.max(np.abs(g4.T@g4-expected)) < 2e-14
record = {'rho': rho, 'F4_min': float(g4.min()),
'F4_gram_residual': float(np.max(np.abs(g4.T@g4-expected)))}
if rho >= .5:
g3 = F3(rho)
assert g3.min() >= -2e-16
if rho > .5: assert g3.min() > 0
assert np.max(np.abs(g3.T@g3-expected)) < 2e-14
record.update(F3_min=float(g3.min()),
F3_gram_residual=float(np.max(np.abs(g3.T@g3-expected))))
factor_records.append(record)
result['factors'] = factor_records
# Gain cancellation through symmetric geometric means.
H = H0+.3*J
a, b = np.array([.3, 2., 1.2, 4.]), np.array([3., .7, 2., .4])
M = a[:, None] * H * b[None, :]
C = np.sqrt(M*M.T/np.outer(np.diag(M), np.diag(M)))
normalized_H = H / np.sqrt(np.outer(np.diag(H), np.diag(H)))
result['gain_normalization_residual'] = float(np.max(np.abs(C-normalized_H)))
assert np.max(np.abs(C-normalized_H)) < 1e-14
out = Path(__file__).with_suffix('.json')
out.write_text(json.dumps(result, indent=2)+'\n')
print('All independent numerical checks passed.')
print('Maximum sensor identity residual:', max(x['residual'] for x in records))
print('Results:', out)
if __name__ == '__main__':
main()
有理数検算の実行記録
{
"status": "Exact rational assertions passed",
"proved_lower_bound": "11/62",
"main_exact": {
"error_budget": "11/62",
"m": "51/62",
"M": "73/62",
"L": "113/62",
"D": "135/62",
"A": "113/62",
"U": "9/62",
"V": "187/186",
"R": "75735/84382",
"opposite_pair_margin": "9/31",
"projected_norm_upper": "1607793697181/2499351279048",
"fourth_edge_margin": "4690998979/2499351279048"
},
"display_only": {
"error_budget": 0.1774193548387097,
"m": 0.8225806451612904,
"M": 1.1774193548387097,
"L": 1.8225806451612903,
"D": 2.1774193548387095,
"A": 1.8225806451612903,
"U": 0.14516129032258066,
"V": 1.0053763440860215,
"R": 0.897525538621981,
"opposite_pair_margin": 0.2903225806451613,
"projected_norm_upper": 0.6432844037007102,
"fourth_edge_margin": 0.0018768866218704544
},
"strict_perturbation_budget": "8871/50000",
"strict_perturbation_margin": "964422841882034536069568877539212231/519259289904624073914823037628800000000",
"pairwise_independence_directly_from_L_greater_than_M": true,
"global_optimality_claimed": false
}
独立数値検査の実行記録
{
"checks_are_numerical": true,
"fake_sensor": {
"coefficient": 0.15058382721735358,
"uncorrected_residual": 5.551115123125783e-16,
"corrected_residual": 8.881784197001252e-16,
"K_min_eigenvalue": -8.586881206085195e-16,
"K_row_sums": [
0.0,
0.0,
0.0,
0.0
]
},
"sensor_identity": [
{
"beta": 0.2,
"T": 0.03,
"h": 0.07,
"residual": 3.011479954295737e-15
},
{
"beta": 0.2,
"T": 0.5,
"h": 0.8,
"residual": 2.220446049250313e-16
},
{
"beta": 0.2,
"T": 1.4,
"h": 2.0,
"residual": 1.3322676295501878e-15
},
{
"beta": 0.9,
"T": 0.03,
"h": 0.07,
"residual": 4.683753385137379e-16
},
{
"beta": 0.9,
"T": 0.5,
"h": 0.8,
"residual": 1.3322676295501878e-15
},
{
"beta": 0.9,
"T": 1.4,
"h": 2.0,
"residual": 1.7763568394002505e-15
},
{
"beta": 3.1,
"T": 0.03,
"h": 0.07,
"residual": 1.8735013540549517e-16
},
{
"beta": 3.1,
"T": 0.5,
"h": 0.8,
"residual": 5.551115123125783e-16
},
{
"beta": 3.1,
"T": 1.4,
"h": 2.0,
"residual": 1.3877787807814457e-16
},
{
"beta": 7.0,
"T": 0.03,
"h": 0.07,
"residual": 4.163336342344337e-17
},
{
"beta": 7.0,
"T": 0.5,
"h": 0.8,
"residual": 3.8163916471489756e-16
},
{
"beta": 7.0,
"T": 1.4,
"h": 2.0,
"residual": 2.5673907444456745e-16
}
],
"trapezoid_noise_weights": [
{
"N": 1,
"tau": 0.01,
"l1_weight": 0.8200000000000001
},
{
"N": 1,
"tau": 0.2,
"l1_weight": 1.2000000000000002
},
{
"N": 1,
"tau": 1.0,
"l1_weight": 4.0
},
{
"N": 2,
"tau": 0.01,
"l1_weight": 1.2200000000000002
},
{
"N": 2,
"tau": 0.2,
"l1_weight": 1.6
},
{
"N": 2,
"tau": 1.0,
"l1_weight": 4.8
},
{
"N": 5,
"tau": 0.01,
"l1_weight": 1.46
},
{
"N": 5,
"tau": 0.2,
"l1_weight": 2.08
},
{
"N": 5,
"tau": 1.0,
"l1_weight": 5.28
},
{
"N": 10,
"tau": 0.01,
"l1_weight": 1.54
},
{
"N": 10,
"tau": 0.2,
"l1_weight": 2.24
},
{
"N": 10,
"tau": 1.0,
"l1_weight": 5.4399999999999995
}
],
"factors": [
{
"rho": 1e-06,
"F4_min": 2.499999375293882e-07,
"F4_gram_residual": 4.440892098500626e-16
},
{
"rho": 0.1,
"F4_min": 0.024404424085075815,
"F4_gram_residual": 4.440892098500626e-16
},
{
"rho": 0.49,
"F4_min": 0.11032778078668515,
"F4_gram_residual": 4.440892098500626e-16
},
{
"rho": 0.5,
"F4_min": 0.11237243569579447,
"F4_gram_residual": 4.440892098500626e-16,
"F3_min": -1.1102230246251565e-16,
"F3_gram_residual": 4.440892098500626e-16
},
{
"rho": 0.500001,
"F4_min": 0.11237263981990575,
"F4_gram_residual": 8.881784197001252e-16,
"F3_min": 2.0412411128045704e-07,
"F3_gram_residual": 4.440892098500626e-16
},
{
"rho": 0.7,
"F4_min": 0.15192024052026487,
"F4_gram_residual": 4.440892098500626e-16,
"F3_min": 0.0395478048244704,
"F3_gram_residual": 4.440892098500626e-16
},
{
"rho": 1.0,
"F4_min": 0.20710678118654757,
"F4_gram_residual": 4.440892098500626e-16,
"F3_min": 0.0947343454907531,
"F3_gram_residual": 2.220446049250313e-16
},
{
"rho": 5.0,
"F4_min": 0.7247448713915889,
"F4_gram_residual": 1.7763568394002505e-15,
"F3_min": 0.6123724356957945,
"F3_gram_residual": 1.7763568394002505e-15
}
],
"gain_normalization_residual": 1.1102230246251565e-16
}
三つの集約値から得られる、最良の状態数判定
以下は2026 09 20の記録。三集約式の最良性はそのままで、全成分を使う下界は翌日の11/62へ強化した。最新の本文照合は追究6を参照。
今回の文献照合から、前回は予想として残した不等式を証明できた。既知の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)を次の照合候補に加えた。前者は書誌、後者は書誌・要旨を確認した段階で、当時は関連定理の本文照合が残っていた。現在は2014年公開著者稿を本文照合し、帰属を更新した。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、現在の全成分評価では11/62へ改善されています。各節の新規性判断も最新の照合を優先してください。節番号は元の研究記録に対応します。
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件を掲載した。追加査読と取得候補を加えた現在の台帳は84件である。「本文確認」は関連箇所を読んだことを指し、論文全体の全証明の独立検証を意味しない。要旨のみの文献を本文確認済みとして数えていない。
測定から、これ以上小さくできない物理模型を見分ける
追究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. 文献84件:確認した範囲と未取得資料
本文を確認した資料と、要旨・書誌のみの資料を区別しています。84件全てを全文精読したという意味ではありません。BDSは公開著者稿を新たに本文照合し、追加6件は取得範囲を明記しています。
11. 主要文献84件と確認範囲
本文確認済み=関連する定理・設定・導出を点検。要旨のみ=その範囲を超えた同値性判断には使用しない。プレプリント年と刊行年が異なる場合は併記。解説論文はその旨を記載。