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

Workspace Daten in Funktion nutzen

 

Maschi87
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 16.12.2013, 17:32     Titel: Workspace Daten in Funktion nutzen
  Antworten mit Zitat      
Hi,

ich würde gerne den Code, den ich für eine Optimierung nutze verbessern.
Für die Optimierung nutze ich den folgenden Code (in Auszügen):

Code:


% Deklarieren des Zählers, der Daten und des Vektors zur Speicherung der Individuen
zaehler = 0;
Parameter = [];
data = load('Inhalt.mat');

% Start der Optimierung
[x fval exitflag output population] = ga(@optimierung_kl_fehler_q_magic,n,[],[],[],[],lb,ub,[],options);


Mit dem Zähler speichere ich die Anzahl der Aufrufe der Funktion "optimierung_kl_fehler_q_magic".
Diese wird durch die Optimierung mehrer tausend male aufgerufen.
Im Vektor Parameter werden jeweils die Individuen der Optimierung gespeichert.
Dies geschieht über den Code in der Funktion "optimierung_kl_fehler_q_magic".

Code:
Daten = evalin('base', 'data');

% Zaehler um die Anzahl der Datenaufrufe zu Zählen und alle
% Individuen zu speichern
zaehler = evalin('base', 'zaehler');

Parameter_alt = evalin('base', 'Parameter');
Parameter_neu = [X(1),X(2),X(3),X(4)];
Parameter = [Parameter_alt; Parameter_neu];
assignin('base', 'Parameter', Parameter);

zaehler = zaehler + 1;
assignin('base', 'zaehler', zaehler);


Nun bin ich aber mehrfach über hinweise gestolpert, das evalin und assignin nicht die beste Lösung seien.
Hat also jemand eine Idee, wie ich das anders lösen kann?
Mein Problem ist, dass durch die Optimierung der Aufruf der Funktion "optimierung_kl_fehler_q_magic" so erfolgen muss und die Funktion als Eingangswerte auch nur die zu variierenden Parameter und als Rückgabewert nur einen Wert, der die Qualität der Parameter bezogen aus das Optimierungsproblem wieder gibt, zurück geben darf.

Bin für alle Anregungen dankbar, da die ganze Lösung bei Matlab 2013b auf einmal nicht mehr funktioniert (siehe: http://www.gomatlab.de/befehl-evali.....matlab-2013b-t31609.html)

Danke und Gruß,
Bene
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 16.12.2013, 18:42     Titel:
  Antworten mit Zitat      
Hallo,

vor Kurzen hatte ich eine vergleichbare Situation, als ich die Lage der Kontrollpunkte für eine Bezierkurve optimiert habe. Ich habe daraus mal ein Beispiel gebaut, das du vermutlich direkt umschreiben kannst. Der Clue an der Geschichte ist eine nested function, die optimiert wird. Dieser Funktion übergibt man dann nur die Parameter p, die optimiert werden sollen, alles andere muss an die äußere Funktion 'optimiere_irgendwas()' übergeben worden sein.
In 'fit_function()' kann dann alles mögliche stehen, was mit den parametern in p gemacht werden soll. Beispielsweise wird hier einfach das Polynom, das in p versteckt ist, ausgewertet, bei mir wurden noch Bezierkurven gebaut. (Wenn man da aber nicht mehr das polyval-Gedöns nimmt, macht der Plot natürlich nicht mehr so viel Sinn.)

Code:
function main
% wir wollen etwas lesen
verbose = 1;

% wir optimieren irgendwas, hier: ein gestoertes polynom
x = sort(rand(20,1));
p_original = [1.5, 3, 2, 1];
y = polyval(p_original,x) + rand(size(x))-0.5;

% optimiere auf polynom vom Grad 3
order = 3;  

% natuerlich macht man das so, aber das wollen wir hier mal nicht tun.
p_polyfit = polyfit(x,y,order);

% Sondern wir wollen das mit unserem Optimierer lösen lassen
pfit = optimiere_irgendwas(x, y, order, verbose);


% Was passiert?
figure
plot(x,polyval(p_original,x),'k-')
hold on
plot(x,y,'ko')
plot(x,polyval(p_polyfit,x),'rs-')
plot(x,fit_function(x,pfit),'go-')
legend('echtes Polynom','gestörtes Polynom','Lösung mit polyfit','Lösung mit Optimierer')
pfit
end



function pfit = optimiere_irgendwas(x,y, order, verbose)
% Wir legen der Einfachheit halbe einer Polynom oder Ordnung order durch x
% und y. Dafür brauchen wir order+1 Koeffizienten
p0 = ones(1,order+1); % wir raten: alle Koeffizienten sind 1

if verbose
    fprintf('optimize_irgendwas calling fminsearch(@objFun)\n');
end

% Wir uebergeben nur p0 an die zu optimierende Funktion objFun.
pfit = fminsearch(@objFun, p0);

% ------------------------- NESTED objFUN --------------------------------%
function e = objFun(p)
% Die Funktion objFun bekommt nur p als Parameter übergeben und liefert den
% Wert e zurück. e wird dabei minimiert, das kann least squares sein oder
% was auch immer man möchte.
% In dieser nested function leben auch x und y (und ebfennalls auch p0,
% verbose und order). Der Trick ist, yfitted aus diesen Werten zu
% berechnen, für bessere Übersicht in einer weiteren Funktion fit_function.
    yfitted = fit_function(x, p);
    e = sum((yfitted-y).^2);
%    e = sum(abs(yfitted-y)); % waere auch moeglich, was auch immer man moechte.    
end
% ------------------------- NESTED objFUN --------------------------------%

if verbose
    disp('pfit found')
end
end


function yfitted = fit_function(x, p)
% Wir wollen in diesem Beispiel ein Polynom fitten, ist p das Polynom, das
% an den Stellen x ausgewertet wird.
% Polynom
   yfitted = polyval(p,x);

% Oder hier kann auch irgendetwas seltsames stehen. Das versteckt man alles
% in dem p, das übergeben wurde.
%     A = p(1);
%     w = p(2);
%     f = p(3);  
%     yfitted = A*sin(2*pi*f*x + w) + p(4)*x.^3;

% oder irgendetwas exponentielles mit einer Gerade kombiniert....
%     yfitted = p(1)*exp(p(2)*x) + p(3)*x + p(4);
end
 


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maschi87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 13.01.2014, 13:26     Titel:
  Antworten mit Zitat      
Hi Nras,

vielen Dank für deinen Tipp. Mit der Nested Function läuft das ganze super und die Rechenzeit wurde sogar auch noch verkürzt.

Gruß,
Bene
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.