【问题标题】:MATLAB: Why do I get a complex number using acos?MATLAB:为什么我使用 acos 得到一个复数?
【发布时间】:2017-01-20 15:25:39
【问题描述】:

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 取回?

【问题讨论】:

  • alpha实际 值是多少。
  • 因为,正如 Matlab 的优秀文档告诉您的那样,您在 [-1,1] 之外给了 acos 一个参数?
  • alpha 是一个数组,由 19 个值组成,从 1 到 10,步长为 0.5 @Suever

标签: matlab trigonometry inverse


【解决方案1】:

cos 函数如下所示:


图片来源: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 循环很糟糕/很慢。您可以通过将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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多