2017-01-20 18 views
1

K=5,而alpha = 1:0.5:10MATLAB:为什么我用acos得到一个复数?

我的代码是:

cos_theta_0 = -1./(2.*alpha)+sqrt(1.+1./(4.*alpha.^2)); 
theta_0 = acos(cos_theta_0); 

for h = 1:(K-2) 
    cos_theta(h,:)= cos_theta_0 - h.*log(2); 
    theta(h,:)= acos(cos_theta(h,:)); 
end 

为什么我找回变量thetacomplex double

+0

什么是'alpha'的* actual *值。 – Suever

+2

因为,正如Matlab的良好文档告诉你的那样,你已经在'[-1,1]'之外给'acos'一个参数? –

+0

'alpha'是一个由1到10的19值组成的数组,具有0.5 -step @Suever – ElenaPhys

回答

1

cos功能如下:

Plot of sine and cosine
图片来源:Wikipedia, Trigonometric functions

正如你可以清楚地看到,余弦从未进入上述1或低于-1。您正在使用acos,这是余弦的反函数。你基本上问的问题:“x什么值使得cos(x)返回我给定的y值?”

现在,h=3,您的代码创建cos_theta的这是低于-1。正如你从图表中看到的那样,用而不是可能用实数达到这样的值。但是,复数的余弦值可能会达到1以上且低于-1的值。 MATLAB正确地认识到没有真正的解决方案存在,但复杂的解决方案 - 因此它返回复杂的角度。对于h=1h=2cos_theta的表现很好,并且小于-1,所以结果是真实的。

PS: For-loops坏/慢。你可以通过使用h而不是行矢量(通过使用.'转置它),然后使用bsxfun(在“旧”MATLAB版本中)或使用R2016或更新版本中的内置广播来放弃这个。

h = (1:K-2).'; 
cos_theta = bsxfun(@minus, cos_theta_0 , h*log(2)); % For older than R2016 
cos_theta = cos_theta_0 - h*log(2);     % For newer than R2016 
theta = acos(cos_theta); 
相关问题