Построение ветвей сложной функции - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь построить некое подобие римановой поверхности функции (я не уверен, что это правильное название для этой вещи), как показано ниже:

Desired result

Вот что я попробовал:

r = (0:1:15)';                           % create a matrix of complex inputs
theta = pi*(-1:0.05:1);
z = r*exp(1i*theta);
w = z.^(1/2)  ;                          % calculate the complex outputs

figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
subplot(121)

surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Real(u)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Imag(v)';

subplot(122)
surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Imag(v)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Real(u)';

Что дает мне следующее:

Current result

Мои вопросы:

  1. Я думал, что нарисую то, что изображено на первом изображении, но я получил кое-что еще. Что я построил, если это не поверхность Римана?

  2. Как я могу изменить свой код, чтобы получить верхний график?

  3. Возможно ли иметь шкалу в радианах на первом графике?

1 Ответ

0 голосов
/ 11 ноября 2018

Ваш первый график показывает несколько ветвей многозначной «функции». На самом деле это не функция в обычном смысле, поскольку для данного z у вас есть более одного значения функции. Вы можете воспроизвести это, только обойдя более одного раза вокруг начала координат, то есть более чем 2*pi в вашей угловой переменной. То, что вы изображаете, является основной ветвью этой функции, то есть листом, который соответствует сложным фазам в диапазоне от -pi до pi.

Кроме того, есть более фундаментальная проблема. Как только вы переключаетесь на комплексные числа, представленные как двойные, вы теряете любую информацию о дополнительной фазе вокруг начала координат (комплексные числа, представленные как вещественная + мнимая часть, приведут только к главному значению их комплексной фазы, которое находится между -pi и pi). Поэтому вам нужно вычислить квадратный корень «вручную» из тригонометрической формы комплексного числа:

r = (0:1:15)';                           % create a matrix of complex inputs
theta = pi*(-2:0.05:2);
z = r*exp(1i*theta);
%w = z.^(1/2)  ;                          % calculate the complex outputs
w = sqrt(r)*exp(1i*theta/2);

figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
subplot(121)

surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Real(u)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Imag(v)';

subplot(122)
surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Imag(v)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Real(u)';

result from polar solution

Как видите, функция работает так, как должна. Обратите внимание, что не имеет смысла иметь «масштаб в радианах» на рисунке. Все, что вы строите, имеет «линейные» размеры: реальные и воображаемые части. Радианы имеют смысл только для углов , т.е. theta -подобных величин.

Также вы можете заметить, что на приведенном выше рисунке есть круглые края, поскольку мы строим графики с использованием полярных координат. Можно создать прямоугольный сюжет, но это займет гораздо больше работы. Вот частичное решение. Идея состоит в том, чтобы дважды сшить одну и ту же сетку, чтобы построить две ветви функции:

r0 = 15;
re = linspace(-r0, r0, 31).';                           % create a matrix of complex inputs
im = linspace(-r0, r0, 31);
z = re + 1j*im;
theta = angle(z);  % atan2(imag(z), real(z));
r = abs(z);

% concatenate the same mesh twice (plotting trick) back to back, insert nan in between
w1 = sqrt(r).*exp(1i*theta/2); % first branch
w2 = sqrt(r).*exp(1i*(theta+2*pi)/2); % second branch

z = [z, nan(size(w1,1),1), z(:,end:-1:1)];
w = [w1, nan(size(w1,1),1), w2(:,end:-1:1)];

figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
subplot(121)
surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Real(u)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Imag(v)';

subplot(122)
surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Imag(v)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Real(u)';

Вот результат:

result from Cartesian solution

Как видите, сложная часть выглядит странно. Это потому, что фаза комплексных чисел прыгает вдоль отрицательной реальной полуоси. Это может быть исправлено, но требует гораздо больше работы, это оставлено читателю в качестве упражнения. Причина, по которой я ввел в данные столбец nan s, состоит в том, чтобы предотвратить появление аналогичного артефакта перехода на первом графике. Другой вариант заключается в том, чтобы построить две ветви функции по отдельности, с hold on между ними, но тогда потребуется дополнительная работа для нормализации цветовой карты на рисунках.

Наконец, не стоит использовать jet, а вместо этого использовать цветовую карту parula по умолчанию. Струя очень вредна для людей с нарушенным цветовым зрением, и parula близка к воспринимаемой форме Для краткого введения в проблему я предлагаю посмотреть этот замечательный разговор от отвратительных парней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...