매트랩 solve함수 관련.. solve함수가 정확한가요??
글쓴이: yjster / 작성시간: 목, 2014/07/10 - 4:31오후
현재 매트랩 소스를 C로 변환하는 작업을 하고 있는데
매트랩에서 solve에 원의 방정식을 두 개 넣어서 해를 구합니다.
원의 방정식 두 개를 연립해서 나온 해는 두 원의 교점인걸로 알고
C에서는 그냥 두 원의 교점 구하는 공식으로 작성했는데
매트랩 결과랑 C에서 결과랑 소수점 4~6자리까지만 같고 그 뒤론 다르더라구요
그래서 circcirc라고 매트랩에서 원의 교점구하는 함수가 있길래 이거도 비교해봤더니
이 함수 결과값은 C랑 같은 값이 나옵니다.
제가 궁금한건 왜 solve함수의 결과값은 다르게 나올까요....
소수점아래 7자리까지정돈 동일하게 나와야하는데.. 어렵네요;;
Forums:
일단 단정도, 배정도 체크를 해봐야 할 것
일단 단정도, 배정도 체크를 해봐야 할 것 같고....
일단 solve라는게, numerical method에 따른 루프를 돌면서 종결조건만 맞추면 답이라고 간주할테니까...오차가 있을 수도 있을 것같고...
상식적으로는 이 두가지중 하나라고 생각됩니다만.. 전문가는 아니라서.. 원인 아시게 되면 업데이트 부탁드립니다.
안타깝지만..
일단 이 작업은 그냥 마무리했습니다...
그런데 역시 두 함수 사이 오차누적 차이 때문이 아닌가 싶습니다.
부동소수점 단정도, 배정도계산의 차이가 아닐까 하네요.
단정도계산은 유효자리 6자리를 보장합니다. 최대 9자리고요.
!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.
실제로 두 원의 교점을 구하는 방정식을 풀어
실제로 두 원의 교점을 구하는 방정식을 풀어 보았는데, 제가 현재 쉽게 생각할 수 있는 풀이법이 두개가 됩니다.
첫번째는, 말 그대로 두 원의 방정식을 연립해서 푸는 방법으로 2차 방정식이 나오는데, 근의 공식으로 풀 수 있습니다. sqrt 정도가 쓰이고 나머진 길게 늘어진 사칙연산입니다.
두번째는, 기하학적 모양에서 유도해 내는 방법인데, sqrt, atan, acos, sin, cos 등이 쓰입니다.
매트랩의 solve가 변수를 심볼로 보고서 해를 구한다고 하는데, 제생각에 그럴 경우 아마 첫번째와 유사한 방법을 쓰게 될 것으로 생각합니다.
인터넷에서 circcirc.m을 찾아 보았는데, 두번째 방법을 사용하더군요.
C로 구현하신 방법이 어떤 건지는 모르겠습니다만, 제 생각에 두번째 방법을 쓰셨을 거 같습니다.
제 생각에는 두 방법 사이에 오차가 누적되는 과정이 다르기 때문에 생기는 현상이 아닐까 짐작합니다.
C 구현에서 변수 타입을 float, double, long double로 변경해 보면서 결과값을 살펴보는 것은 어떨까요. 각각의 타입에 대해서 함수들이 sqrt, sqrtf, sqrtl, atan, atanf, atanl 등으로 따로 존재하는 것을 염두해 두시고 수정하시면 좋겠죠.
부동소수점 정확도에 대해서는 저는 조금 다른 표현으로 배웠습니다. 단정도 6자리, 배정도 15자리 이후는 크게 의미가 없다라고요. 이것이 그 이전자리는 정확하다고 보장한다가 같은지는 좀 의문입니다.
네 기본적으로 10진수가 2진수가 되고 2진수가 다시 10진표기로 바뀌어야하는데.
그 때 10진법 6개의 유효숫자 보장한다는 것이죠. 입력되는 10진수 값이 2진수와 본질적으로 달라서 생기는 오차누적을 보장한다는 것은 아니니까요.
!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.
댓글 달기