#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 Бинго, вот и все, что нужно. Спасибо за вашу помощь.