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

Programm mit parfor beschleunigen?

 

SeeSharp
Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2011, 12:39     Titel: Programm mit parfor beschleunigen?
  Antworten mit Zitat      
Hallo!

Ich habe mir ein Matlab-Programm geschrieben, dass für verschiedene Parameter eine selbst geschriebene Identifikation ausführt, welche eine Übertragungsfunktion zurückliefert.
Mit dieser wird dann eine Simulation mit einem Simulink-File durchgeführt. Die Daten aus der Simulation werden mit den Messdaten verglichen und werden entsprechend bewertet. Die 2 Bewertungen werden dann in ein (Mehrdim.)-Array abgespeichert.
Das Array beinhaltet, konkret die drei verschiedenen Parameter und eben 2 Felder für die Bewertung.
Das ganze hängt dann im Moment noch in einer for-schleife. Da ich jetzt doch schon ca. 30.000 bzw. vielleicht 100.000 verschiedene Parametersätze habe, könnte da vielleicht parfor was bringen?

Hier mal der Code-Ausschnitt:
Code:

param = zeros(len,5); % [ende,q,downsample,errEndwert,Fehlernorm]

for k=1:length(ende)
    param(1+(k-1)*lenEndwert:lenEndwert+(k-1)*lenEndwert,1) = ende(k);
    for l=1:lenDs
        index2 = 1+(k-1)*lenEndwert+(l-1)*lenQ;
        param(index2:index2+lenQ-1,2) = q;
        param(index2:index2+lenQ-1,3) = downsample(l);
    end
end

for k=1:len
   
    disp('Simulation-Nummer:');
    k
   
    [G_ident] = idnetFcn(y1,y2,param(k,3),param(k,2),start,param(k,1),Ta,m,n,offsetU,offsetOmega,rek);
   
    % falls G_ident NaN
    [num,den] = tfdata(G_ident,'v');
   
    if (isnan(num))
        G_ident = Gz*10;
    end;
    if (isnan(den))
        G_ident = Gz*10;
    end;

    % Rücktransformation in den s-Bereich
    Gs_idnet = d2c(G_ident,'zoh');
    [num,den] = tfdata(Gs_idnet,'v');
    Gs_idnet = tf(num(end),den);

    Gz_ident = c2d(Gs_idnet,Ta,'zoh');
    downsample = 1; % für Modell setzen, da Ta=Ta*downsample

    sim('compare.mdl');

 
    errEndwert=abs(mean(y_ident((end-200):end,2))-meanYsim)+abs( y_ident(end)-ysim(end) );
    param(k,4) = errEndwert;
    errNorm =(ysim(index:end-240) - y_ident(index:end-240,2)).^2; % nur Schwingverhalten
    errNorm = sum(sqrt(errNorm))/lenNorm2;
    param(k,5) = errNorm;
end

 


Jetzt bringt er mir 2 Meldungen und zwar in der Zeile wo ich meine Funktion: idnetFcn aufrufe bezüglich des param-Array:
"In a PARFOR loop, variable 'param' is indexed in different ways, potentially causing dependencies between iterations. "
Und in der Zeilen wo ich errEnd = zuweise die Meldung:
"variable 'ysim' is indexed but not sliced in a parfor loop. This might result in unnecessary communications overhead." Für ysim und y_ident.
ysim ändert sich nie, sind die messdaten und y_ident sind die daten die ich aus der Simulink-Simulation bekomme.

Falls es möglich ist bzw. was bringt auf parfor umzustellen, wäre ich um Hilfe sehr dankbar (sind leider meine ersten Gehversuche mit parfor).

MFG
SeeSharp
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.06.2011, 17:33     Titel:
  Antworten mit Zitat      
Hallo,

um sagen zu können, ob parfor was bringt, ist zunächst mal die Frage: was für eine Hardware verwendest du, besonderes wieviele Rechenkerne?
Hast du gar Zugang zu einem Rechencluster?

Idealerweise lastet parfor in einem MATLAB Pool die Rechenkerne optimal aus und reduziert so die Rechenzeit spürbar. Jedoch wirst du auf Dualcore kaum mehr als Faktor 2 und auf Quadcore kaum mehr als Faktor 4 erreichen. Es ist also auch die Frage, was du mit diesen Daten anfangen willst. Wenn es um das Finden der bestmöglichen Parameterkombination geht, sollte man das evtl. als Optimierungsproblem behandeln.

Mehr Informationen zu parfor findest du unter folgenden Links - und natürlich in der Doku zu parfor:
http://www.mathworks.de/products/parallel-computing/demos.html
http://www.mathworks.de/products/pa.....-computing/tutorials.html

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2011, 19:19     Titel:
  Antworten mit Zitat      
Hallo!

Danke für die Antwort, ja ich hätte einen Quadcore zur Verfügung, und wenn ich den Faktor vier schaffen könnte, dann wäre ich schon sehr zufrieden damit.
Wenn mir jemand bezüglich der Fehler helfen kann, dann wäre das toll, dann probiere ich es einfach aus.

@Optimierungsproblem, bin gern für Vorschläge offen

MFG
SeeSharp
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

100000 Simulationen dürften so oder so beträchtliche Zeit brauchen.
Mein Vorschlag wäre, das ganze mal mit 100 oder 1000 Simulationen zu probieren.

Ersetze mal params ( :, i ) durch jeweils durch eigene Variablen, dann sollte es gehen.

Um zu entscheiden, ob ein Optimierungsproblem sinnvoll ist, musst du erst mal sagen, was du genau vor hast.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2011, 19:49     Titel:
  Antworten mit Zitat      
Abend!

Ich hätte es jetzt mal so probiert:

Code:

ndexEndwert = length(ysim) - 200;
indexFehler = length(ysim) -240;

ysimErr = ysim(index:indexFehler);

lenSim = length(ysim);
y_ident = zeros(1223,2);

tic
matlabpool(2)
len = 10;

temp1 = ones(len,1);
temp2 = ones(len,1);
temp3 = ones(len,1);
temp4 = ones(len,1);

parfor k=1:len
   
    disp('Simulation-Nummer:');
    k
   
%     q_loop =  param(k,2);
%     ds_loop = param(k,3);
%     ende_loop = param(k,1);
    q_loop =  temp1(k);
    ds_loop = temp2(k);
    ende_loop = temp3(k);

   
    [G_ident] = idnetFcn(y1,y2,ds_loop,q_loop,start,ende_loop,Ta,m,n,offsetU,offsetOmega,rek);
    %[G_ident] = idnetFcn(y1,y2,param(k,3),param(k,2),start,param(k,1),Ta,m,n,offsetU,offsetOmega,rek);
    %idnetFcn(u_data,y_data,downsample,q,start,ende,Ta,m,n,offsetU,offsetOm
    %ega,rek)
    % falls G_ident NaN
    [num,den] = tfdata(G_ident,'v');
   
    if (isnan(num))
        G_ident = Gz*10;
    end;
    if (isnan(den))
        G_ident = Gz*10;
    end;

    % Rücktransformation in den s-Bereich
    Gs_idnet = d2c(G_ident,'zoh');
    [num,den] = tfdata(Gs_idnet,'v');
    Gs_idnet = tf(num(end),den);

    Gz_ident = c2d(Gs_idnet,Ta,'zoh');
    downsample = 1; % für Modell setzen, da Ta=Ta*downsample
   
    y_identifed = parsim('compare.mdl',tsim);

    %errEndwert=mean(y_ident((end-200):end,2))-mean(ysim((end-200):end));
    errEndwert=abs(mean(y_identifed((indexEndwert):lenSim,2))-meanYsim)+abs( y_identifed(end)-ysimEnde );
    %param(k,4) = errEndwert;
    temp4(k) = errEndwert;
    %errNorm =(ysim(index:end) - y_ident(index:end,2)).^2; %bis Ende
    errNorm =(ysimErr - y_ident(index:indexFehler,2)).^2; % nur Schwingverhalten
    %errNorm = sum(sqrt(errNorm))/length(ysim(index:end));
    errNorm = sum(sqrt(errNorm))/lenNorm2;
    %errNorm = sum(sqrt(errNorm))/10;
    param(k,5) = errNorm;
end
toc
matlabpool close

 



Code:

function x = parsim(modelname,k)
% value = [10:10:40]
% Variable = value(k)
sim(modelname,k);
x = y_ident(:,2);
end
 


leider kennt er dann in der Funktion parsim
die Übertragungsfunktion Gz_ident etc. nicht Sad
Weiß jemand wie ich das übergeben kann? Es geht einzeln schon, aber in der parfor-loop dann eben nicht Sad



l@Harald
Also im Prinzip möchte ich folgendes machen:
Ich habe Messdaten von einem Labormodell und ein selbstgeschriebenes Least quares Verfahren zum identifizieren, dem ich eben verschiedene Parameter mit geben kann, konkret die Messdaten, eine Vergessensfaktor und noch ein Downsampling (um den Einfluss des Rauschens zu minimieren), welches mir eine Übertragungsfunktion meines Modells liefert

Jetzt probiere ich verschiedene Parameter durch und überprüfe die "Güte" der identifizierten Übertragungsfunktion in dem ich damit eine Simulink-Simulation mit den selben Inputs wie am Labormodell mache und dann die Messdaten mit den Simulierten Daten vergleiche
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Warum kopierst du die 2 Zeilen nicht einfach in den Hauptcode?

Zitat:
Ich habe Messdaten von einem Labormodell und ein selbstgeschriebenes Least quares Verfahren zum identifizieren, dem ich eben verschiedene Parameter mit geben kann, konkret die Messdaten, eine Vergessensfaktor und noch ein Downsampling (um den Einfluss des Rauschens zu minimieren), welches mir eine Übertragungsfunktion meines Modells liefert
Jetzt probiere ich verschiedene Parameter durch und überprüfe die "Güte" der identifizierten Übertragungsfunktion in dem ich damit eine Simulink-Simulation mit den selben Inputs wie am Labormodell mache und dann die Messdaten mit den Simulierten Daten vergleiche

Warum überlässt du das "Durchprobieren" nicht einer Optimierungsroutine, wie z.B. fminunc oder fmincon?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2011, 21:48     Titel:
  Antworten mit Zitat      
Sorry aber ich weiß nicht wirklich was es mir bringen soll.
Ich habe ja nur Messdaten!
D.h. ich habe keine Funktion auf die ich hinoptimieren kann!

Sprich erst mein Algorithmus liefert mir eine Übertragungsfunktion

@all
Wenn vielleicht jemand Erfahrung mit der sim-Befehl in parfor hat sprich wie ich dem die Variablen übergeben kann. das würde mich schon weiter bringen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2011, 09:58     Titel:
  Antworten mit Zitat      
Hallo,

Was es dir, wenn ich die Situation richtig verstanden habe, bringt:
anstatt in einer for-Schleife "blind" verschiedene Parametersätze zu testen, systematisch nach den besten Parametern zu suchen. Die Zielfunktion ist genau die von dir beschriebene Gütefunktion.

Was spricht gegen das Übernehmen der Codezeilen in den Hauptteil des Codes? Mich würde wundern, wenn das mit einer "normalen" for-Schleife funktioniert. Was genau meinst du mit "Es geht einzeln schon"?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 10:39     Titel:
  Antworten mit Zitat      
Ok, die Gütefunktion setzt sich halt so zusammen, dass ich einfach die Messdaten mit den Werten aus der Simulation also mit der identifizierten Übertragungsunkftion vergleiche und einfach die Differenz bezüglich der einzelnen Messpunkte bilde und summiere.
Von daher ist das kein wirlich es Gütefunktional.

Ich muss gestehen ich verstehe auch nicht ganz was ich genau in der Hauptteil übernehmen soll Sad . Irgendwie reden wir aneinander vorbei.

Wenn ich die Simulation ohne Schleife teste geht es super, wenn ich die Simulation dann in die parfor-Schleife hänge. Kommt eben der Fehler Sad.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2011, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

wieso ist es kein Gütefunktional? Du willst doch den Fehler klein bekommen, und das in Abhängigkeit der Parameter? Anders gesagt, du willst den Fehler bzw. die Summe der Fehler minimieren.

Statt der Zeile
Code:
y_identifed = parsim('compare.mdl',tsim);

die beiden Zeilen
Code:
sim('compare.mdl',tsim);
y_identifed = y_ident(:,2);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 11:10     Titel:
  Antworten mit Zitat      
stimmt, weiters habe ich aber noch ein zweiteres kriterium, nämlich, dass der endwert halbwegs passt (von 10 - Ende).
Von 5.5 -10 wird die Dynamik bewertet.
siehe Image im Anhang

da sich ja die identifizierte Übertragungsfunktion in jedem Schleifendurchlauf ändert, wird ja die Simulation mit dieser auch immer ein anderes y_identifed geben, wenn ich das nicht in der Schleife habe , ändert sich das ja nicht mehr?!

Vergleich.png
 Beschreibung:

Download
 Dateiname:  Vergleich.png
 Dateigröße:  10.53 KB
 Heruntergeladen:  674 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2011, 11:39     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
stimmt, weiters habe ich aber noch ein zweiteres kriterium, nämlich, dass der endwert halbwegs passt (von 10 - Ende).
Von 5.5 -10 wird die Dynamik bewertet.

Das lässt sich ja in die Zielfunktion einbauen - genauso, wie du es momentan auch machst.

Zitat:
da sich ja die identifizierte Übertragungsfunktion in jedem Schleifendurchlauf ändert, wird ja die Simulation mit dieser auch immer ein anderes y_identifed geben, wenn ich das nicht in der Schleife habe , ändert sich das ja nicht mehr?!

Es wird doch nach wie vor in der par(for)-Schleife abgearbeitet.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 12:17     Titel:
  Antworten mit Zitat      
Tud mir leid, Harald kannst mal schnell so einen Art Pseudo-Code schreiben wie du das genau meinst?
brauchen eh nur die wichtigsten Funktionen drinnen sein, keine Details
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2011, 12:54     Titel:
  Antworten mit Zitat      
Liegt das Problem beim ersten oder beim zweiten Teil?
Private Nachricht senden Benutzer-Profile anzeigen
 
SeeSharp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 18.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 13:13     Titel:
  Antworten mit Zitat      
eher im zweiten Teil aber kannst du nicht ca. so was mal schnell schreiben?

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.