Mit fminsearch Parameter einer komplexen Funktion finden
Tschraud
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.09.2014, 18:37
Titel: Mit fminsearch Parameter einer komplexen Funktion finden
Hallo,
ich habe mir vor ein paar Wochen hier schon einmal Hilfe geholt um eine Funktion an Datenpunkte zu approximieren.
Mir wurde damals mit diesem Code geholfen, und es funktioniert auch sehr gut.
% ----- OPTIMIERUNG ----- %
par0 = [b,a]; % Startwerte für C01 und C10 müssen festgelegt sein
par_fit = fminsearch(@objFun, par0);
function e = objFun(par)
yfitted = fit_function(x, par);
e = sum((yfitted-y).^2); % minimiere Abstandsquadrat zwischen Fit und Messung y end
% ERGEBNISSE DARSTELLEN figure(2);
plot(x,y,'k')% Verrauschte Daten hold on
plot(x,fit_function(x,par_fit),'r')% Fit grid on
xlabel('Streckung');
ylabel('Spannung [MPa]') legend('Datenpunkte','Approximierte Funktion')
par;
par_fit;
Die Parameter g1,g2,g3 und a sollen über fminsearch so bestimmt werden, das sich die Werte für spannung an gegebene Werte approximieren.
Leider ist mir jetzt nicht klar, wie ich den unteren Code richtig in den oberen einbaue, damit mir die richtigen Werte ausgegeben werden.
Ich hoffe mein Problem ist klar geworden und Ihr könnt mir helfen, ansonsten bin ich für Rückfragen gerne offen.
Viele Grüße
Tschraud
tschraud
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.10.2014, 14:08
Titel:
oder hat jemand vielleicht eine andere Idee oder Vorschlag wie ich die Parameter bestimmen kann??
ich würde dringend von Code abraten, der nested functions und local functions bunt mischt. Da ist es kein Wunder, wenn man sich schwer tut, das zu modifizieren.
danke für die Antwort. Ich hab mich an deinen Rat gehalten und meinen Code so geändert das er jetzt mit lsqcurvefit funktioniert. Bei den einfachen Funktionen war das kein Problem, allerdings funktioniert die Intergralfunktion leider noch nicht.
Wenn ich den Code ausführe bekomme ich die Fehlermeldung
Error using feval
Output argument "F" (and maybe others) not assigned during call to "C:\Users\Documents\MATLAB\BA\myfun.m>myfun".
Ich schätze mal, dass das kein großes Ding ist, aber bin noch ziemlicher Anfänger deswegen entschuldigt die Frage.
wird das richtige myfun aufgerufen (aus dem Verzeichnis BA)? Ist myfun.m abgespeichert? Ansonsten sehe ich zunächst keinen Grund für die Fehlermeldung.
Hinsichtlich Geschwindigkeit dürfte es besser sein, cumtrapz auf den gesamten Vektor anzuwenden als wiederholt trapz auf Teile davon.
Falls es dann noch nicht funktioniert, bitte ein reproduzierbares Beispiel.
Grüße,
Harald
Tschraud
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.10.2014, 17:18
Titel:
Hallo Harald,
vielen Dank für deine Hilfe. Du hattest Recht, es hätte so funktionieren müssen, war ein dummer fehler meinerseits. Hab außerdem cumtrapz eingebaut, was die Geschwindigkeit extrem verbessert hat.
Viele Grüße
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.