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".
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.
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
% 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 --------------------------------%
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
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
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.