케이블이 메아리친다 · 계산 성공을 검증 완료와 구분한다 · 이론
계산 성공을 검증 완료와 구분한다
한 줄 요약
계산기의 종료 코드 0은 답이 맞다는 뜻이 아닙니다. 회로 조건·파형·분석 코드·모델의 한계가 함께 연결돼야 다른 사람이 결과를 다시 검토할 수 있습니다.
왜 이게 필요했나
아름다운 그래프를 얻었습니다. 하지만 전파 시간을 두 배로 잘못 입력했거나 어제 만든 CSV를 읽었다면 그래프는 잘못된 회로를 충실히 보여 줍니다. 프로그램이 끝났다는 사실과 원하는 질문에 답했다는 사실 사이에는 간격이 있습니다. 이번 모듈은 그 간격을 시험과 파일 근거로 메웁니다.
“종단 저항을 넣었다”는 주장에도 누락이 생깁니다. 같은 파일 이름으로 저장한 이전 파형, 단위 없는 시간 열, 입력 전압을 빠뜨린 표, 공차 조합 하나가 없는 요약은 재검토를 어렵게 합니다. 마지막 과제는 문장을 길게 쓰는 보고서가 아니라 어떤 모델·코드·데이터를 사용했는지 확인할 수 있는 작은 연결 목록입니다.
어떻게 동작하나
실습의 생성기는 JSON의 수치만 받아 고정된 ngspice netlist를 만들고 실제로 실행합니다. model.cir에는 회로, trace.csv에는 time_s·drive_v·tx_v·rx_v 네 열, run.json에는 입력 모델·표본 수·수신 최대값·파일 해시가 저장됩니다. 전원 입력 열도 있어야 잘못된 입력과 출력 회로 문제를 구분할 수 있습니다.
시간 간격은 단순한 그래프 해상도 설정이 아닙니다. 수치 계산이 에지와 변화를 얼마나 촘촘히 따라가는지에 영향을 줍니다. 실습에서는 직렬 종단 모델을 최대 시간 간격 0.02ns와 0.01ns로 각각 실행합니다. ngspice는 필요한 위치에 추가 표본을 둘 수 있으므로 두 CSV의 행 번호가 같은 시각을 뜻한다고 가정하면 안 됩니다.
비교 규약은 거친 파형의 모든 시각에서 세밀한 파형을 선형 보간하고, TX와 RX 전압 차이의 절댓값 중 최댓값을 구하는 것입니다. 입력 열은 이 함수의 비교 대상에서 제외합니다. 두 파형의 시간은 오름차순이고 시작과 끝이 같으며 최소 두 점이 있다고 가정합니다. 바깥 범위로 외삽하지 않으며 반환 단위는 V입니다.
간단한 예를 생각해 봅시다. 세밀한 파형이 1초에 1V, 3초에 3V이면 2초 값은 선형 보간으로 2V입니다. 거친 파형의 2초 표본이 2.1V라면 그 지점 차이는 0.1V입니다. 행 번호끼리 비교하면 2초 값을 3초와 맞춰 0.9V 차이라고 잘못 판단할 수 있습니다. 실제 실습은 ns 규모지만 보간 방법 자체는 같습니다.
간격을 줄였더니 차이가 작아지는 것은 수치적으로 유용한 근거입니다. 그러나 두 번 모두 같은 잘못된 모델을 계산했다면 서로 일치할 수 있습니다. 그래서 채점기는 새 solver 실행과 비교하는 것 외에도 별도 반사 점화식으로 첫 세 평탄부를 확인합니다. 독립 기준도 여전히 같은 이상적 선로 가정을 쓰므로 실물 정확성을 보증하지는 않습니다.
파일 해시는 또 다른 질문에 답합니다. “이 결과가 맞는가?”가 아니라 “검토한 파일이 그 파일인가?”입니다. SHA-256 문자열은 파일 내용이 바뀌면 달라지지만, 틀린 회로도 자기 해시를 가질 수 있습니다. 따라서 trace.csv를 수정하고 run.json의 해시까지 새로 계산하는 것만으로 올바른 실험이 되지 않습니다. 채점은 파일 내용과 실제 회로 응답도 비교합니다.
최종 release.json에는 model_type을 ideal_single_mode_lossless로, measured와 pcb_certified를 false로, target_verification_required를 true로 씁니다. 이는 면책용 장식이 아니라 수행 범위의 명시입니다. 수치 실험을 실제 계측이라고 부르거나, 전송선 예제 통과를 PCB 전체 인증으로 바꾸지 않기 위한 필드입니다. 실물 검증은 이후 별도의 실험으로 증명해야 합니다.
sha256 객체는 단계 카드가 지정한 상대 경로를 키로 사용합니다. 파형·실행 보고서·입력 JSON·Python 분석·공차 최대값 목록을 연결합니다. 절대 경로를 키로 바꾸거나 백업 파일까지 임의로 넣으면 약속한 보고서 형식과 달라집니다. 분석 코드를 수정했다면 결과를 다시 확인한 뒤 마지막에 해시를 재작성해야 합니다.
현장에서 만나는 모습
이번 실습은 기본 셸 명령과 Python의 함수·리스트·딕셔너리를 사용할 수 있는 학습자를 대상으로 합니다. mkdir로 작업 폴더를 만들고, JSON 수치는 따옴표로 감싸지 않습니다. csv.DictReader가 반환하는 값은 문자열이므로 float로 바꿔야 계산할 수 있습니다. 파일 이름·함수 인자·반환 키를 먼저 맞추면 형식 추측에 시간을 쓰지 않을 수 있습니다.
분석 함수에는 화면 출력 대신 반환값을 사용합니다. 채점기는 다양한 입력을 새 프로세스로 전달하고 JSON 결과를 읽기 때문에 디버그 print가 섞이면 결과 형식이 깨집니다. NaN이나 무한대는 허용하지 않습니다. 함수 실행은 CPU·메모리·시간·출력 한도가 있으며, 무한 루프는 정답이 아니라 실행 실패로 알려 줍니다. 이 한도는 수강 시간과 다른 제한입니다.
회로 생성기의 출력 폴더는 새 이름이어야 합니다. 이전 결과를 보존하려고 같은 폴더 덮어쓰기를 거부합니다. 정답 보기를 재실행하면 기존 파일이나 폴더는 previous가 붙은 별도 이름으로 보관하고 새 결과를 만듭니다. 필요한 비교를 끝낸 뒤에는 어떤 파일을 제출 대상으로 삼았는지 다시 확인하세요. 백업이 있다고 세션 종료 후에도 보존되는 것은 아닙니다.
실습 예상 시간은 75분입니다. 기본 세션 60분이 끝나기 전에 +시간으로 연장해야 하며 최대 180분입니다. 이론을 읽는 시간과 실습 시간을 구분하고, 종료 전에 소스와 보고서를 자신의 저장 장소로 복사해 두세요. 파드에는 영구 저장 볼륨이 없으므로 종료 뒤 터미널 파일을 복구할 수 없습니다. 실제 장비 연결이나 외부 패키지 설치는 필요하지 않습니다.
다음 실습에서 할 것
기준 파형 생성, 임계 전압 도착 시각, 반사식 구현, 직렬 종단, 병렬 종단과 전력, 아홉 공차 조합, 시간 간격 비교, 최종 근거 보고서를 차례로 완성합니다. 중간 단계에서는 다음 단계가 아직 통과하지 않는 것이 정상입니다. 마지막 채점은 앞 단계 파일까지 다시 확인하므로 숫자만 적은 보고서로 대신할 수 없습니다.