Пытаюсь составить график собственных значений (корневой локус) характеристического уравнения при увеличении одной переменной, но получаю пустой график?

#python #matlab

#python #matlab

Вопрос:

Вообще не понимаю, почему я ничего не получаю обратно? Пытаюсь построить график собственных значений.

 A2 = m*J;
A1 = J*((Cf Cr)/U) m*(((Cf*Lf^2) (Cr*Lr^2))/U^2);
A0 = ((Cf Cr)/U)*(((Cf*Lf^2) (Cr*Lr^2))/U)-m*(Cf*Lf-Cr*Lr)-((Cf*Lf-Cr*Lr^2)/U^2);

%loop through values of U (forward velocity) to find all eigenvalues
 for U = 1:80
     lambda = (-A1 sqrt(A1^2-4*A0*A2))/(2*A2);
     plot(real(lambda), imag(lambda));
 end
 
  

При запуске скрипт просто возвращает пустую диаграмму argan. Использование Matlab [R2018b]

Комментарии:

1. Вы делите на 0, U = 0 вы определяете, A1, A0 используя /U^2 , следовательно A1, A0 , inf

2. @Nathan хорошее замечание, удалив его, я, по крайней мере, теперь получаю комплексные значения для лямбда, но на моем графике по-прежнему ничего нет, я правильно использую plot ()?

Ответ №1:

Первая проблема, как уже говорилось, заключается в том, что вы делите на 0, U = 0 вы определяете, A1, A0 используя /U^2 , следовательно A1, A0 , inf

Другая проблема заключается в том, что вы не используете hold on (подробнее здесь). Это означает, что вы каждый раз перезаписываете график, получая в итоге конечный график всего из одной точки.

Чтобы лучше видеть этот момент, вы можете увеличить markersize, как сказано здесь. Это делает точки лучше видимыми, например: plot(real(lambda), imag(lambda),'o','MarkerSize',12); в результате точки данных отмечены кружком размером 12

РЕДАКТИРОВАТЬ: дальнейшие улучшения

Что также лучше сделать, так это не строить график в цикле, тогда вам даже не понадобится hold on . Так, например:

  maxidx = 80;
 lambda = zeros(1,maxidx);
 for U = 1:maxidx 
     lambda(U) = (-A1 sqrt(A1^2-4*A0*A2))/(2*A2);
 end

plot(real(lambda), imag(lambda),'o','MarkerSize',12);
title('Root Locus as Speed is Increased')
xlabel('real')
ylabel('imaginary')
  

Кстати, в итоге вы получите только одну точку, поскольку A0, A1, A2 постоянны

Комментарии:

1. Потрясающе, вывод графика за пределы цикла выглядит намного чище. Все еще не понимаю, почему он возвращает значение lambda только тогда, когда U имеет значение maxidx, а не на каждом интервале между 1: maxidx, иначе зачем вообще выполнять цикл? Конечно, поскольку A1 и A0 зависят от U, я должен каждый раз получать разные значения? Ценю помощь.

2. @mfarrell: вам нужно повторно вычислить A0 и A1 внутри цикла. Изменение значения U автоматически не запускает повторное вычисление других ваших переменных.

3. @CrisLuengo Бинго, вот и все, что нужно. Спасибо за вашу помощь.