2011-03-28 1 views
0

Je m'enseigne à Octave et, en tant qu'exercice de motivation, je tente de créer quelques intrigues de Bode. Je voudrais créer un graphique qui a plusieurs courbes pour différentes valeurs d'un paramètre dans une fonction de transfert, par exemple la constante de temps d'un simple filtre RC. Je suis en train de le faire comme suit:Octave et plusieurs intrigues de Bode

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

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

Mais cela ne fonctionne pas, je reçois l'erreur

error: octave_base_value::imag(): wrong type argument `struct'

Cependant, il fonctionne très bien s'il n'y a pas plusieurs arguments à la commande de bon augure et la dernière ligne est tout simplement:

bode(g(1)) 

Tout conseil que là où je suis allé mal serait apprécié - est-il une meilleure façon de faire ce que je veux faire?

+0

J'ai essayé votre code dans Matlab et il a bien fonctionné, donc je ne crois que c'est un problème avec Octave. – KnowledgeBone

+0

Ah, c'est malheureux. Merci de l'avoir testé pour moi. – Bitrex

+0

Si ça aide, voici une sortie utilisant une ancienne version (Octave 3.0.3): http://pastebin.com/25HA3YUW –

Répondre

0

j'ai pu le faire avec la séquence suivante (avec octave 3.2.4 sur debian):

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

La deuxième commande est similaire à hold on mais cela fonctionne quand il y a des intrigues secondaires; Je l'ai trouvé here.

0

En utilisant votre propre code:

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 

Le problème avec cette solution est que vous ne pouvez pas identifier une parcelle spécifique. Vous ne pouvez pas accéder aux propriétés de la figure via la fonction bode() directement.

Voici donc une solution plausible pour vous apporter des parcelles colorées:

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