ich möchte die bvp4c Syntax mehrmals hintereinander ausführen und dabei nur 4 Werte ändern (Anfangs- und Endzeitpunkt/ Anfangs- und Endgeschwindigkeit). Nach jeder Ausführung will ich die Lösung abspeichern.
Hoffe ihr versteht mein Problem.
Würde mich über eure Hilfe freuen.
Dabei kannst du problemlos auch mehrere Informationen variieren und zurückholen; du musst lediglich aufpassen, ob du mit Vektoren oder Matrizen arbeitest.
Grüße,
Harald
mway
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 31.01.2012, 08:48
Titel:
Erstmal vielen Dank für die Antwort. Die for- schleif war lar soweit.
Die Parameter 1 bis 4 will ich nun an p.ta,p.tf,p.va und p.vf übergeben, dann ausführen und dann die nächste spalte und jeweisl meine Lösung sol abspeichern.
Mein Programmcode sidn so aus und jetzt weiß ich nicht mehr weiter:
%plot(sol.x, sol.y(2,)
% -------------------------------------------------------------------------
end
% Funktion gibt die Randbedingungen in Residuenform an
function res = null(X0,Xf,p)
% -------------------------------------------------------------------------
x0 = X0(1:3);
xf = Xf(1:3);
adjf = Xf(4:6);
res = [ x0 - p.x0;
adjf - p.S*(xf - p.xf)];
% -------------------------------------------------------------------------
end
%plot(sol.x, sol.y(2,)
% Funktion erzeugt eine Parameter-struct
function p = auto_param
% -------------------------------------------------------------------------
% Funktion beinhaltet die kanonischen Gleichungen
function f = kano_gl(t,X,p) % Die Argumente der Funktion müssen t,X,p lauten, nicht X,u,p!
% -------------------------------------------------------------------------
x = X(1:3);
adj = X(4:6);
u = u_opt(x,adj,p); % --> Siehe Funktion unten!
f = [fsys(x,u,p);
-dJdx(x,u,p,t)-dfdx'*adj];
% -------------------------------------------------------------------------
end
% Funktion beinhaltet die Systemdynamik
function g = fsys(x,u,p)
% -------------------------------------------------------------------------
g = [x(2);
x(3);
u];
% -------------------------------------------------------------------------
end
% Jacobimatrix der Systemdynamik
function J = dfdx
% -------------------------------------------------------------------------
J = [0,1,0;
0,0,1;
0,0,0];
% -------------------------------------------------------------------------
end
% Ableitung des Gütefunktionals
function z = dJdx(x,u,p,t)
% -------------------------------------------------------------------------
v_act = interp1(p.t, p.v_soll, t);
z = [0;
p.alpha*(x(2)- v_act); % <-- Das hier wird Probleme machen, da p.v_soll ein Vektor ist. Hier brauchst du nur den aktuellen Sollwert zum Zeitpunkt t!
p.beta*x(3)];
% -------------------------------------------------------------------------
end
% Berechnung der optimale Steuerung
function u = u_opt(x,adj,p)
% -------------------------------------------------------------------------
u = - adj(3)/(2*p.gamma); % Berechne hier die optimale Steuerung (siehe Kapitel 5.3.4 MOOS-Skript)
% Dieser Teil wird benötigt, falls die Eingangsgröße beschränkt ist!
% if (u0 > p.umin) && (u0 < p.umax)
% u = u0;
% elseif u0<=p.umin
% u = p.umin;
% else
% u = p.umax;
% end;
% -------------------------------------------------------------------------
end
Gruß
mway
mway
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 31.01.2012, 09:18
Titel:
sorry, so sieht mein code aus
Code:
function[sol,p] = guetetest(v_soll,t) % -------------------------------------------------------------------------
p = auto_param;
p.v_soll = v_soll;
p.t = t;
opt = bvpset('Stats','on');
sol0 = bvpinit(linspace(p.ta,p.tf,30),[p.x0; zeros(3,1)]);
sol = bvp4c(@kano_gl,@null,sol0,opt,p);
%plot(sol.x, sol.y(2,:)) % ------------------------------------------------------------------------- end
% Funktion gibt die Randbedingungen in Residuenform an function res = null(X0,Xf,p) % -------------------------------------------------------------------------
x0 = X0(1:3);
xf = Xf(1:3);
adjf = Xf(4:6);
res = [ x0 - p.x0;
adjf - p.S*(xf - p.xf)];
% ------------------------------------------------------------------------- end
%plot(sol.x, sol.y(2,:)) % Funktion erzeugt eine Parameter-struct function p = auto_param
% -------------------------------------------------------------------------
% Funktion beinhaltet die kanonischen Gleichungen function f = kano_gl(t,X,p)% Die Argumente der Funktion müssen t,X,p lauten, nicht X,u,p! % -------------------------------------------------------------------------
x = X(1:3);
adj = X(4:6);
u = u_opt(x,adj,p); % --> Siehe Funktion unten!
f = [fsys(x,u,p);
-dJdx(x,u,p,t)-dfdx'*adj];
% ------------------------------------------------------------------------- end
% Funktion beinhaltet die Systemdynamik function g = fsys(x,u,p) % -------------------------------------------------------------------------
g = [x(2);
x(3);
u];
% ------------------------------------------------------------------------- end
% Jacobimatrix der Systemdynamik function J = dfdx
% -------------------------------------------------------------------------
J = [0,1,0;
0,0,1;
0,0,0];
% ------------------------------------------------------------------------- end
% Ableitung des Gütefunktionals function z = dJdx(x,u,p,t) % -------------------------------------------------------------------------
v_act = interp1(p.t, p.v_soll, t);
z = [0;
p.alpha*(x(2)- v_act); % <-- Das hier wird Probleme machen, da p.v_soll ein Vektor ist. Hier brauchst du nur den aktuellen Sollwert zum Zeitpunkt t!
p.beta*x(3)];
% ------------------------------------------------------------------------- end
% Berechnung der optimale Steuerung function u = u_opt(x,adj,p) % -------------------------------------------------------------------------
u = - adj(3)/(2*p.gamma); % Berechne hier die optimale Steuerung (siehe Kapitel 5.3.4 MOOS-Skript)
% Dieser Teil wird benötigt, falls die Eingangsgröße beschränkt ist! % if (u0 > p.umin) && (u0 < p.umax) % u = u0; % elseif u0<=p.umin % u = p.umin; % else % u = p.umax; % end; % ------------------------------------------------------------------------- end
das bedeutet, dass du p verwenden willst, bevor es definiert wurde.
Da ich nicht weiß, was du erreichen willst, kann ich nur raten, was eine Lösung angeht: Vielleicht sollte auto_param eine Funktion sein, in die eine Grundstruktur übergeben wird? Sollte der Aufruf von auto_param zudem auch in die Schleife rein?
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.