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

Mit fminsearch Parameter einer komplexen Funktion finden

 

Tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2014, 18:37     Titel: Mit fminsearch Parameter einer komplexen Funktion finden
  Antworten mit Zitat      
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.


Code:
function mooney(lambda,spannung,par,a,b)


global par_fit;
x=lambda;
y=spannung;


% ----- 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;

end

%% ----- FIT-FUNKTION ------ %
function yfitted = fit_function(x, par)
% f(x)= (x²-1/x^4)*(2*C01+2*x²*C10)
    C01 = par(1);
    C10 = par(2);
   yfitted = (x.^2-1./x.^4).*(2*C01+2*x.^2*C10);
end
 



Nun habe ich das Problem, das eine komplexere Funktion zum approximieren genutzt werden soll.


Code:
for i=(1:1:handles.m)
    x=handles.sigma(i,1);
   lambda=handles.sigma(i,3);
    n=i-1;
    if n==0
      lambda2=1;  
    else  
    lambda2=handles.sigma(n,3);
     end
   
    f(i,1)=(g1/0.1+g2/0.05+g3/10)*1/(a^(2*x)+(1-a)^x)*(lambda)^2/(lambda2)^2
   
 z=f(1:i,1);
 
spannung(i,1)= trapz(z)/i;
 

end


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: ---
     Beitrag Verfasst am: 08.10.2014, 14:08     Titel:
  Antworten mit Zitat      
oder hat jemand vielleicht eine andere Idee oder Vorschlag wie ich die Parameter bestimmen kann??


Grüße
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.10.2014, 19:57     Titel:
  Antworten mit Zitat      
Hallo,

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.

Wenn die entsprechenden Toolboxen zur Verfügung stehen, würde ich lsqcurvefit bzw. nlinfit empfehlen. Ansonsten siehe z.B. hier
http://www.gomatlab.de/uebergabe-v-.....highlight,fminsearch.html

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2014, 14:31     Titel:
  Antworten mit Zitat      
Hallo,

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.

Mein bisheriger Code für die Integralfunktion
Code:

     xdata=handles.sigma(:,3);
     ydata=handles.sigma(:,2);
     m=handles.m;
     [x,resnorm] = lsqcurvefit(@myfun,[0.3744, 0.306,-0.86,-0.1167],xdata,ydata);  
 


mit der function
Code:

function F=myfun(m,x,epsilon,xdata)

for k=(1:1:m)
    z=epsilon(k,1);
   
    lambda=xdata(k,1);
    n=k-1;
    if n==0
      lambda2=1;  
    else  
    lambda2=xdata(n,1);
     end
   
    f(k,1)=(x(1)/0.865964+x(2)/0.153993+x(3)/1)*1/(x(4)^(2*z)+(1-x(4))^z)*(lambda)^2/(lambda2)^2;
    t=f(1:k,1);
 F(k)= trapz(t)*k;
 
 
 
end
 


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.

Viele Grüße
Tschraud
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.10.2014, 15:50     Titel:
  Antworten mit Zitat      
Hallo,

wird das richtige myfun aufgerufen (aus dem Verzeichnis BA)? Ist myfun.m abgespeichert? Ansonsten sehe ich zunächst keinen Grund für die Fehlermeldung.

Allerdings muss die Funktion die Form
Code:
function F = myfun(x,xdata)

haben. Wenn sie das nicht hat, siehe die Tipps unter
http://www.mathworks.de/de/help/opt.....ing-extra-parameters.html

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2014, 17:18     Titel:
  Antworten mit Zitat      
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
 
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.