eaa5cbeb21
Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
254 lines
22 KiB
Markdown
254 lines
22 KiB
Markdown
# HHT 독립 정식화 검토와 제조해 검산
|
||
|
||
2026-10-11 질량 정책 변경: [HHT-ADR-012](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
|
||
|
||
아래 상태와 미실행 표시는 각 검토 당시의 기록이다. 이후 reference 비교와 실제 shell
|
||
검증 결과는 [구현 수치 검토](implementation-numerical-review.md), 현재 실패·잔여 범위는
|
||
[PRD](PRD.md)와 [전체 현황](../tracking/status.md)을 따른다.
|
||
|
||
|
||
|
||
<a id="numerical-review"></a>
|
||
|
||
<a id="numerical-review--hht-독립-수치-검토검증-계약"></a>
|
||
## HHT 독립 수치 검토·검증 계약
|
||
|
||
- Feature: `hht-implicit-dynamics`; owner: `numerical-review-agent`; date: `2026-09-22`.
|
||
- 상태: `numerical-contract-defined; io-binding-and-implementation-verification-pending`. 기존 정식화 검토에 후속 Numerical gate의 내부 판정·검증 사례·reference mapping 검토를 추가했다. Solver 기능 통과 또는 I/O schema 승인이 아니다.
|
||
- 기준: [프로젝트 지침](../../AGENTS.md), [Feature PRD](PRD.md), [요구사항](requirements.md), [연구 근거](research.md#research), [공통 tolerance](../TOLERANCE.md).
|
||
- 상세: [내부 수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [시간정확도 검산](numerical-review.md#numerical-review-probes), [추가 일차 근거](research.md#numerical-research), [reference mapping](reference-model.md). Solver source/tests/reference/상위 계약은 수정하지 않았다.
|
||
|
||
<a id="numerical-review--결론"></a>
|
||
### 결론
|
||
|
||
[주 정식화](formulation.md)와 [관성 상세](formulation-inertia.md)를 독립 대조했다. **현재 physical/algorithmic 가속도 분리 후보의 표시된 수식에서 새 오류는 발견하지 않았다.** 사용자는 [HHT-ADR-007](ADR.md)에서 consistent kinetic mass를 선택했다. 내부 수치값과 반증 가능한 사례를 구체화했으며 Numerical 계약은 후속 I/O/구현에 인계할 수 있다. 실제 finite-rotation shell의 drilling DAE·시간수렴·reference 검증은 구현 후 필수 evidence다. 이 미실행을 수식 모순이나 코드 작성 금지로 해석하지 않는다.
|
||
|
||
| 확정한 내부 판정 | 핵심 기준 |
|
||
| --- | --- |
|
||
| Newton·선형계 | Force/moment별 상쇄 전 기여 scale의 residual `1e-10`, correction 및 h-scaled v/a/A 각각 `1e-10`의 AND; linear backward error `1e-12`; 최대100 corrections, fixed DIRECT/no cutback |
|
||
| Mass·DAE | Analytic `Jl^-1 d`의 free-space intersection으로 expected rank; positive-space Cholesky, scaled local/대수 rcond `>=2^-32`, null/Gram/moment `1e-12`; 초기 hidden consistency `1e-10` |
|
||
| 미분·불변식 | D3/관성/전체 tangent step sweep의 nonzero error `1e-6`, exact zero action `1e-10`; nonlinear objectivity `1e-10`, force/moment balance `1e-8`; dynamic Keff 대칭 가정 없음 |
|
||
| 시간·coverage | 지정 smooth oracle의 q/v/physical a 최대오차와 마지막 두 refinement 차수 `>=1.8`; A는 별도량. Full Cartesian moving-null, coupled massless startup, finite-rotation shell, energy, rollback, 전체 reference 사례 |
|
||
|
||
숫자의 norm·zero branch·단위·실행 상태는 [numerical-controls](numerical-controls.md)가 원본이다. 위 요약의 값만 떼어 다른 metric에 적용하지 않는다. 기존 정적 외력 상대 1%/absolute `1e-3`나 eigen 외부 RMS 예외를 동적 Newton에 승계하지 않았다.
|
||
|
||
<a id="numerical-review--위험과-수정-반영"></a>
|
||
### 위험과 수정 반영
|
||
|
||
| ID | 판단 | 근거·필요 조치 |
|
||
| --- | --- | --- |
|
||
| HHT-NR-001 | Naive variable-mass HHT의 일반 2차 주장 **FAIL; 현 후보에서 배제 완료** | 여기서 `g=c+f_int-F`. `M(q1)A1+(1+alpha)g1-alpha*g0`에 `-alpha*h*Mdot*a` 결함. Smooth SDOF의 마지막 refinement 차수 `0.976709`. 관성 상세 §5.1이 이를 배제한다. |
|
||
| HHT-NR-002 | 두 시점 mass 가중을 moving-null 해결책으로 채택 **FAIL; 현 후보에서 배제 완료** | 양의 가중 합의 nullspace는 교집합이다. 회전하는 drill null이 사라지면 인공 관성이 생긴다. SDOF 2차 관찰은 shell 채택 근거가 아니다. 관성 상세 §5.3이 이를 채택하지 않는다. |
|
||
| HHT-NR-003 | Endpoint physical `a`와 auxiliary `A` 분리 **SUPPORTED CANDIDATE** | `A1=(1+alpha)a1-alpha*a0`, Newmark에는 A, endpoint balance에는 a. Smooth variable-mass와 한 moving-null 제조해에서 U/V/a의 2차 경향 확인. 일반 shell DAE 수렴 증명·구현 통과는 아니다. |
|
||
| HHT-NR-004 | `A`를 physical acceleration으로 출력 **FAIL; 현 후보에서 구분 완료** | 위 후보에서도 A의 endpoint 오차는 1차다. 주 정식화 §§4–6이 a/A와 endpoint reaction을 구분한다. 영속 결과 선택은 I/O owner의 후속 계약이다. |
|
||
|
||
<a id="numerical-review--수식-대조-결과"></a>
|
||
### 수식 대조 결과
|
||
|
||
| 검토 항목 | 결과와 evidence |
|
||
| --- | --- |
|
||
| DOF·좌표·회전 | `[u,phi]`, total fixed-global chart `|phi|<pi`, `omega=Jl v_phi`와 `omega_dot=Jl a_phi+DJl[v_phi]v_phi`는 기존 [비선형 정식화 §§3,6](../nonlinear-static-newton-raphson/formulation.md)와 일관된다. B, C, D3의 방향미분을 직접 대조했다. Rate에 A를 넣지 않는다. |
|
||
| 질량·적분·단위 | Consistent `HᵀH`, scalar moment lumping, `M_uu/M_uphi/M_phiphi`의 `M/ML/ML²`와 force/moment 차원은 일관된다. `3³` 질량 적분의 최대 축별 차수 4, 내력 `2³`의 분리 및 density/reference measure 고정도 [기존 mass M1–M7](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)과 대조했다. 질량 종류별 에너지·orbital inertia 차이는 실제 물리 선택이다. |
|
||
| 관성력·접선 | `I=∫rho Hᵀ(Ha+D²x[v,v])dV0`는 kinetic energy의 Euler–Lagrange 전개와 일치한다. `DqI`의 `D²x[p,·]ᵀ xddot`, `HᵀD²x[p,a]`, `HᵀD³x[p,v,v]` 및 `DvI=2∫rho HᵀD²x[v,p]`를 확인했다. `M/((1+alpha)beta h²)`와 `gamma/(beta h)` chain-rule 계수도 맞다. 일반 비대칭을 허용해야 한다. |
|
||
| Null·초기화 | `ker B=span(Jl^-1 d)` 및 free admissible null을 사용한다. `psi=Nᵀg=0`, 초기 1·2차 미분조건과 `(psi_q N)eta`로 null acceleration을 구하는 절차는 일관된다. M pseudoinverse만으로 초기 가속도를 정하지 않는 것이 필요하다. 실제 shell의 constant rank/regularity는 미검증이다. |
|
||
| 시간·하중 | `alpha=-.05,beta=.275625,gamma=.55`, STEP의 `0+` 전값, `a0` 평형 및 `A0=a0`, `DIRECT h=.1,T=10`을 보존한다. Constant M에서 free endpoint 평형과 표준 force-weighted HHT의 환원을 확인했다. 큰 h의 정확도·일반 비선형 무조건 안정성을 주장하지 않는다. |
|
||
| 반력·에너지·회복 | Endpoint `E=I+f_int-F`, reaction의 support-on-structure 부호, `M_spatial=Jl^-T m_phi`의 가상일 관계는 일관된다. `R_HHT,c`와 endpoint reaction을 구별한다. `T+U_phys+U_drill-W`는 이산 에너지 결함이며 물리 damping이 아니다. Numerical drill을 physical section stress에 넣지 않는다. |
|
||
| State·안정성·coverage | 같은 trial의 q/v/a/A·tangent·recovery, 원자적 commit, 실패 history 보존 및 fixed dt 실패 종료는 수식과 일치한다. 기존 MITC의 locking/왜곡/chart 경계는 사라지지 않는다. U/UR reference만으로 V/A/에너지·큰 회전·hidden constraint를 검증할 수 없다. |
|
||
|
||
<a id="numerical-review--계약-결정과-후속-검증의-구분"></a>
|
||
### 계약 결정과 후속 검증의 구분
|
||
|
||
| ID | 영향·owner | 필요한 해소 |
|
||
| --- | --- | --- |
|
||
| HHT-NR-005 | **구현 후 필수 검증; 기능 acceptance blocking**, Formulation/Implementation/Numerical Review | 선택한 지원 범위에서 free mass의 예상 constant rank와 `psi_q N` guard, finite-rotation drill coupling, q/v/a 및 hidden-constraint defect의 시간수렴을 검증한다. Nonsingular-mass 문헌 정리를 직접 확대하지 않으며 모든 finite-rotation shell DAE의 보편 정리를 새로 요구하지도 않는다. 현재 2D moving-null probe는 특정 regular 예제의 제한된 evidence다. |
|
||
| HHT-NR-006 | **CLOSED: mass 사용자 결정**, Main/사용자 | HHT-ADR-007의 consistent kinetic mass를 사용한다. Lumped를 동시에 지원하거나 reference fitting으로 전환할 의무·권한은 없다. 이 결정은 HHT의 모든 공개 입력/결과 계약까지 승인한 것이 아니다. |
|
||
| HHT-NR-007 | **Numerical criteria DEFINED; I/O binding pending**, 해당 owner | [N1–N7](numerical-controls.md)과 [C01–C12](verification-cases.md)에 mixed-unit Newton, zero branch, conditioning/branch, 종료·hidden defect·oracle를 정의했다. 공개 a/A·omega quantity 선택과 HDF5 field/schema 연결은 후속 I/O 소유다. |
|
||
|
||
후속 필수 검증은 정식화 §7과 연구 HHT-E01–E10을 따른다. 특히 실제 shell의 3차 director/관성 tangent directional derivative, 초기 drilling acceleration coupling, 좌표변환 후 동일 물리 모델, kinetic-energy derivative·관성 force/moment 평형, 선형 alpha=0 에너지 및 비선형 에너지 결함 시간수렴을 포함해야 한다. 일반 비선형 HHT에 정확 에너지 보존·매 frame 단조감소를 강제하지 않는다.
|
||
|
||
<a id="numerical-review--reference-tolerance-적용-경계"></a>
|
||
### Reference tolerance 적용 경계
|
||
|
||
[reference-model](reference-model.md)을 독립 대조해 수치 비교 정의에 이견이 없음을 확인했다. 원본 inventory의 직접 재집계는 그 문서에 기록된 main evidence다. `Step-1/increment/instance/node/component` identity, frame별 `U-global`/`UR-global` 27 scalars씩 총202 families, 9-node projection 전후 사전검사를 사용한다. CSV decimal time `n/10`과 FESA scheduled binary64 `n*h`를 각각 검증한 뒤 integer increment로 연결하므로 표시 decimal과 부동소수점 곱의 차이를 nearest-time tolerance로 숨기지 않는다. 실제 HDF5 field/schema는 후속 I/O가 연결한다.
|
||
|
||
[TOLERANCE](../TOLERANCE.md)의 near-zero band `0.01S`, 일반 행 relative `0.05`, relative RMS `0.01`, `S=0` exact-zero를 그대로 사용한다. U blocking, UR warning-only이나 identity/finite 오류는 전체 실패다. Eigen RMS 예외는 적용하지 않는다. 이 정식화 검토 당시 Reference 비교는 **미실행**이었다. 9개 node가 중심 주변 3×3 patch라는 coverage 한계 및 성긴 `dt/T1≈7.4567`을 보존한다.
|
||
|
||
<a id="numerical-review--실행-evidence와-한계"></a>
|
||
### 실행 evidence와 한계
|
||
|
||
[독립 검산](numerical-review.md#numerical-review-probes)의 기존 SDOF/angle-reduced moving-null은 **종단 오차** evidence로 재사용했다. 후속 main의 full Cartesian 2×2 residual/Jacobian probe를 읽고 한 번 재실행하여 exit `0` 및 **전체 시점 최대오차**를 확인했다. 마지막 refinement의 q/v/a 차수는 `1.99985/1.99992/1.99834`, full residual 최대 `7.94824e-11`, 최대 Newton3 corrections였다. 별도 Jacobian의 고정 step sweep도 연속한 내부 점에서 `1e-6` 이하를 보였다. 이 관찰은 N2–N7의 모든 gate나 실제 shell을 통과한 실행이 아니다.
|
||
|
||
본 owner의 4개 문서에서 로컬 링크 대상·trailing whitespace를 검사하여 문제 0개였다. Binary64 scalar 계산으로 `gamma4096=4.54747e-13`, `gamma64/(2^-32)=3.05176e-5` 및 `diag(1,c)`의 c=`2^-31,2^-32,2^-33,0`에 대한 conditioning 경계 판정 `pass,pass,fail,fail`을 확인했다. 이는 scalar 산술 확인이며 C05의 실제 mass/condition-estimator 실행 통과가 아니다.
|
||
|
||
잔여 위험은 선택 consistent mass의 실제 shell constant-rank/regularity, D3 구현과 small-angle 경계, 큰 h의 시간 alias, 초기·finite-dt hidden constraints, 조건수 추정의 forward-error 한계다. C01–C12가 이를 검출하도록 설계됐고 아직 solver 실행 결과는 없다. Build/CTest, FESA 동적 해석, Abaqus, 외부 reference comparison은 이번 문서 작업 범위에서 실행하지 않았다.
|
||
|
||
<a id="numerical-review-probes"></a>
|
||
|
||
<a id="numerical-review-probes--hht-독립-시간정확도-검산"></a>
|
||
## HHT 독립 시간정확도 검산
|
||
|
||
[검토 보고서](numerical-review.md#numerical-review)의 상세 evidence다. 2026-09-22 Python 표준 라이브러리만 사용했다. FESA solver, Abaqus 또는 reference 비교 실행이 아니다. 아래 오차는 승인 tolerance를 새로 정하는 값이 아니라 정확해와의 수렴 관찰값이다.
|
||
|
||
<a id="numerical-review-probes--모델과-결과"></a>
|
||
### 모델과 결과
|
||
|
||
1. Smooth SDOF: `T=.5(1+q²)v²`, `c=qv²`, `q_exact=.4+sin(t)`, `f=(1+q_exact²)a_exact+q_exact v_exact²`, `0≤t≤1`. 초기 `q=.4,v=1,a=0`. 입력은 일관된 무차원 검산 단위다. `alpha=-.05,beta=.275625,gamma=.55`.
|
||
2. Moving-null: `x(q)=q/|q|`, `T=.5|Dx(q)v|²`, `U=.5(|q|-1)²`, `q∈R²\{0}`. `r=|q|`, `d=q/r`, `M=(I-ddᵀ)/r²`, `c=-2(q·v)Mv/r²`, `f_int=(r-1)d`. `ker M=span(q)`가 회전한다. 정확해 `q=(cos t,sin t)`, `v=(-sin t,cos t)`, `a=-q`; 초기 위치·속도·가속도 대수조건은 일관된다. Endpoint 반경 대수조건 `r=1`은 각도 parameterization으로 정확하게 강제하며 tangent 평형만 Newton으로 푼다. 이 모델은 shell/drilling 구현이나 일반 singular-DAE 정리의 대체물이 아니다.
|
||
|
||
| SDOF 방법 | `h=1/512` U 오차 | `h=1/1024` U 오차 | 관측 차수 |
|
||
| --- | ---: | ---: | ---: |
|
||
| Naive `M1 A1+(1+alpha)g1-alpha g0=0` | 1.0272820368e-5 | 5.2200068232e-6 | 0.976709 |
|
||
| Weighted mass `((1+alpha)M1-alpha M0)A1+(1+alpha)g1-alpha g0=0` | 3.2914014847e-7 | 8.2299941973e-8 | 1.999739 |
|
||
| Endpoint physical `M1 a1+g1=0`, `A1=(1+alpha)a1-alpha a0` | 2.7561411953e-7 | 6.8902116013e-8 | 2.000030 |
|
||
|
||
`g=c-f`. 마지막 방법의 physical acceleration 오차는 `2.3176116737e-7 → 5.7545108678e-8`로 줄지만 algorithmic `A` 오차는 `5.2612378749e-5 → 2.6344436092e-5`다. 따라서 `A`를 endpoint physical acceleration으로 보고하면 안 된다.
|
||
|
||
Moving-null 마지막 방법은 같은 두 h에서 U 오차 `4.0606413493e-7 → 1.0152120526e-7`, V 오차 `4.1505360817e-7 → 1.0376522277e-7`, physical a 오차 `4.1511310820e-7 → 1.0262747089e-7`를 보였다. `max|q·v|`는 `8.4282e-11 → 1.0594e-11`, `max|q·a+v²|`는 `7.9368e-7 → 1.9445e-7`다. Endpoint 위치 대수조건을 지켜도 미분된 속도·가속도 조건이 매 frame 정확히 0이 되는 것은 아니다. 이 결함의 시간수렴과 초기 일관성을 별도로 검증해야 한다.
|
||
|
||
<a id="numerical-review-probes--독립-수학-대조"></a>
|
||
### 독립 수학 대조
|
||
|
||
Smooth 물리식 `M(q)a+g(q,v,t)=0`에서 Newmark 내부 가속도의 정확해 대응은 `A=a+alpha*h*adot+O(h²)`다. Naive 식의 일차 결함은
|
||
|
||
`alpha*h*(M*adot+gdot)=-alpha*h*Mdot*a`.
|
||
|
||
따라서 `Mdot*a≠0`인 일반 문제에서 상수 M 증명을 그대로 사용할 수 없다. Weighted mass는 이 항을 상쇄하지만 `alpha∈(-1,0)`이면 서로 다른 두 시점의 양의 준정부호 질량의 양의 결합이다. 그 영공간은 두 영공간의 교집합이므로, 영공간이 회전하면 rank가 늘어날 수 있다. 단순 SDOF의 2차 결과가 이를 정당화하지 않는다.
|
||
|
||
Physical/algorithmic 가속도 분리는 [Brüls–Arnold 원문](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf)의 Eq. (5), (7), (8)에 `alpha_m=0,alpha_f=-alpha`를 대입한 것이다. 원문의 p.6 equivalent-model/index-3 가정은 비특이 mass 및 제약 정칙성을 사용한다. Singular drilling mass에 그 증명을 직접 적용하지 않는다. 이 문서의 제조해와 결함 계산은 독립 검산이다.
|
||
|
||
<a id="numerical-review-probes--재현-코드와-명령"></a>
|
||
### 재현 코드와 명령
|
||
|
||
Workspace root에서 다음 명령으로 아래 Python block만 실행한다. 외부 package, 파일 생성 또는 solver 실행은 없다.
|
||
|
||
```powershell
|
||
python -c 'from pathlib import Path; s=Path("docs/hht-implicit-dynamics/numerical-review-probes.md").read_text(encoding="utf-8"); exec(s.split(chr(96)*3+"python\n",1)[1].split(chr(96)*3,1)[0])'
|
||
```
|
||
|
||
```python
|
||
import math
|
||
|
||
alpha = -.05
|
||
beta = (1-alpha)**2/4
|
||
gamma = .5-alpha
|
||
|
||
def exact(t):
|
||
return .4+math.sin(t), math.cos(t), -math.sin(t)
|
||
|
||
def force(t):
|
||
q, v, a = exact(t)
|
||
return (1+q*q)*a+q*v*v
|
||
|
||
def scalar(h, variant):
|
||
q, v, ap = exact(0)
|
||
A = ap
|
||
for n in range(round(1/h)):
|
||
t = (n+1)*h
|
||
m0 = 1+q*q
|
||
g0 = q*v*v-force(n*h)
|
||
oldap = ap
|
||
pred = q+h*v+h*h*(.5-beta)*A
|
||
vpred = v+h*(1-gamma)*A
|
||
def calc(x):
|
||
an = (x-pred)/(beta*h*h)
|
||
vn = vpred+gamma*h*an
|
||
m = 1+x*x
|
||
if variant == 'physical':
|
||
pn = (an+alpha*oldap)/(1+alpha)
|
||
r = m*pn+x*vn*vn-force(t)
|
||
dr = 2*x*pn+m/((1+alpha)*beta*h*h)+vn*vn+2*x*vn*gamma/(beta*h)
|
||
else:
|
||
me = m if variant == 'naive' else (1+alpha)*m-alpha*m0
|
||
dm = 2*x if variant == 'naive' else (1+alpha)*2*x
|
||
r = me*an+(1+alpha)*(x*vn*vn-force(t))-alpha*g0
|
||
dr = dm*an+me/(beta*h*h)+(1+alpha)*(vn*vn+2*x*vn*gamma/(beta*h))
|
||
pn = an
|
||
return r, dr, vn, an, pn
|
||
x = pred+beta*h*h*A
|
||
for _ in range(20):
|
||
r, dr, *_ = calc(x)
|
||
dx = -r/dr
|
||
x += dx
|
||
if abs(dx) < 1e-14:
|
||
break
|
||
else:
|
||
raise RuntimeError('scalar Newton failed')
|
||
q = x
|
||
_, _, v, A, ap = calc(q)
|
||
qe, ve, ae = exact(1)
|
||
return abs(q-qe), abs(v-ve), abs(ap-ae), abs(A-ae)
|
||
|
||
def moving_null(h):
|
||
q, v, ap = [1.,0.], [0.,1.], [-1.,0.]
|
||
A = ap[:]
|
||
theta = 0.
|
||
max_cv = max_ca = 0.
|
||
dot = lambda x,y: sum(x[i]*y[i] for i in range(2))
|
||
for _ in range(round(1/h)):
|
||
pred = [q[i]+h*v[i]+h*h*(.5-beta)*A[i] for i in range(2)]
|
||
vp = [v[i]+h*(1-gamma)*A[i] for i in range(2)]
|
||
old = ap[:]
|
||
theta += h
|
||
def calc(angle):
|
||
d = [math.cos(angle),math.sin(angle)]
|
||
tangent = [-d[1],d[0]]
|
||
an = [(d[i]-pred[i])/(beta*h*h) for i in range(2)]
|
||
vn = [vp[i]+gamma*h*an[i] for i in range(2)]
|
||
pn = [(an[i]+alpha*old[i])/(1+alpha) for i in range(2)]
|
||
dv, tv = dot(d,vn), dot(tangent,vn)
|
||
residual = dot(pn,tangent)-2*dv*tv
|
||
derivative = 1/((1+alpha)*beta*h*h)-dot(pn,d)-2*(tv*tv+dv*(-dv+gamma/(beta*h)))
|
||
return residual, derivative, d, vn, pn, an
|
||
for _ in range(15):
|
||
r, dr, *_ = calc(theta)
|
||
dx = -r/dr
|
||
theta += dx
|
||
if abs(dx) < 1e-14:
|
||
break
|
||
else:
|
||
raise RuntimeError('moving-null Newton failed')
|
||
_, _, q, v, ap, A = calc(theta)
|
||
max_cv = max(max_cv,abs(dot(q,v)))
|
||
max_ca = max(max_ca,abs(dot(q,ap)+dot(v,v)))
|
||
qe = [math.cos(1),math.sin(1)]
|
||
ve = [-math.sin(1),math.cos(1)]
|
||
ae = [-x for x in qe]
|
||
errors = [math.hypot(*[x[i]-y[i] for i in range(2)]) for x,y in ((q,qe),(v,ve),(ap,ae))]
|
||
return *errors, max_cv, max_ca
|
||
|
||
for variant in ('naive','weighted_mass','physical','moving_null'):
|
||
print(variant)
|
||
previous = None
|
||
for k in range(5,11):
|
||
h = 2**(-k)
|
||
errors = moving_null(h) if variant == 'moving_null' else scalar(h,variant)
|
||
order = math.log(previous/errors[0],2) if previous else float('nan')
|
||
print(f'h={h:.9g} errors='+','.join(f'{x:.10e}' for x in errors)+f' pU={order:.6f}')
|
||
previous = errors[0]
|
||
```
|
||
|
||
Newton correction cutoff `1e-14`는 이 독립 double-precision probe의 반복 종료값이다. Solver convergence 또는 reference acceptance tolerance로 채택하지 않는다. 미세 h의 acceleration 오차에는 displacement 차분의 roundoff가 포함되므로 표의 관측값을 정확한 수학 상수로 해석하지 않는다.
|
||
|
||
<a id="numerical-review-probes--후속-full-cartesian-moving-null-검산"></a>
|
||
### 후속 full Cartesian moving-null 검산
|
||
|
||
추가 Numerical 작업에서 메인이 full_coordinate_probe.py(당시 경로: `../../.harness/build/hht-numerical/full_coordinate_probe.py`, 현재 checkout에 없음)를 작성했고 수치 검토자가 residual/Jacobian 식을 읽고 아래 명령을 재실행했다. Exit `0`, 2026-09-22. 이 script는 ignored build evidence이며 FESA source가 아니다. 위 angle-reduced probe와 달리 q의 두 Cartesian 성분을 직접 Newton으로 풀며 radial projection·normalization을 하지 않는다. 같은 `x=q/|q|` 모델의 exact 2×2 Jacobian을 사용한다.
|
||
|
||
```powershell
|
||
python .harness/build/hht-numerical/full_coordinate_probe.py
|
||
```
|
||
|
||
오차는 각 h의 **모든 시점**에서 q/v/physical a의 2-norm 최대다. 앞 절의 종단 오차와 다른 측정량이다.
|
||
|
||
| h | max q error | max v error | max physical a error | 직전 h 대비 q/v/a 차수 |
|
||
| --- | ---: | ---: | ---: | --- |
|
||
| 1/128 | 6.4948801161e-6 | 6.6395874231e-6 | 1.2690547915e-5 | 1.99932 / 1.99962 / 2.01024 |
|
||
| 1/256 | 1.6240799623e-6 | 1.6601117645e-6 | 3.1667175260e-6 | 1.99968 / 1.99981 / 2.00269 |
|
||
| 1/512 | 4.0606299832e-7 | 4.1505196280e-7 | 7.9259171465e-7 | 1.99985 / 1.99992 / 1.99834 |
|
||
|
||
마지막 grid의 최대 `||q|-1|=2.22045e-16`, `|q·v|=8.39836e-11`, `|q·a+v²|=7.91118e-7`. 상쇄 전 `Ma`의 entry products·c·f_int를 사용한 최대 normwise residual은 `7.94824e-11`, Newton 최대 3 corrections, 마지막 correction 최대 `4.00220e-16`이었다. 이 probe의 종료는 correction `<=1e-13`이며 N2의 모든 AND gate를 구현한 solver가 아니다. 위 관찰을 N2–N7 전체 통과나 실제 shell 통과로 확대하지 않는다.
|
||
|
||
별도 trial `q=(.85,.52)`, predictor `(.83,.50)`, velocity predictor `(-.35,.71)`, old physical a `(-.7,-.3)`, h=.1, direction `(.6,-.8)`의 exact effective Jacobian을 중앙차분했다. N5의 j=8,10,12,14,16,18,20 순서에서 상대 오차는 `[3.13656e-5,1.96035e-6,1.22522e-7,7.65779e-9,4.77929e-10,3.25134e-11,1.04250e-11]`이다. 연속한 내부 sweep 점 j=12/14 등이 `1e-6`을 만족한다. 이는 이 2D trial/direction에 대한 미분 evidence이며 shell D3 oracle를 대체하지 않는다.
|
||
|
||
Full-coordinate 결과는 새로운 [C04b](verification-cases.md)의 moving-null 구조와 max-time 측정을 지지한다. C04b의 전체 prescribed grids, 초기화 실패 mutation, regularity·scale·반복오차 분리 등 모든 판정을 실행한 것은 아니다. 더 미세한 h에서 residual이 증가할 수 있으므로 h=1/1024까지 같은 residual 기준으로 통과했다는 주장을 하지 않는다.
|