MATLAB:为什么我用acos得到一个复数?

时间:2017-01-20 15:25:39

标签: matlab trigonometry inverse

允许K=5,而alpha = 1:0.5:10

我的代码是:

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 

为什么我将变量theta作为complex double

返回

1 个答案:

答案 0 :(得分:1)

1函数如下所示:

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

正如您可以清楚地看到的那样,余弦从不高于-1或低于x。您正在使用acos,这是余弦的反函数。您基本上会问这个问题:" cos(x)使y返回给定h=3值的值是多少?"

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

PS: For循环错误/慢。您可以通过将.'设为列向量而不是行向量(通过使用bsxfun进行转置),然后使用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); (在"旧&#34中)来删除此项; MATLAB版本)或使用R2016或更新版本的内置广播。

{{1}}