Schwierigkeiten und verschiedene Krankheiten (2) - Die Lösung des Problems der "undefinierten Funktion oder Variablen 'bd_asymp'" in MATLAB

Beim Zeichnen der logarithmischen asymptotischen Amplituden-Frequenz-Kennlinie mit MATLAB im offenen Regelkreis tritt das Problem der "undefinierten Funktion oder Variablen" bd_asymp "auf. Eine Referenzlösung ist unten angegeben.

  1. Zeigen Sie das Problem
    Problem auftreten
  2. Lösung des Problems
    a. Geben Sie "edit bd_asymp" in die Befehlszeile ein. Es wird angezeigt, dass die Datei bd_asymp nicht vorhanden ist. Wählen Sie "Ja", um eine neue .m-Datei zu erstellen.
    Lösung
    b. Fügen Sie den Quellcode der Funktion bd_asymp in die Datei bd_asymp.m ein und speichern Sie die Datei.
    Lösung
    c. Testen Sie, ob die logarithmische asymptotische Kennlinie mit Amplitude und Frequenz im offenen Regelkreis gezeichnet werden kann, und das Problem ist gelöst.
    Lösung
  3. Im Anhang: bd_asymp Quellcode
function[wpos,ypos]=bd_asymp(G,w)
G1=zpk(G);
wpos=[];
pos1=[]; 
if nargin==1,w=freqint2(G);
end
zer=G1.z{
    
    1}; pol=G1.p{
    
    1};
gain=G1.k;
for i=1:length(zer);
    if isreal(zer(i))
        wpos=[wpos,abs(zer(i))];
        pos1=[pos1,20];
    else
        if imag(zer(i))>0
            wpos=[wpos,abs(zer(i))];
            pos1=[pos1,40];
        end
    end
end
for i=1:length(pol);
    if isreal(pol(i))
    wpos=[wpos,abs(pol(i))];
    pos1=[pos1,-20];
    else
        if imag(pol(i))>0
            wpos=[wpos,abs(pol(i))];
            pos1=[pos1,-40];
        end
    end
end
wpos=[wpos w(1) w(length(w))];
pos1=[pos1,0,0];
[wpos,ii]=sort(wpos);
pos1=pos1(ii);
ii=find(abs(wpos)<eps); 
kslp=0;
w_start=1000*eps;
if length(ii)>0
    kslp=sum(pos1(ii));
    ii=(ii(length(ii))+1):length(wpos);
    wpos=wpos(ii);
    pos1=pos1(ii);
end
while 1
    [ypos1,pp]=bode(G,w_start);
    if isinf(ypos1),w_start=w_start*10;
    else break;
    end
end
wpos=[w_start wpos];
ypos(1)=20*log10(ypos1);
pos1=[kslp pos1];
for i=2:length(wpos)
    kslp=sum(pos1(1:i-1));
    ypos(i)=ypos(i-1)+kslp*log10(wpos(i)/wpos(i-1));
end
ii=find(wpos>=w(1)&wpos<=w(length(w)));
wpos=wpos(ii);
ypos=ypos(ii);

Ich denke du magst

Origin blog.csdn.net/qq_39032096/article/details/107738299
Empfohlen
Rangfolge