0

Ich habe einen sehr komplizierten Satz von Differentialgleichungen mit mehreren zeitabhängigen Variablen. Ich habe eine Vereinfachung meines Codes online gefunden, es ist hier; Es ist in zwei Abschnitten. ErsteWie man einen sehr einfachen Controller zu einem Satz von Differentialgleichungen hinzufügt

`t_values=linspace(0,10,101); 
initial_cond=[1 ; 0 ; 0]; 
[tv,Yv]=ode45('simplemodel',t_values,initial_cond); 
plot(tv,Yv(:,1),'+',tv,Yv(:,2),'x',tv,Yv(:,3),'o'); 
legend('y1','y2','y3');` 

Dann wieder ein

function Dy = simplemodel(t,y) 

Dy=[ a(t)*y(1)+b(t)*y(2); ... 
-a(t)*y(3)+b(t)*y(1); ... 
a(t)*y(2)] ; 
end 

function fa=a(t); 
    fa=cos(t); % or place whatever you want to place for a(t).. 
end 

function fb=b(t); 
    fb=sin(t) % or place whatever you want to place for b(t).. 
end 

ich ein Problem jedoch habe, dass ich versuchen will einen PID-Regler zu meinem a(t) Begriff hinzuzufügen .. Ich habe versucht, eine „proportionale Term zuerst zu tun hinzufügen "durch Ändern der fb=sin(t) Zeile zu fb=-K*y(2)+d+K*int(y(2))+K*diff(y(2)), wobei K und d Konstanten sind. Wenn ich diese fb Zeile für die in dem Code ersetze, erhalte ich Fehler. Irgendwelche Ideen Jungs? Vielen Dank

+0

Können Sie bitte Ihre Frage bearbeiten, um eine [mcve] zu enthalten? – Wrzlprmft

+0

Hallo @Wrzlpmft Ist mein Beispiel nicht vollständig und minimal. Der Code zur Verfügung gestellt funktioniert auch, ich brauche es nur erweitern. Danke :) – ODAmatuer

+0

* Der angegebene Code funktioniert auch * - Genau. Zeig uns, was du versucht hast und was nicht. – Wrzlprmft

Antwort

0

Sie wollen von einem System gehen, die von

function Dy = simplemodel(t,y) 
    a = cos(t) 
    b = sin(t) 
    Dy=[ a*y(1)+b*y(2); ... 
     -a*y(3)+b*y(1); ... 
     a*y(2)] ; 
end 

etwas beschrieben wird, die

b = -K*y(2)+d+K*Iy2+K*Dy2 

hat, wo Dy2 die Ableitung und Iy2 die anti-Derivat der zweite Komponente. Das erste Problem ist, dass

Dy(2) = -a*y(3)+b*y(1) 

hängt sich auf b, die auf Dy(2) abhängt, so dass Sie etwas Feed-back bzw. erhalten. ein Abhängigkeitskreis, den Sie lösen müssen. Dies kann durch Lösen

Dy(2) = -a*y(3)+(b1+K*Dy(2))*y(1); 

für Dy(2) erfolgen. b1 enthält alle anderen Teile b, so insgesamt, dass der Kreis als

b1 = -K*y(2)+d+K*Iy2 
Dy(2) = (-a*y(3) + b1*y(1))/(1-K*y(1)) 
b = b1+K*Dy(2); 

gelöst Dieses enthält noch die as-of-noch unadressierte anti-Ableitungswert. Mit anderen Worten, wir benötigen eine Funktion, deren Ableitung y(2) ist. Da eine solche Funktion nicht im System vorhanden ist, haben wir eine zusätzliche Komponente, um es hinzuzufügen,

function Dy = simplemodel(t,y) 
    a = cos(t) 
    Dy(4) = y(2) % y(4) = integral(y(2)) 
    b1 = -K*y(2)+d+K*y(4) % missing +K*Dy(2) 
    Dy(2) = (-a*y(3) + b1*y(1))/(1-K*y(1)) 
    b2 = K*Dy(2); 
    b = b1+b2; 
    Dy(1) = a*y(1)+b*y(2) 
    Dy(3) = a*y(2) 
end 

Sie werden noch einige Anfangswert für die anti-Derivat benötigen, höchstwahrscheinlich es 0, wenn das System sein Es wird angenommen, dass nach einem Ruhezustand eingeschaltet wird.

+0

Vielen Dank für dieses @LutzL.Nach ein paar Stunden Spielzeit habe ich jedoch Probleme mit dem Ausführen dieses exakten Beispiels? Alles, was ich getan habe, sind Werte für K und d oben, wo a definiert ist, und fügten eine vierte "0" für meine Anfangsbedingung hinzu. Ich bekomme "Fehler bei der Verwendung von odearguments (line 91) SIMPLEMODEL muss einen Spaltenvektor zurückgeben." Ich habe versucht, die Anfangsbedingung zu einem Farb- und Reihenvektor zu ändern, ohne Erfolg. Funktioniert der angegebene Code für Sie? – ODAmatuer

+0

Sie müssen eine erste Deklaration hinzufügen wie 'Dy = Nullen_like (y)'. Ich habe kein Matlab verfügbar, um die Syntax zu testen. – LutzL

Verwandte Themen