2016-07-22 2 views
18

matlab으로 계산하는 데 문제가 있습니다. "pi"은 부동 숫자이며 정확하지 않습니다. 그래서, matlab sin(pi) 정확히 0이 아닙니다. sin(pi/2) 1.matlab sin (pi)가 정확하지 않지만 sin (pi/2)가 정확한 이유는 무엇입니까?

sin(pi) 정확히 동일한 이유 "pi는"다음 정확하지 않은 경우 내 질문은 ->는 pi의 beacause를 정확하게 일치하지 않는 경우가 많습니다. 하지만 sin(pi/2)은 정확히 동일합니다.

나는 혼란스럽고 혼란 스럽습니다.

+0

정확히 1은 아니지만 오류는 실제로 표현하기에는 너무 작습니다. –

+0

하지만 matlab은 정확히 1을 보여줍니다. –

+2

'sin (sym ('pi'))'를 시도하고 http://www2.math.umd.edu/~jmr/241/introsession.html – Malick

답변

6

나는 매트랩 sin(x) 계산하는 정확한 방법을 잘 모릅니다 -하지만 당신은 즉

sin x = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! ... 

일부 MATLAB 코드로이 선반은 우리가 그것을 표현, 전원 시리즈를 사용하여 계산하여이 문제를 조사 할 수 있습니다 :

clc 
x = pi;  % or x = pi/2 
res = x; 
factor = -1; 
for ii=3:2:19 
    res = res + factor*power(x,ii)/factorial(ii); 
    factor = factor*-1; 
    fprintf ('iteration %2i sin(x)=%1.16f\n', (ii-1)/2, res); 
end 
res 

x=pix=pi/2 모두에 대해이 코드를 실행하면 x=pi/2이 올바른 결과 (eps 오류 내역)에 매우 빠르게 수렴 함을 알 수 있습니다 (9 반복) - x=pi 대/소문자가 같은 시간대에 수렴하지 않습니다.

9 회 반복에서 계승 (19)에서 계산되는 마지막 계승을 주목하는 것이 유용합니다. 이 시퀀스에서 계산되는 다음 계승 값은 21입니다. 이것은 배정도로 인해 100 % 정확도로 나타낼 수있는 마지막 계승입니다 (help factorial 참조).

그래서 필자는 pi/2의 경우 수학적 솔루션이 pi 케이스보다 2 배의 정밀도로 1에 수렴한다는 것을 생각합니다. 사실 pi 케이스는 수식의 한계와 배정도 결과에 저장 될 수있는 정확성 때문에 완전히 수렴하지 않습니다.

sin(pi)은 모두 eps입니다. 그렇기 때문에이 사실을 사용해야합니다. sin(pi)=0.0, 그래서 모든 작은 오류가 아무리 작은 것은 0에 비해 엄청난입니다 따라서 볼 것을,

Results for PI/2 
iteration 1 sin(x)=0.9248322292886504 
iteration 2 sin(x)=1.0045248555348174 
iteration 3 sin(x)=0.9998431013994987 
iteration 4 sin(x)=1.0000035425842861 
iteration 5 sin(x)=0.9999999437410510 
iteration 6 sin(x)=1.0000000006627803 
iteration 7 sin(x)=0.9999999999939768 
iteration 8 sin(x)=1.0000000000000437 
iteration 9 sin(x)=1.0000000000000000 
Final Result: 1.0000000000000000 


Results for PI 
iteration 1 sin(x)=-2.0261201264601763 
iteration 2 sin(x)=0.5240439134171688 
iteration 3 sin(x)=-0.0752206159036231 
iteration 4 sin(x)=0.0069252707075051 
iteration 5 sin(x)=-0.0004451602382092 
iteration 6 sin(x)=0.0000211425675584 
iteration 7 sin(x)=-0.0000007727858894 
iteration 8 sin(x)=0.0000000224195107 
iteration 9 sin(x)=-0.0000000005289183 
Final Result: -0.0000000005289183 
+1

호출의 표준 출력을'pi'와'pi/2'를 포함시키는 것이 좋을 것입니다. sin에 대한 알고리즘이 MATLAB에서 내부적으로 사용되는 것으로 문서화되어 있습니까? –

+1

완료. Matlab이 내부적으로 어떤 알고리즘을 사용하는지 알지 못합니다. 그게 가능한 값과 플랫폼에 따라 다른 알고리즘의 조합을 사용하는 가능성 등 ... (이 답변은 C + +에서 비슷한 질문에 대한 참조 (http://stackoverflow.com/questions/2284860/how-does) -c-compute-sin-and-other-math-functions) – matlabgui

2

그 이유는 다음과 같습니다

은 내가 아래 얻는 결과 (R2015b)를 복사했습니다.

sin(pi/2)=1과 다르게 알고리즘의 결과가 eps (약 2.220446e-16)보다 작 으면 1+eps=1이므로이 오류가 표시되지 않습니다.

이 오류는 부분적으로 부정확 한 입력 (pi 값이 정확하지 않음)과 계산 중에 반올림 한 결과의 결과입니다. 코드를 올바르게 이해하려면 코드를 자세히 살펴야합니다.

또 다른 중요한 요소는 기능 자체입니다.pipi/2에 대한 테일러의 시리즈를보고 오류 전파를 고려할 때 우리는 볼 수 있습니다

sin(pi+dx)=sin(pi)+cos(pi)dx+o(dx^2)=-dx+o(dx^2) 
sin(pi/2+dx)=sin(pi/2)+cos(pi/2)dx+o(dx^2)=1+o(dx^2) 

그것은 분명하다 dxeps 경우, 오류보다 인한 부정확 한 입력에 대한 eps*eps 따라서이 아닌 것 1에 비해 표시됩니다.