2017-01-20 14 views
1

Позвольте K=5, а alpha = 1:0.5:10.MATLAB: Почему я получаю сложное число с использованием 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 

Почему я получаю обратно переменную theta как complex double?

+0

Что такое * актуальное значение 'alpha'. – Suever

+2

Потому что, как говорит вам хорошая документация Матлаба, вы дали 'acos' аргумент вне' [-1,1] '? –

+0

'alpha' - это массив, состоящий из 19 значений от 1 до 10 с 0,5-ступенчатым @Suever – ElenaPhys

ответ

1

cos функция выглядит следующим образом: Source

Plot of sine and cosine
Изображение: Wikipedia, Trigonometric functions

Как вы можете ясно видеть, косинус никогда не поднимается выше или ниже 1-1. Вы работаете с acos, который является обратной функцией косинуса. Вы в основном задаете вопрос: «Какое значение для x составляет cos(x)? Возвращаю мое заданное значение y?

Теперь для h=3, код создает cos_theta «S, которые ниже-1. Как видно из графика, не может достичь таких значений с действительными числами. Однако косинус комплексного номера может достичь значений выше 1 и ниже -1. MATLAB правильно признает, что реального решения нет, но сложные решения - так что в результате он возвращает комплексные углы. Для h=1 и h=2 поведение cos_theta ведет себя красиво и меньше, чем -1, поэтому результаты реальны.

PS: Для петель плохие/медленные. Вы можете отказаться от этого, сделав 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^