goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

Mathematik am Computer

Studierende:
Entwicklung und Erprobung von "Systemen unter Verwendung mechanischer Fremdenergie"
Antriebs- und Fahrwerktechnik
ZF Friedrichshafen AG - Friedrichshafen

Praktikum Leistungselektronik
Energieversorgung
SMA Solar Technology AG - Niestetal

Ermitteln von Kraftstoffverbrauchspotential im 6-Gang EcoLife Stufenautomat
Antriebs- und Fahrwerktechnik
ZF Friedrichshafen AG - Friedrichshafen

Praktikum Algorithmen für Batteriespeicher in Energiemanagement-Systemen
Elektrotechnik / Automatisierungstechnik
SMA Solar Technology AG - Niestetal

Abschlussarbeit: Diagnose Ansätze für Zukunftsweisende SCR-Technologie (Selektive katalytische Reduktion)
Fahrzeugtechnik
MBtech Group GmbH & Co. KGaA - Fellbach-Schmiden

weitere Angebote

Partner:




Vermarktungspartner


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, 19: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: 5343
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ---
     Beitrag Verfasst am: 31.01.2012, 00: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, 09: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, 10: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: 5343
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ---
     Beitrag Verfasst am: 31.01.2012, 22: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, 23: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: 5343
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ---
     Beitrag Verfasst am: 01.02.2012, 00: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



Options and Permissions
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.