181 lines
15 KiB
Markdown
181 lines
15 KiB
Markdown
# Hex8 계산 정밀도와 검증에서 확인한 점
|
|
|
|
현재 완료 여부는 [PRD](PRD.md)의 checklist가 소유한다. 아래 기록은
|
|
[정식화](formulation.md)와 [수치 기준](numeric-controls.md)을 바꾸지 않고
|
|
계산 정밀도를 개선한 근거다. 내부 검사 통과와 원본 동적 모델의 수렴은 구분한다.
|
|
|
|
## 작은 변형률에서 단위행렬을 빼지 않는다
|
|
|
|
`E=(F^T F-I)/2`를 그대로 계산하면 작은 변형률에서 유효 숫자를 잃는다.
|
|
`H=grad(u)`로부터 `E=sym(H)+H^T H/2`를 계산하면 같은 Green 변형률을
|
|
단위행렬 차감 없이 구한다. StVK 재료식, 에너지, Cauchy 응력과 접선은 유지한다.
|
|
|
|
탄성계수 `2.1e11`, Poisson 비 `0.3`인 직육면체의 signed affine stretch
|
|
`±1e-10`, `±1e-8`에서 독립 응력·에너지·면 traction 적분으로 기존 오류를
|
|
재현했다. 수정 `7d191036`은 요소 검사 27개와 독립 수치 검토를 통과했다.
|
|
비선형 동적 원본의 첫 증분 잔차 비율은 약 `1.42e-5`에서 `6.02e-10`으로
|
|
줄었지만, 승인된 `1e-10` 기준은 여전히 충족하지 못했다.
|
|
|
|
## 곱셈, 합산, 변위 차감의 오차를 각각 보존한다
|
|
|
|
강체 병진을 제거한 상대변위로 내력을 계산해도 큰 항들이 상쇄되는 행에서는
|
|
계산 순서의 영향이 남는다. 원본 선형 동적 사례의 두 요소 행에서 local 곱의
|
|
절댓값 합은 각각 약 `3.63e6`이었고, FMA 곱셈 잔여와 보상 합산으로 복구한
|
|
내력 차이의 합은 `8.20e-10`이었다. 당시 전체 잔차 `9.06e-10`과 같은 크기였다.
|
|
|
|
수정 `c50e68e`는 캐시된 K0를 그대로 두고 상대변위와의 곱셈·합산을 보상한다.
|
|
수정 `8153796`은 절점 변위 기울기 및 비선형 `sum(w*P*G)`에도 같은 보상을
|
|
적용한다. 각각 관련 검사 60개와 독립 수치 검토를 통과했으나 동적 원본은 실패했다.
|
|
기울기·내력·에너지·접선은 같은 trial의 물리식을 사용한다.
|
|
|
|
작은 절점 변위의 갱신은 입력 double에서 표현 가능해도, 더 큰 기준 절점 변위를
|
|
뺀 상대변위에서는 소실될 수 있다. 수정 `8ccd1b2`는 TwoDiff로 차감의 잔여를
|
|
보존하고, 상대변위의 두 부분을 내력·기울기·선형 에너지 계산에 함께 사용한다.
|
|
독립 정확 유리수 검산의 유한 차이 125,039쌍에서 불일치가 없었고, 관련 native
|
|
검사 60개와 독립 수치 검토도 통과했다. 이 검산은 native solver 검증을 대체하지
|
|
않으며, 입력 자체의 반올림으로 잃은 값을 복원한다는 의미도 아니다.
|
|
|
|
## 수렴 정체와 허용치 변경을 구분한다
|
|
|
|
위 수정 후 선형 동적 원본은 첫 증분을 5회 solve, 잔차 비율 `9.54e-11`로
|
|
수용했다. 두 번째 증분은 100회에서 `1.01993e-10`으로 실패했다. 실패 좌표의
|
|
직전 적용 보정량은 약 `-0.496 ULP`여서 저장된 변위를 바꾸지 못했다.
|
|
100회 종료 지점에서는 다음 solve를 하지 않으므로 이 값으로 다음 Newton 갱신을 추론하지 않는다.
|
|
비선형 원본도 첫 증분에서 약 `1.35e-10`으로 실패했다.
|
|
|
|
이는 전체 원본 검증 완료의 근거가 아니다. 물리 잔차의 component별 원래 Si,
|
|
correction, update 및 max100 기준을 유지하면서 표현 가능한 변위에서 추가
|
|
정제가 가능한지 확인해야 한다. 예측 잔차는 trial 선택에만 사용할 수 있고,
|
|
수용은 실제 rates·형상·내력·복구·모든 free 성분의 원래 판정으로 수행해야 한다.
|
|
원본·허용치를 보정하거나 실패한 candidate를 accepted history에 넣지 않는다.
|
|
|
|
## 잔차 점수만으로 Newton 갱신의 정체를 판단하지 않는다
|
|
|
|
각 trial의 `abs(r_i)/Si`는 최종 수렴 판정에 사용하지만, 그 최대값이 증가했다고
|
|
갱신이 정체된 것은 아니다. 작은 강체 운동 사례에서 한 성분의 잔차는 약
|
|
`9.88e-24`에서 `3.17e-25`로 줄었으나 Si가 더 빠르게 줄어 비율은 증가했다.
|
|
이 갱신을 한 좌표의 ULP 정제로 대체한 구현은 기존 축·하중 크기 회귀에서 실패했다.
|
|
현재 failing 성분의 Si를 고정한 별도 점수도 다른 축의 유효한 갱신을 가로막았다.
|
|
|
|
완전한 변위가 반복되더라도 다음 반복의 정제 대상 자유도가 바뀌면 계산은 더
|
|
진행될 수 있다. 따라서 정체의 근거에는 실제 변위와 정제 대상의 변화가 모두
|
|
필요하며, 잔차 점수의 왕복만으로 전체 상태의 반복을 추론하지 않는다.
|
|
최종 수용에서는 여전히 실제 모든 free 성분의 원래 Si와 수렴 기준을 검사한다.
|
|
변위와 직전 solve mask만 비교한 수정 `1063abc`는 관련74개 검사를 통과했지만
|
|
두 동적 원본은 세 번째 증분100회에서 실패했다. 선형 잔차 비율은 `2.10874e-8`,
|
|
비선형은 `9.99819e-8`이었다. 이 실패 행의 전체 내력 보상 합산 차이는0이고,
|
|
관성력 보상 차이는 약 `1e-17`이므로 해당 실패를 합산 오차만으로 설명하지 못한다.
|
|
|
|
동일 구현에 동작을 바꾸지 않는 계측을 추가하고 실제 반복 상태를 저장했다.
|
|
선형은 다음 반복14의 상태가 진입11과, 비선형은20이18과 정확히 같았다.
|
|
전체 변위1326개·진입 시 holding mask1275개·incoming correction metric4개의
|
|
유한 값이 모두 일치했고 그 구간의 실제 ULP 이동은0건이었다. 기존 두 상태
|
|
판별은 false였으며 prospective physical gate도 FAIL이었다. 독립 검토가 계측과
|
|
원시 배열을 대조했고, 독립 Python 검산은 exit0이었다. 진단 실행 두 건은 각각
|
|
native exit1로 자연 종료했으며 원본 solver PASS의 증거가 아니다.
|
|
|
|
고정 증분에서 이전 accepted state·M·하중·predictor가 고정되고 fresh solve와
|
|
탄성 local recovery가 결정적일 때, 재현되는 반복 상태는 전체 변위·reactivation 전
|
|
holding mask·incoming correction4개다. 다음 상태는 실제 fresh Newton 변위·freeze 후
|
|
mask·fresh correction4개로 비교해야 한다. History는 증분 시작과 실제 ULP 적용 후
|
|
초기화하고, physical FAIL 및 finite correction PASS 진입만 보관한다. Prospective
|
|
physical PASS는 정상 Newton 경로를 유지한다. 이 한정된 판별 수정 `b394ae7`은 관련75개
|
|
검사와 독립 코드 검토를 통과했다. 7개 판별 조건을 각각 제거한 behavior mutation도
|
|
native build0/CTest8로 실패를 검출했다. 기존 수렴 기준·100회 제한·최종 수용은 유지한다.
|
|
|
|
동일 immutable binary의 두 원본 실행은 여전히 세 번째 증분100회에서 native exit1로
|
|
실패했다. 선형은419.360초, 잔차 비율 `7.21125e-9`, 비선형은431.045초,
|
|
`1.27770e-8`이었다. 선형95번째 반복의 ULP 이동은 실제 점수를 `7.21125e-9`에서
|
|
`4.66385e-9`로 낮췄으나 뒤의 정상 Newton 갱신에서 다시 증가했다. 이는 각 정제의
|
|
국소 감소가 전체 갱신 과정의 진전을 보장하지 않는다는 증거이며, 전체 변위가 같은
|
|
상태로 복귀했다는 증거는 아니다. 비선형의 잔차 점수 왕복도 전체 상태 반복의 증거가 아니다.
|
|
|
|
Incoming correction4개의 실제 수치는 정상 Newton의 rates·tangent·rhs에 사용하지 않으며,
|
|
유한 값과 PASS 여부가 수용에 쓰인다. 추가 계측에서 선형 진입20→다음23, 비선형72→80은
|
|
각각 같은 순수 Newton 구간의 전체1326개 변위·1275개 mask가 정확히 같았으나 correction
|
|
숫자4개는 달랐다. 모두 finite/PASS이고 prospective physical FAIL이었으며 기존 판별은
|
|
false였다. 선형 진입23→다음30은 실제 ULP 이동을 사이에 두고 변위·mask·correction
|
|
숫자까지 같았지만 history 초기화로 판별하지 못해 정상 Newton이 적용되는 경로였다.
|
|
독립 검토와 원시 배열 Python 검산 exit0으로 두 조건의 영향을 확인했다. 비선형에서
|
|
ULP를 사이에 둔 복귀는 입증하지 않았으며 전체 혼합 알고리즘의 주기 반복도 주장하지 않는다.
|
|
|
|
수정 `f661864`는 고정 증분 전체의 적격 실패 진입을 유지하고, 실제 변위·mask와 각각의
|
|
finite correction PASS로 동등성을 판별한다. Correction 숫자의 차이는 진단으로 유지한다.
|
|
관련76개 검사는 native build/CTest0이며 독립 검토를 통과했다. 실제 Hex8 사례의
|
|
history 초기화 재삽입은 두 번째 증분100회 실패를 만들었다. 숫자 일치 재삽입은
|
|
두 helper 검사의 assertion 실패를 만들었다. 올바른 원본을 복원하고 실제 object를
|
|
재컴파일한 뒤 최종 회귀를 수행했다.
|
|
이 재현은 질량이 지배적인 작은 문제의 제어흐름 검사이며 원본 conditioning 해결의 증거가
|
|
아니다. 원래 gates·100회 제한은 유지한다.
|
|
|
|
동일 immutable binary의 원본101개 endpoint 검사 두 건은 다시 세 번째 증분100회에서
|
|
native exit1로 자연 종료했다. 선형408.202초의 잔차 비율은 `1.7773871030665027e-8`,
|
|
비선형416.052초는 `8.7357210799572219e-9`다. 최신 실패 행의 전체 내력 보상 합산 차이는
|
|
0이고 관성력 차이는 약 `1e-17`이다. 최종 다섯 반복에서 전체 변위와 mask는 계속 바뀌므로
|
|
잔차 점수만으로 정확한 전체 상태 반복을 추론하지 않는다. 새 판별의 내부 검증과 실제 원본
|
|
수렴은 구분해야 하며, 원본 conditioning·local 계산 또는 결합 좌표의 표현 가능성을 더
|
|
분석해야 한다. 실패한 state를 통합 완료나 reference PASS로 표시하지 않는다.
|
|
|
|
추가 원시 proof와 검산은 로컬 `.harness/hex8-evidence/t6-independent-semantic/`에,
|
|
수정·mutation·최종 회귀 로그는 별도 구현의
|
|
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/`에 보존한다. 선형 진단은 닫힌 proof 검토
|
|
후 명시적으로 중단했고 비선형 진단은 native exit1로 자연 종료했다. 둘 다 solver PASS가 아니다.
|
|
|
|
재현 가능한 원시 tuple 검산과 SHA256은 로컬 evidence
|
|
`.harness/hex8-evidence/t6-independent-tuple/check-v3.py` 및 `v3-check-result.json`에
|
|
보존했다. 원시 진단과 native 실패 로그는 별도 구현의
|
|
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/tuple-trace3/`에 있다.
|
|
|
|
명령·native exit·실패 로그는 해당 source와 함께 보존한다. 최종 통합 및 외부 비교
|
|
결과는 이후 verification 기록에서 이 개발 중 실패와 구분한다.
|
|
|
|
## 고정한 실패 상태에서 산술 오차와 갱신 소실을 구분한다
|
|
|
|
`f661864`의 terminal 상태를 관찰하는 별도 실행은 원래 계산식을 그대로 두고 각300개
|
|
reference cache·native response와 전체 state/M/Kt를 저장했다. 두 실행은 native exit1로
|
|
자연 종료했으며 원래 출력한 수치 trace와 일치했다. 계측은 byte 단위로 복원하고 재빌드했다.
|
|
원래 실행은 full terminal 변위를 저장하지 않았으므로 두 실행의 전체 변위 일치를 주장하지
|
|
않는다. 수집한 local 변위/scatter·전역 내력·M*a/M*A·r/Si는 모두 정확히 재조립됐고,
|
|
독립 Fraction 검산 두 건은 Python exit0이며 다른 검토자가 원시 계수로 재계산했다.
|
|
|
|
이 검산은 관찰한 binary64 계수를 고정한 정확한 다항식 계산이다. 이상적인 geometry나
|
|
원본 solver 동등성, 표현 가능한 해의 존재/부재를 증명하지 않는다. 선형 cached K dot의
|
|
실행 오차는 `+5.82e-13`으로 해당 행의 허용 잔차 `1.49e-11`보다 작았다. Cached G로
|
|
operator를 다시 구성하면 내력이 `-3.78e-10` 달라지지만 잔차는 여전히 `2.27e-9`다.
|
|
비선형의 고정밀 내력은 `+5.52e-11` 달라져 잔차를 `4.11e-10`에서 `4.66e-10`으로
|
|
키웠다. H의 high/low collapse 오차는 존재하지만 이 실패를 산술 정밀도만으로 해결할
|
|
근거는 없다. Operator 형성 차이와 runtime dot 오차를 혼동해 force만 교체하지 않는다.
|
|
|
|
저장한 PRE holding mask를 현재 물리 기준으로 reactivate한 뒤, 같은 순서의 rounded
|
|
Keff와 old residual을 포함한 weighted RHS를 별도 SuperLU로 풀었다. 정확한 방정식 잔차
|
|
비율은 두 건 모두 약 `2e-16`이다. 선형102개 active 보정은 모두 저장된 변위를 바꾸지
|
|
못했고, 비선형81개에서는9개 변위가 바뀌고 실패 좌표71개 보정이 소실됐다. 이는 독립
|
|
backsolve의 관측이며 production PARDISO의 현재 fresh 방향이나 actual trial PASS가 아니다.
|
|
직전 적용 보정량과 이번 fresh 방향을 구분해야 한다.
|
|
|
|
Weighted R=0의 physical target은 `alpha*r_old/(1+alpha)`다. 비선형 실패 행에서 이 값의
|
|
크기 `2.60e-11`은 현재 허용 잔차 `4.70e-12`보다 크다. 현재 최종 조건은 weighted R=0을
|
|
요구하지 않으므로 이것만으로 계약 충돌이나 수치적 불가능성을 선언하지 않는다. Old residual을
|
|
버리거나 물리 가속도를 다른 정의로 바꾸는 근거도 아니다. 다음 후보는 실제 native
|
|
rates·geometry·모든 원래 Si·update·weighted identity로 검증해야 한다.
|
|
|
|
같은 고정 상태의 native replay는 실제 Hex8 kernel·rates·하중과 저장 CSR을 사용했다.
|
|
먼저17자리 십진 문자열로 저장한 값을 Float64로 복원하고, 재계산한 전체 변위·속도·
|
|
두 가속도 배열 및 predictor·하중·내력·관성력·r/Si·최대 점수가 저장 값과 정확히
|
|
일치하는지 확인했다. 저장 CSR의 재생이며 독립적인 M/Kt 재조립 검증은 아니다.
|
|
RF는 저장되지 않았으므로 constrained residual/free0의 파생 identity만 확인했다.
|
|
TEMP 검사는 원래 파일과 byte 단위로 복원하고 실제 object를 재컴파일했다.
|
|
|
|
Native PARDISO의 현재 fresh solve도 선형102개 보정이 모두 변위를 바꾸지 못했다.
|
|
비선형은81개 active 좌표에서9개 변위가 바뀌고71개 실패 좌표의 보정이 소실됐으며,
|
|
최대 잔차 비율은 `8.73572e-9`에서 `1.27770e-8`로 커졌다. 정확 산술로 예측한 상위8개
|
|
단일 ULP 후보를 각각 실제 계산한 최선 비율은 선형 `4.75888e-9`, 비선형 `6.73857e-9`다.
|
|
두 fresh Newton 및16개 ULP trial 모두 원래 physical limit `1e-10`에 실패했다.
|
|
다른 update·weighted identity·correction·geometry 검사는 통과했다. Native exit0인 두
|
|
replay 검사는 관측 재현 검사의 성공이며 원본 수렴이나 accepted history의 성공이 아니다.
|
|
단일 이웃의 실패만으로 여러 좌표를 함께 움직이는 해의 부재를 추론하지 않는다.
|
|
|
|
원시 capture·정확 산술·backsolve·이웃 예측·native replay의 재현 자료와 독립 raw 검산은
|
|
로컬 `.harness/hex8-evidence/t6-independent-frozen/`에 보존한다. 기능 checklist는
|
|
그대로 미완료다.
|