매트랩 solve함수 관련.. solve함수가 정확한가요??

yjster의 이미지

현재 매트랩 소스를 C로 변환하는 작업을 하고 있는데
매트랩에서 solve에 원의 방정식을 두 개 넣어서 해를 구합니다.
원의 방정식 두 개를 연립해서 나온 해는 두 원의 교점인걸로 알고
C에서는 그냥 두 원의 교점 구하는 공식으로 작성했는데
매트랩 결과랑 C에서 결과랑 소수점 4~6자리까지만 같고 그 뒤론 다르더라구요
그래서 circcirc라고 매트랩에서 원의 교점구하는 함수가 있길래 이거도 비교해봤더니
이 함수 결과값은 C랑 같은 값이 나옵니다.

제가 궁금한건 왜 solve함수의 결과값은 다르게 나올까요....
소수점아래 7자리까지정돈 동일하게 나와야하는데.. 어렵네요;;

klenui의 이미지

일단 단정도, 배정도 체크를 해봐야 할 것 같고....

일단 solve라는게, numerical method에 따른 루프를 돌면서 종결조건만 맞추면 답이라고 간주할테니까...오차가 있을 수도 있을 것같고...

상식적으로는 이 두가지중 하나라고 생각됩니다만.. 전문가는 아니라서.. 원인 아시게 되면 업데이트 부탁드립니다.

yjster의 이미지

일단 이 작업은 그냥 마무리했습니다...
그런데 역시 두 함수 사이 오차누적 차이 때문이 아닌가 싶습니다.

yeonpil_net의 이미지

단정도계산은 유효자리 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자리 이후는 크게 의미가 없다라고요. 이것이 그 이전자리는 정확하다고 보장한다가 같은지는 좀 의문입니다.

yeonpil_net의 이미지

그 때 10진법 6개의 유효숫자 보장한다는 것이죠. 입력되는 10진수 값이 2진수와 본질적으로 달라서 생기는 오차누적을 보장한다는 것은 아니니까요.

!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.