WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

bvp4c mehrmals ausführen

 

mway

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 18:20     Titel: bvp4c mehrmals ausführen
  Antworten mit Zitat      
Hallp Leute,

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.

Gruß

mway


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.01.2012, 23:41     Titel:
  Antworten mit Zitat      
Hallo,

dazu kannst du eine for-Schleife verwenden. In der einfachsten Form:

Code:
y = zeros(size(x));
for I = 1:length(x)
y(I) = ... % Berechnungen in Abhängigkeit von x(I)
end


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
Private Nachricht senden Benutzer-Profile anzeigen
 
mway

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 08:48     Titel:
  Antworten mit Zitat      
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:
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);

parameter1 = [0 45 ];
parameter2 = [45 80 ];
parameter3 = [0 32 ];
parameter4 = [32 0 ];

for i = 1:2
p.ta = parameter1(i);
p.tf = parameter2(i);
p.va = parameter3(i);
p.vf = parameter4(i);
erg = sol;
savefile = ['erg', num2str(1:2), '.mat'];
save(savefile, 'erg');
end;
% savefile = 'test.mat';
% save(savefile, 'sol', 'p');

%plot(sol.x, sol.y(2,Smile)
% -------------------------------------------------------------------------
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,Smile)
% Funktion erzeugt eine Parameter-struct
function p = auto_param
% -------------------------------------------------------------------------



% p.va = 0;
% p.vf = 32;
% p.ta = 0;
% p.tf = 45;
p.x0 = [0;p.va;0];
p.xf = [0;p.vf;0]; % über Beschleunigung au nomal nachdenken, nicht immer 0
p.alpha= 50;
p.beta = 20;
p.gamma = 10;
p.S = diag([0,10,5]);
%p.umin = -inf; % Eingangsbeschränkung
%p.umax = +inf; % Eingangsbeschränkung
% % -------------------------------------------------------------------------
end


% 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: ---
     Beitrag Verfasst am: 31.01.2012, 09:18     Titel:
  Antworten mit Zitat      
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);

parameter1 = [0 45 ];
parameter2 = [45 80 ];
parameter3 = [0 32 ];
parameter4 = [32 0 ];

 for i = 1:2  
    p.ta = parameter1(i);
    p.tf = parameter2(i);
    p.va = parameter3(i);
    p.vf = parameter4(i);
    erg = sol;
    savefile = ['erg', num2str(i), '.mat'];
    save(savefile, 'erg');
 end;
% savefile = 'test.mat';
% save(savefile, 'sol', '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
% -------------------------------------------------------------------------



% p.va = 0;
% p.vf = 32;
% p.ta = 0;
% p.tf = 45;
p.x0 = [0;p.va;0];
p.xf = [0;p.vf;0]; % über Beschleunigung au nomal nachdenken, nicht immer 0
p.alpha= 50;
p.beta = 20;
p.gamma = 10;
p.S = diag([0,10,5]);
%p.umin = -inf;  % Eingangsbeschränkung
%p.umax = +inf;  % Eingangsbeschränkung
% % -------------------------------------------------------------------------
 end


% 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
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.01.2012, 21:54     Titel:
  Antworten mit Zitat      
Hallo,

und wo liegt nun das Problem? Gibt es Fehler? Welche? Macht der Code nicht, was er soll? Inwiefern?

Auf den ersten Blick würde ich sagen, dass du den Aufruf von bvp4c in die for-Schleife hineinziehen musst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
mway

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 22:04     Titel:
  Antworten mit Zitat      
Hallo,

der Fehler kommt beim ausführen:

??? Undefined function or variable "p".

Error in ==> guetetest>auto_param at 55
p.x0 = [0;p.va;0];

Error in ==> guetetest at 4
p = auto_param;
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.01.2012, 23:42     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.