2017-04-02 9 views
1

더 긴 코드의 일부로 복잡한 양의 인수 인 양 phi1과 phi2 (크기 128x128의 행렬)를 얻습니다. 이제 MATLAB에서 다음 수량을 정의합니다.tan inverse in matlab 올바른 값을 제공하지 않음

alpha=phi1-phi2; 
S1=cos(alpha); 
S2=sin(alpha); 
K=atan2(S2,S1); 

이제 K는 알파와 같아야합니다. 따라서 행렬 B는 다음과 같이 정의됩니다.

B=K-alpha; 

은 0이어야합니다. 결과는 다르게 나타납니다. B의 몇몇 요소가 0이지만, 많은 요소의 값은 6.2832 (2pi)입니다. 왜 이런 일이 일어날 수 있습니까?

+0

실제로 phi1과 phi2는 MATLAB에서 각도로 평가됩니다. 따라서 그들의 범위는 -pi와 pi 사이에 있습니다. 알파를 평가할 때 값의 범위는 -pi와 pi 사이에 있지 않습니다. 따라서 atan2는 정확한 알파 값을 제공하지 않습니다. 그러나 베타 = phi1 + phi2를주는 또 다른 방정식이 있기 때문에 정확한 알파 값을 원한다는 것이 있습니다. 그리고 주요 목표는 S1과 S2와 베타 방정식에서 알파를 유도하여 phi1을 평가하는 것입니다. 그 때문에 정확한 알파 값을 원합니다. 하지만 내가 무엇을 시도하든 나는 정확하게 알파를 검색 할 수 없다. 누구든지 뭔가 제안 할 수 있습니까? –

답변

2

atan2은 항상 returns values between -pi and pi입니다. 따라서, 예를 들어, alpha = 4 코드에 대한

S1=cos(alpha); 
S2=sin(alpha); 
K=atan2(S2,S1) 

alpha하지만 -pipi 사이의 간격 (모듈 2*pi)를 이동

K = 
    -2.2832 

제공합니다.

2*pi의 두 각도가 실제로 동일하기 때문에 문제가되지 않습니다. 그래서 가능한 솔루션은 뺄셈 모듈 2*pi를 수행하여 각도를 비교하는 것입니다 또한

>> mod(alpha-K, 2*pi) 
ans = 
    0 

주, numerical rounding errors 때문에, 정확히 0되는 차이 모듈 2*pi에 의존해서는 안됩니다. 대신 절대 값을 주어진 공차와 비교하십시오.