Октава и несколько графиков Боде

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

tau = [1,2,3]
for i = tau
    g(i) = tf(1,[tau(i),1])
endfor

bode(g(1),g(2),g(3))

Но это не работает, я получаю ошибку

ошибка: octave_base_value::imag(): аргумент неправильного типа `struct'

Однако он отлично работает, если у команды bode нет нескольких аргументов, а последняя строка просто:

bode(g(1))

Любые советы относительно того, где я ошибся, будут оценены - есть ли лучший способ сделать то, что я хочу сделать?


person Bitrex    schedule 28.03.2011    source источник
comment
Я попробовал ваш код в Matlab, и он работал нормально, поэтому я считаю, что это проблема с Octave.   -  person KnowledgeBone    schedule 29.03.2011
comment
Ах, это прискорбно. Спасибо, что проверили это для меня.   -  person Bitrex    schedule 29.03.2011
comment
Если это поможет, вот вывод с использованием более старой версии (Octave 3.0.3): pastebin.com/25HA3YUW   -  person George Profenza    schedule 29.03.2011


Ответы (2)


Я смог сделать это с помощью следующей последовательности (с октавой 3.2.4 на Debian):

bode(g(1))
set (findobj (gcf, "type", "axes"), "nextplot", "add")
bode(g(2))
bode(g(3))

Вторая команда похожа на hold on, но работает, когда есть подзаголовки; Я нашел это здесь.

person Andy    schedule 29.03.2011
comment
Следует отметить пару вещей: хотя он добавляет сюжетную линию, он не добавляет новых элементов в легенду. Также сохраняется, пока окно рисунка не закрыто, что неплохо для ручного тестирования, если вы можете сами отслеживать графики. - person stiebrs; 22.10.2020

Используя свой собственный код:

subplot(211), hold on
subplot(212), hold on
tau = [1,2,3]
for i = 1:length(tau),
   g(i) = tf(1,[tau(i),1]);
   bode(g(i))
endfor

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

Вот тогда правдоподобное решение, чтобы принести вам красочные сюжеты:

colorsplot = ["b","m","g"]
tau = [1,2,3]
g = tf(1,[tau(1),1]);
[mag, ph, w] = bode(g);
subplot(211), semilogx(w,20*log(mag)), hold on
subplot(212), semilogx(w,ph), hold on
for i = 2:length(tau),
  g = tf(1,[tau(i),1]);
  [mag, ph, waux] = bode(g,w);
  subplot(211), semilogx(w,20*log(mag),colorsplot(i))
  subplot(212), semilogx(w,ph,colorsplot(i))
endfor
person rmarquez    schedule 18.11.2012