수치해석 (Numerical Analysis)

해밍은 수학자였다. 처음에는 장학금 때문에 시작했을지 몰라도 결국 그는 수학박사 학위까지 받았다. 그러므로 그의 경력이 숫자를 다루는 일에 초점을 맞추어져 있었던 점은 놀랍지 않다.

그가 수학박사 학위를 받은 해인 1942년은 아직 전자식 컴퓨터가 세상에 모습을 드러내기 전이었다. 따라서 그가 1945년에 맨해튼 프로젝트에 발을 담갔을 때는 컴퓨터 프로그래밍 경험이 전혀 없었다고 보아도 무방하다.

맨해튼 프로젝트에서 그의 역할은 물리학자들이 작성한 방정식의 답을 구하는 프로그램을 작성하는 일이었다. 그 쟁쟁한 물리학자들이 컴퓨터를 붙들고 씨름할 시간을 덜어주는 사람이었다. 그는 이 일에 적격이었을 것이다. 그는 고도의 수학 능력을 갈고닦았을 뿐만 아니라 박사 학위 주제도 맨해튼 프로젝트에 꼭 들어맞는 미분방정식 해법에 관한 것이었기 때문이다.

미분방정식은 현실의 물리 현상을 수식으로 모델링하다 보면 자주 도출된다고 한다. 포탄의 궤적에서부터 병균의 확산에 이르기까지 생각보다 많은 곳에서 등장한다. 그런데 문제는 이렇게 모델링을 통해 미분방정식을 도출하더라도 그 방정식의 답을 구하기는 쉽지 않다는 점이다. 아주 제한된 경우에 한해서만 명확하게 수식을 통해 답을 구할 수 있다. 그래서 어쩔 수 없이 추정치를 구하는 우회적인 방법을 쓰게 되는데 그중 하나가 수치해석이라는 방식이다.

수치해석은 반복적인 계산을 통해서 정답에 가까운 추정치를 구해나가는 것이 일반적이다. 그런데 방정식이 복잡하고 반복해야 하는 횟수가 많다면 사람의 손으로 하기에 벅차다. 물론 불가능하지는 않다. 사람이 아주 많으면 된다. 그래서 전자식 혹은 전자기계식 컴퓨터가 등장하기 전까지는 계산하는 사람​‡‡​들이 수작업으로 이런 계산을 했다.

물리학자들에게 전자식 컴퓨터의 등장은 새로운 돌파구였을 것이다. 엄두를 못 내던 미분방정식 계산을 해볼 수 있게 되었기 때문이다. 하지만 미분방정식의 수치해석을 컴퓨터 알고리듬으로 변환하는 일은 또 다른 영역이었다. 컴퓨터를 사용할 때는 메모리의 용량, 다룰 수 있는 수의 크기 등을 고려해야만 했다. 전자식 컴퓨터가 희귀한 자원이었으므로 자원을 낭비하지 않으려는 노력이 수반되었다.

해밍은 로스앨러모스에서는 핵폭탄 관련 모델링을 다루면서 편미분방정식의 해를 구하는 알고리즘을 프로그래밍했고​5​ 벨 연구소에서는 릴레이 컴퓨터를 사용하여 편미분방정식, 편미적분방정식, 상미분방정식 등을 프로그래밍했다. 따라서 그는 컴퓨터를 사용한 수치해석에 있어서는 선두 주자가 될 수 있었다. 후에 그는 과학자와 엔지니어를 위한 수치해석 교재를 출판하기도 했다.​6​


미분방정식의 해를 수치해석 방식으로 구할 때는 특정 구간domain을 정해 놓고 구하는 것이 일반적이다. 그리고 그 구간의 시작점이 가지는 값이 초기값으로 주어진다. 그러면 그 시작점에서 출발하여 구간 내에서 조금씩 이동하며 추정값을 구해나간다. 이런 방식에서는 결국 추정값을 얼마나 정답에 가깝게 구할 수 있느냐가 관건이 될 터인데 이를 위한 여러 가지 방법이 제안되어 왔다.

수학적인 입장에서만 본다면, 최대한 정답에 가까운 추정값을 구하는 것이 옳다. 하지만 컴퓨터 수치해석 입장에서는 조금 다르다. 공학적인 고려가 필요하다. 정답에 가장 가까운 추정값을 구하기 위해 너무 많은 메모리를 사용한다거나 계산량이 너무 많다면 현실적으로 사용하기 어렵기 때문이다.

해밍이 기여한 부분이 여기에 있다. 상미분방정식ordinary differential equation을 푸는 두 가지 방법이 선택지로 있었다. 하나는 룽게-쿠타 방법Runge-Kutta method이었고 다른 하나는 밀른 방법Milne method이었다. 방정식의 차수가 높은 경우에는(30 이상) 밀른 방법이 계산량이 적어서 컴퓨터에 사용하기 적합했다. 하지만 밀른 방법에는 결정적인 단점이 있었다. 계산 과정에서 ‘불안정성’을 야기할 수 있었다. 수치해석에서는 구간을 이동하면서 조금씩 답을 구하게 되는데, 이때 현재 구한 답이 다음 단계의 계산에 사용된다. 이 과정에서 현재 구한 답에 숨어 있는 오차가 다음 단계의 계산에서 더 확대된다면 결국 구간을 이동하면서 답을 구할수록 점점 정답에서 멀어지는 셈이 된다.​6​ 그래서 그는 밀른 방법처럼 계산량은 적으면서, 그렇지만 불안정성을 야기하지 않는 자신만의 방법을 제안했다.​7​ 이를 해밍 예측-보정법Hamming predictor-corrector라고 부른다. 이 방법은 한때 널리 사용되었으나 후에 다른 더 좋은 방법들에 의해 대체되었다.

튜링상이 인정했던 수치해석 연구는 여기까지이지만 해밍은 후에 디지털 필터 연구를 하면서 수치해석 방법에 또 다른 기여를 했다.

L2 인터프리터

해밍의 업적은 현장의 문제점을 해결하려 노력하는 가운데 나왔다는 점에서 주목할만하다. 그는 위대한 문제를 찾아다니는 사람이 아니라, 주변의 문제에서 뛰어난 결과를 만들어내는 사람이었다. 그가 인터프리터 개발에 손을 댄 이유도 거기에 있다.

1956년에 그는 루스 와이스(Ruth A. Weiss)와 함께 IBM 650용 L2 프로그래밍 언어를 개발했다. 그가 이 언어를 개발하게 된 직접적인 이유는 두 가지이다. 하나는 벨 연구소에서 컴퓨터 프로그래밍을 할 줄 아는 이들이 너무 부족했다. 가장 큰 이유는 프로그래밍이 너무 어려웠기 때문이었다. 어셈블리어를 사용한 프로그래밍은 똑똑한 사람들에게도 쉽지 않았다.

내가 보기에 벨 연구소는 기계어로 컴퓨터 프로그래밍을 할 수 있는 충분한 인력을 나에게 지원해주지 않을 생각임이 분명했습니다… 나는 서부로 가서 항공기 회사들에 아무 문제 없이 취직할 수 있는 상황이었습니다. 하지만 벨 연구소에는 멋진 사람들이 많았고 항공기 회사의 사람들은 그렇지 않았죠. 나는 오랜 시간 동안 “갈까 말까?”를 고민하면서 어떻게 하면 양쪽에서 가장 좋은 점만 취할 수 있을까 생각했습니다. 마침내 나는 나 자신에게 이렇게 말했습니다. “해밍. 너는 컴퓨터가 실제로 모든 일을 할 수 있다고 믿고 있어. 왜 너는 사람들이 직접 프로그램을 작성하도록 만들지 못하는 거니?” 처음에는 나에게 단점으로 보였던 것들이 결국 나로 하여금 아주 초창기의 자동 프로그래밍(고급 언어 프로그래밍을 의미)에 손을 대도록 만들었습니다.​8​

또 하나의 개발 이유는 IBM 650의 부동소수점 문제였다. IBM 650은 실수를 표현하기 위해 고정소수점 방식을 사용했다. 산술 연산에 사용하는 데이터에서 소수점 위의 값과 아래의 값을 표현하는 부분이 고정되어 있다. 예를 들어 산술 연산용 데이터가 8비트로 구성된다고 가정하고, 절반은 소수점 위의 값, 절반은 소수점 아래의 값을 표현한다고 정하면

00000000 -> 0.0
10101111 -> 12.15

와 같이 해석된다. 그런데 이렇게 되면 표현할 수 있는 숫자의 범위가 제한된다. 이에 비해 부동소수점은 숫자를 지수exponent와 가수mantissa로 표현한다. 예를 들어 산술 연산용 데이터가 8비트로 구성된다고 가정하고, 절반은 지수, 절반은 가수를 표현한다고 정하면

00000000 -> 0 x 20 = 0
10101111 -> 1.010 x 215 = 33095.68

와 같이 사용된다. 부동소수점은 더 넓은 범위의 숫자를 다룰 수 있는 반면, 가수mantissa에 들어가지 않는 부분은 결국 버려야 하므로 오차가 발생하는 단점이 있다.

미분방정식을 계산하던 해밍에게는 넓은 범위의 숫자를 다뤄야 할 필요성이 있었으므로 IBM 650의 기계어 구조는 적합하지 않았다.

나는 경험상 부동소수점 방식이 필요하다는 점을 알고 있었고 인덱스 레지스터(index register)도 필요했는데 IBM 650은 그걸 지원하지 않았습니다. IBM은 부동소수점 계산 서브루틴을 제공할 계획이라고는 했지만 내 마음에 차지 않았습니다. 그러다가 EDSAC의 프로그래밍에 관한 책의 부록 D에서 어떤 프로그램을 발견했습니다. 큰 프로그램이 작은 저장 공간에서 수행될 수 있게 해주는 프로그램이었는데 그것이 바로 인터프리터였습니다.​5​

그래서 그는 2개의 주소와 고정소수점을 지원하는 IBM 650 기계어의 한계를 극복하기 위해 3개의 주소와 부동소수점을 지원하는 L2 프로그래밍 언어를 설계하고 인터프리터를 만들었다. 그가 L2 프로그래밍 언어를 만들 때 정했던 원칙은 다음과 같다.

  • 배우기 쉬울 것
  • 사용하기 쉬울 것
  • 디버그(오류를 찾고 수정하기)가 쉬울 것
  • 서브루틴을 사용하기 쉬울 것

그가 만든 L2 프로그래밍 언어는 포트란 언어가 등장할 때까지 벨 연구소에서 널리 사용되었다.

1 2 3 4 5