угол() действительного числа

Меня немного смущает функция angle() в Matlab, в частности, когда она применяется к массиву действительных чисел.

Функция angle() должна дать мне фазу комплексного числа. Пример: y = a + bi, ==> фаза = arctan(b/a). Действительно, следующие работы:

for t=1:1000
    comp(t) = exp(1i*(t/10));
end

phase_good_comp1 = unwrap(angle(comp)); %this gives me the right answer
b = imag(comp);
a = real(comp);
phase_good_comp2 = atan(b./a); %this gives me the right answer too, but 
wrapped (not sure if there is a way to unwrap this, but unwrap() does not 
work)

figure(1)
plot(phase_good_comp1)
hold on
plot(phase_good_comp2,'--r')
legend('good phase1', 'good phase2')
title('complex number')

Вот график для комплексных чисел -

введите здесь описание изображения

Обратите внимание, что я могу использовать либо функцию angle(), либо явное определение фазы, как показано выше. Оба дают хорошие результаты (я не могу развернуть последний, но это не моя проблема).

Теперь, если я применю ту же логику к массиву действительных чисел, я должен получить постоянную фазу везде, поскольку мнимой части не существует, поэтому arctan(b/a) = arctan(0) = 0. Это работает, если я использую явное выражение определение фазы, но я получаю странный результат, если использую angle():

for t=1:1000
    ree(t) = cos((t/10));
end

phase_bad_re = unwrap(angle(ree)); %this gives me an unreasonable (?) answer
b = imag(ree);
a = real(ree);
phase_good_re = atan(b./a); %this gives me the right answer

figure(1)
plot(phase_bad_re)
hold on
plot(phase_good_re,'--r')
legend('bad phase', 'good phase')
title('real number')

Вот график для реальных чисел -

введите здесь описание изображения

Почему колебание, когда я использую угол ()???


person Ross G    schedule 16.02.2017    source источник
comment
Вы уверены, что вам не нужно другое стандартное определение атана, реализованное как atan2?   -  person bright-star    schedule 16.02.2017


Ответы (2)


Документация Matlab расскажет вам, как это вычислить:

Функция угла может быть выражена как angle(z) = imag(log(z)) = atan2(imag(z),real(z)).

https://www.mathworks.com/help/matlab/ref/angle.html

Обратите внимание, что они определяют его с помощью atan2 вместо atan.

Теперь ваши данные находятся в диапазоне косинуса, который включает как положительные, так и отрицательные числа. Угол для положительных чисел должен быть равен 0, а угол для отрицательных чисел должен быть целым нечетным числом, кратным пи. Используя конкретное определение, которое они выбрали, чтобы получить уникальный ответ, это число пи. Вот что у тебя есть. (На самом деле, для положительных чисел подойдет любое четное целое число, кратное пи, но 0 — это «естественный» выбор, который вы получаете из atan2.)

Если вам непонятно, почему у отрицательных чисел угол не равен 0, постройте его на комплексной плоскости и помните, что радиальная часть комплексного числа положительна по определению. Это z = r * exp(i*theta) для положительных r и theta, заданных этим углом, который вы вычисляете.

person Brick    schedule 16.02.2017
comment
... радиальная часть комплексного числа положительна по определению, и мне все проясняется. Спасибо. - person Ross G; 16.02.2017

Так как знак функции косинуса периодически меняется, угол() тоже колеблется.

Пожалуйста, попробуйте это.

a=angle(1);
b=angle(-1);

Фаза 1+i*0 равна 0, а фаза -1+i*0 равна 3,14.

Но в случае atan b/a всегда равно 0, так что результатом atan() будет все 0.

person KKS    schedule 16.02.2017