允许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
?
答案 0 :(得分:1)
1
函数如下所示:
图片来源:Wikipedia, Trigonometric functions
正如您可以清楚地看到的那样,余弦从不高于-1
或低于x
。您正在使用acos
,这是余弦的反函数。您基本上会问这个问题:" cos(x)
使y
返回给定h=3
值的值是多少?"
现在,对于cos_theta
,您的代码会创建-1
1
以下的。从图中可以看出, 不可能使用实数来达到这样的值。但是,复数的余弦可以达到-1
以上h=1
以上的值。 MATLAB正确地认识到不存在真正的解决方案,但复杂的解决方案确实存在 - 因此它返回复杂的角度。对于h=2
和cos_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}}