2011년 4월 30일 토요일

근의 공식

일과 관계되는 일로 4차 방정식의 근을 해석적인 방법으로 구해야 했다.

4차방정식의 해를 구하는 방법은 어디든지 나와있으므로 그것을 구현하는데에는 별 문제가 없었다. 문제는 답이 이상할 때 찾아온다. 정확하지 않은 속도는 쓸모가 없는 법이다.

4차방정식의 근의 공식을 입으로 설명하자면 이렇다. 맨 먼저 수평이동을 시켜서 3차항의 계수가 0이 되도록 만든다. 그런 다음에 좌변을 x제곱에 대한 완전제곱식을 만들어 주는 성분만 남기도 나머지는 다 우변으로 이항한다. x의 1차항은 우변으로 이동한다.

이제 새로운 변수 z를 도입한다. 양 변에 2z(루트좌변) + z제곱을 더하면, 새 좌변은 (루트좌변 + z)제곱의 형태가 되어 완전제곱을 유지한다. 아까 좌변을 완전제곱으로 만들었으므로, 루트좌변은 x에 대한 2차식이다. (말하자면 a제곱에 2az +z제곱을 더해서 (a+z)제곱으로 만든거다.) 새 우변은 (우변) + 2z(루트좌변) + z제곱의 모양을 가지게 된다. 이것이 x에 대한 완전제곱의 형태가 되게 하는 z의 값을 구하면, 원래의 방정식을 완전제곱끼리의 등식이 되도록 만들 수 있다.

어떤 식이 완전제곱이 되는 조건은 판별식이 0인 경우이다. 새 우변은 (우변)이 x의 1차식, (루트좌변)이 x의 2차식이다. 결과적으로 새 우변의 판별식은 z에 대한 3차식이다. 따라서 우리는 x에 관한 4차 방정식을 풀기 위해 z에 대한 3차 방정식을 풀어야 한다.

3차방정식의 해를 구하는 과정 역시 맨 먼저 수평이동을 통해 2차항을 계수를 0으로 만드는 것에서 시작한다. 그 방정식의 해를 (a+b) 의 형태로 분해하고, 항등식( (a+b)세제곱 = a세제곱 + 3ab(a+b) + b세제곱)과 비교하면, (a세제곱+b세제곱)과 3ab가 가져야 할 값이 결정된다. 아까 2차항을 0으로 만들었기 때문이다. 이것은 2차방정식의 근과 계수와의 관계를 연상시킨다. 실재로 a세제곱과 b세제곱을 두 근으로 하는 2차방정식을 만들고, 2차 방정식의 공식을 통해 구할 수 있다. 그런 다음에 각각에 세제곱근을 씌워서 더하면 그것은 3차방정식의 한 해가 된다. 단, 맨 처음 했던 수평이동만큼 되돌려 놓는 것을 잊으면 안된다.

이렇게 z를 구하면, 우리는 맨 처음 주어졌던 4차방정식을 완전제곱 = 완전제곱의 형태로 쓸 수 있게 되었다. 부호를 달리 해서 두개의 방정식을 만들 수 있다. 단 좌변은 x제곱에 대한 완전제곱식이고, 우변은 x에 대한 완전제곱식이므로, 각각의 방정식은 x에 대한 2차 방정식이 되고, 해가 다시 2개씩 있으므로, 우리는 모두 4개의 해를 얻게 된다.

이로서 4차방정식을 풀 수 있다. 도저히 간단하게는 설명이 되지 않는구나.

이 과정 어디에선가 문제가 생겼던 것이다. 전개하는 과정에서 계수를 구하는 데에 실수를 하지 않았나 꼼꼼하게 다시 계산했지만, 그런 것은 아니었다. 범인을 추적한 결과, 3차 방정식의 근을 정확히 구하지 못한다는 것을 알아냈다. 앞서 본 대로 두 세제곱근을 더한 것이 해인데, 이것이 잘못 구해지고 있었다. 하지만, 각각의 세제곱근은 완전히 정확했다. 최소한 최종결과에서 볼 수 있는 오차를 설명할 수는 없었다.

위키에는 3차방정식의 근을 이루는 두 성분, 앞에서 말한 a와 b를 구하는 방법을 조금 다르게 설명하고 있었다. 일단 하나의 세제곱을 구하면, 나머지는 별도의 세제곱근을 계산하는 것이 아니라, 두 근의 곱이 가져야 할 조건으로부터 간단하게 나누기를 통해 값을 구했다. 이 방법을 적용하자, 결과가 정확하게 나왔다.

억울해서 이유를 좀 더 따져봤다. 새 방법은 정확한데다가 계산도 적게하기 때문이었다. 고생은 더 했는데, 결과는 별로일 때 처량해지는 법이다. 이유는 생각보다 단순했다. 어떤 수의 세제곱근은 세 개 있기 때문이었다. 2의 제곱근은 둘일지라도, 루트 2는 하나밖에 없다. 그런데 내가 쓰는 프로그램은 세제곱근을 계산하는 cbrt()같은 함수는 없다. 그래서 (숫자)^(1.0/3.0)을 이용했다. 세제곱근은 3개이지만, 컴퓨터는 지가 편한 것 하나만 출력한다.

a의 세제곱근은 사실 a1, a2, a3 세 개가 있고, b에 대하여서도 마찬가지이다. 앞서 설명했지만 이렇게 구한 a세제곱근과 b세제곱근의 곱은 어떤 값과 같아야 한다. 그런데 예를 들자면, a1과 b2의 곱은 그러지 못하다. 구체적으로 이야기하자면, 1의 세제곱근은 1, -1/2+루트3/2i, -1/2-루트3/2i 가 있다. 1 곱하기 1의 세제곱근이 1이라고 해서, 세제곱근 끼리의 곱인 ((-1/2+i루트3/2) 곱하기 (-1/2-i루트3/2))가 1이 되지는 않는 것이다. 컴퓨터가 편한대로 출력하는 값들이 이러한 조합이었던 것이다.

고차방정식의 근의 공식을 정리해 볼 수 있는 좋은 기회였고, 컴퓨터를 이용하여 그 근을 구할 때 조심해야 할 바를 배울 수 있었다. 최종적으로 결과가 향상되어 기분이 좋았다. 또한 (숫자)^(1.0/3.0) 과정에 수치계산상의 오차 때문에 결과가 이상하다고 여겨왔던 내 오해가 풀렸다.

댓글 없음:

댓글 쓰기